Nginx + LUA下流量拦截算法

前言

每逢大促必压测,每逢大促必限流,这估计是电商人的常态。每次大促期间,业务流量是平时的几倍十几倍,大促期间大部分业务都会集中在购物车结算,必须限流,才能保证系统不宕机。

限流算法

限流算法一般有三种:令牌桶,漏桶,计数器。本文介绍最粗暴的计数器算法,其他算法请自行google、百度,讲的应该比我好。(能解决问题的算法都是好算法)

lua 限流

业务结构

在大促期间由于流量过高,现有服务器无法承受那么大的流量,租用云服务是很好的选择。

业务架构图可以看出 ,我们的服务器有自有服务器,首都在线云,金山云。自有服务器由于采购时间原因,每个批次的服务器性能不是很一致,首都在线云、金山云的服务器性能又有很大的差别,

lvs在权重设置上也有很大的不同,这对我们使用lua限流又造成了一定的困扰。当然这只是小问题,既然lvs只是权重,那么我们的lua限流也支持权重即可。

nginx+lua

使用nginx+lua的原因很简单,我们服务架构nginx+fastcgi+php,为了防止php进程被打满,我们只需要在nginx加一层限制,就可以简单粗暴的解决问题,而lua正好满足这个条件。业务场景的不同,我们选择的算法也不同,越是复杂的东西,越希望最简单话的解决方案。引入越多的东西,就会造成更多的不确定性。

话不多说上代


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

ngx.header.content_type = "text/html; charset=utf-8";

local method=ngx.req.get_method()

local curl=ngx.md5(ngx.var.request_uri);

local request_uri_without_args = ngx.re.sub(ngx.var.request_uri, "\\?.*""");

local match = string.match

local ngxmatch=ngx.re.match

--限流计数

function limit_url_check(key,s,m)

       local localkey=key;

       local yyy_limit=ngx.shared.url_limit

        --每分钟限制

        local key_m_limit=  localkey..os.date("%Y-%m-%d %H:%M", ngx.time()) 

            --每秒限制

        local key_s_limit=  localkey..os.date("%Y-%m-%d %H:%M:%S", ngx.time())

        local req_key,_=yyy_limit:get(localkey);

        local req_key_s,_=yyy_limit:get(key_s_limit);

        local req_key_m,_=yyy_limit:get(key_m_limit);

        --每秒处理

        if req_key_s then

                 yyy_limit:incr(key_s_limit,1)

                 if req_key_s>s then 

                    --return true 

               return false

                 end

       else

         yyy_limit:set(key_s_limit,1,60)

       end

        --每分钟处理

        if req_key_m then

                 yyy_limit:incr(key_m_limit,1)

                 if req_key_m>m then 

                    --return true

                    return false

                 end

        else

         yyy_limit:set(key_m_limit,1,85)

        end

        return false

end

代码很简单,但是很实用,看一下调用


1

2

3

4

5

6

7

if   ngx.re.match(request_uri_without_args,"/cart/inf(.*)") then

      if limit_url_check("appcartinfo",24,3200) then

          ngx.say(‘{"code": 524,"msg": "啊啊啊,每逢大促,排队结账。当前访问的用户过多,请稍后再试!","alert": "啊啊啊,每逢大促,排队结账。当前访问的用户过多,请稍后再试!"}‘)

          ngx.exit(200);

               return

      end

end

调用的代码秒,分钟的限制数可以放到cjson中配置。

原文地址:https://www.cnblogs.com/sessionbest/p/9074955.html

时间: 2024-11-09 12:09:43

Nginx + LUA下流量拦截算法的相关文章

nginx+lua访问流量实时上报kafka

在nginx这一层,接收到访问请求的时候,就把请求的流量上报发送给kafka storm才能去消费kafka中的实时的访问日志,然后去进行缓存热数据的统计 从lua脚本直接创建一个kafka producer,发送数据到kafka wget https://github.com/doujiang24/lua-resty-kafka/archive/master.zip yum install -y unzip unzip lua-resty-kafka-master.zip cp -rf /us

#研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案

郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档适用人员:技术人员 提纲: 所谓异常流量 如何识别异常流量 Apriori如何工作 如何让 Nginx 拦截可疑 IP 0x00,所谓异常流量 有害的异常流量大概分为以下几种: 僵尸网络中的节点对主站发起无目的的密集访问: 黑客.白帽子或某些安全公司为了做漏洞扫描,对主站各个 Web 工程发起字典式

简单版nginx lua 完成定向流量分发策略

本文链接:https://www.cnblogs.com/zhenghongxin/p/9131362.html 公司业务前端是使用 "分发层+应用层" 双层nginx架构,目的是为了提高缓存的命中率.最前端有个nginx分发层,底下是负载均衡集群. 为了提高缓存的命中率,需要nginx进行定向流量分发,简略代码如下: local uri_args = ngx.req.get_uri_args() local productId = uri_args["productId&q

使用nginx lua实现网站统计中的数据收集

使用nginx lua实现网站统计中的数据收集 导读 网站数据统计分析工具是各网站站长和运营人员经常使用的一种工具,常用的有 谷歌分析.百度统计和腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于javascript的.在此简要分析数据收集的原理,并按照步骤,带领大家一同搭建一个实际的数据收集系统. 数据收集原理分析 简单来说,网站统计分析工具需要收集到用户浏览目标网站的行为(如打开某网页.点击某按钮.将商品加入购物车等)及行为附加数据(如某下单

使用Nginx+Lua(OpenResty)开发高性能Web应用

在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开发主要是以C/C++模块的形式进行,整体学习和开发成本偏高:如果有一种简单的语言来实现Web应用的开发,那么Nginx绝对是把好的瑞士军刀:目前Nginx团队也开始意识到这个问题,开发了nginxScript:可以在Nginx中使用JavaScript进行动态配置一些变量和动态脚本执行:而目前市面上

nginx lua redis 访问频率限制(转)

1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的需求. Nginx处理请求的过程一共划分为11个阶段,分别是: post-read.server-rewrite.find-config.rewrite.post-rewrite. preaccess.access.post-access.try-files.content.log. 在openre

Nginx+Lua(OpenResty)开发高性能Web应用

使用Nginx+Lua(OpenResty)开发高性能Web应用 博客分类: 跟我学Nginx+Lua开发 架构 ngx_luaopenresty 在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开发主要是以C/C++模块的形式进行,整体学习和开发成本偏高:如果有一种简单的语言来实现Web应用的开发,那么Nginx绝对是把好的瑞士军刀:目前Ngin

nginx+lua实现简单的waf网页防火墙功能

Nginx+Lua实现WAF 参考地址:http://www.2cto.com/Article/201303/198425.html 2016年8月2日 安装LuaJIT http://luajit.org/download/LuaJIT-2.0.4.tar.gz tar xf LuaJIT-2.0.4.tar.gz cd LuaJIT-2.0.4 make && make install 即可 下载ngx_devel_kit https://codeload.github.com/sim

使用Nginx+Lua实现waf

使用Nginx+Lua实现waf 软件包需求: 1 .Nginx兼容性[最后测试到1.13.6] wget http://nginx.org/download/nginx-1.13.6.tar.gz 2 .PCRE为Nginx编译安装关系的依赖 wget https://jaist.dl.sourceforge.net/project/pcre/pcre/8.42/pcre-8.42.tar.gz 3 .下载luajit解释器和ngx_devel_kit以及lua-nginx-module模块