Nginx拦截算法

时间:2022-08-31 08:24:18

Nginx拦截算法

0x00.About

电商平台营销时候,经常会碰到的大流量问题,除了做流量分流处理,可能还要做用户黑白名单、信誉分析,进而根据用户ip信誉权重做相应的流量拦截、限制流量。

Nginx自身有的请求限制模块ngx_http_limit_req_module、流量限制模块ngx_stream_limit_conn_module基于令牌桶算法,可以方便的控制令牌速率,自定义调节限流,就能很好的限制请求数量,然而,nginx.conf问题还是在于无法热加载。

之前做过的流量限制方案,《Nginx+Lua+Redis访问频率控制》,原理是动态的基于ip,实现简单的漏桶算法,限制访问频率。

这里的话,就简单分析下流量限制算法:漏桶算法、令牌桶算法、滑动窗口等在Nginx+Lua中如何动态绑定uri,动态设定rate实现。

0x01.Leaky Bucket Algorithm

漏桶算法可以很好地限制容量池的大小,从而防止流量暴增。如果针对uri+ip作为监测的key,就可以实现定向的设定指定ip对指定uri容量大小,超出的请求做队列处理(队列处理要引入消息机制)或者丢弃处理。这也是v2ex对流量拦截的算法,针对uri+ip做流量监测。

Nginx拦截算法

漏桶算法实现上来说,就是建立一个队列,在Redis中以uri:ip作为key,队列上实现FIFO,在请求的前奏实现插入,请求完成后实现删除。

实现方法是在Nginx发送http数据给用户后,通过ngx.eof()关闭TCP协议,做其他操作,可以参见请求返回后继续执行

下面是部分代码:

local _M = { _VERSION = "2015.10.19", OK = 1, BUSY = 2, FORBIDDEN = 3 }

function _M.do_list(red, uri, key, size, rate)
local ok, err = red:expire(uri .. ":" .. key, size)
if not ok then
ngx.log(ngx.WARN, "redis set expire error: ", err)
return nil
end
local ok, err = red:rpush(uri .. ":" .. key, ngx.time())
if not ok then
ngx.log(ngx.WARN, "redis rpush error: ", err)
return nil
end
local res, err = red:lrange(uri .. ":" .. key, -(size * rate), -1)
if not ok then
ngx.log(ngx.WARN, "redis lrange error: ", err)
return nil
end
if #res < (size * rate) or res[#res] - res[1] < size then
return _M.OK
end
return nil
end

漏桶算法优点很明显,简单、高效,能恰当拦截容量外的暴力流量。

但缺点也明显,无法对流量做频率处理,比如桶size大小设置范围内,进行并发攻击依然能大流量并发效果,桶容量不可以过小,否则容易卡死正常用户。

0x02.Token Bucket Algorithm

令牌桶算法通过发放令牌,根据令牌的rate频率做请求频率限制,容量限制等。

Nginx拦截算法

  • 系统根据rate(r/s)频率参数向指定桶中添加token,满则保持,不添加

  • 当用户请求Nginx时候,分析uri是否需要限制流量,限制则执行令牌桶算法

  • 如果桶满了,则请求通过,消耗令牌一枚;如果请求Redis发现key不存在,则通过size装满令牌桶;如果桶内令牌空,则废弃或等待流量。

Nginx + Lua 模型中实现必然不能跑一个程序添加令牌了,这个时候需要在分析令牌时候,通过计算时间间隔一次性添加完令牌桶内令牌。具体算法是:rate * time_distance = token_count令牌数量, if token_count > size 桶容量, token_count = size。

实现的存储结构是用Hash哈希存储 uri:ip -> token_count,字段通过EXPIRE设定过期时间,达到长时间不访问清除桶数据效果。

桶的大小、请求的频率限制用Redis哈希表存储,不存在则默认不做流量拦截。

用户黑白名单通过Order SET设定信誉权重,权重越大,代表危险性越大,进而通过百分比改变接口限定rate频率。

令牌桶算法优势在于能针对uri做定向rate、size等,不仅限制总请求大小,还限制平均频率大小。缺点是,还是容易导致误判等问题,并切用户的信誉无法完全准确。

参考:

1.Token Bucket Algorithm

2.Token Bucket Algorithm

3.电商课题I:集群环境下业务限流

Nginx拦截算法的更多相关文章

  1. Nginx拦截指定国家的IP

    Nginx拦截指定国家的IP 一.下载GeoIP数据库 wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz wget h ...

  2. Nginx &plus; LUA下流量拦截算法

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

  3. nginx 拦截 swagger 登录

    随着微服务的也来越多,每个服务都有单独的文档,那么问题来了,怎么把所有文档整合在一起呢 本方法采用服务器拦截的方式进行处理 首先需要在opt 的主目录中 /opt/ 创建一个新文件 htpasswd此 ...

  4. &num;研发解决方案&num;基于Apriori算法的Nginx&plus;Lua&plus;ELK异常流量拦截方案

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  5. 基于Apriori算法的Nginx&plus;Lua&plus;ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  6. IPVS和Nginx两种WRR负载均衡算法详解

    动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了!    ...

  7. nginx应用总结(1)--基础认识和应用配置

    在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结. 一.nginx服务简介Nginx是一个高性能的HTTP和反向代理服务 ...

  8. nginx应用总结(1)-- 基础知识和应用配置梳理

    在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结. 一.nginx服务简介Nginx是一个高性能的HTTP和反向代理服务 ...

  9. nginx常用代理配置

    因为业务系统需求,需要对web服务作nginx代理,在不断的尝试过程中,简单总结了一下常见的nginx代理配置. 1. 最简反向代理配置 在http节点下,使用upstream配置服务地址,使用ser ...

随机推荐

  1. Linux 如何使用压缩与解压缩的方式将Windows下的zip压缩包上传到Linux系统

    当我们无法使用xftp方式上传文件到Linux系统时,我们可以使用在Windows下压缩文件夹,然后到Linux系统下解压缩的方式,完成整个上传工作. 第一步:在Windows系统下,将整个文件夹压缩 ...

  2. hdu 3038 How Many Answers Are Wrong(种类并查集)2009 Multi-University Training Contest 13

    了解了种类并查集,同时还知道了一个小技巧,这道题就比较容易了. 其实这是我碰到的第一道种类并查集,实在不会,只好看着别人的代码写.最后半懂不懂的写完了.然后又和别人的代码进行比较,还是不懂,但还是交了 ...

  3. 1&period;AJAX简介

    没有AJAX会怎么样?普通的ASP.Net每次执行服务端方法的时候都要刷新当前页面,比如实现显示服务器时间.每次都要刷新页面的坏处:页面刷新打断用户操作.速度慢.增加服务器的流量压力.如果没有AJAX ...

  4. foreman容器化部署

    一.前言 最近公司要求对一批GPU服务器安装操作系统,之前同事一直采用cobbler安装系统,一旦服务器设置为pxe优先启动,会出现重复安装系统的问题,并且如果线上服务器忘记修改第一启动项为硬盘启动, ...

  5. NOI&period;ac &num;8 小w、小j和小z LIS

    传送门 题意:在一个数轴上,给出$N$个人的初始位置与速度(速度有方向),求最大的时间使得存在$N-K$个人在这一段时间内两两没有相遇.$1 \leq K \leq N \leq 10^5$ 显然有二 ...

  6. 基于GTID环境的数据恢复

    下面说一个线上环境的数据恢复案例,线上环境误操作的事情,随时都有可能发生的,这时候运维DBA或者DBA会想,没人会傻到把数据库干掉的吧?又或者没有会闲得蛋痛删除了几条数据又想恢复这么无聊吧?适适这样的 ...

  7. XCache 一种快速可靠的PHP操作码缓存

    1,错误报告开启 错误报告是在PHP中一个非常有用的功能,应同时在开发阶段启用. 这可以帮助我们确定我们的代码中的问题. 最常用的功能是“E_ALL”,这有助于我们发现所有的警告和严重错误. 必须指出 ...

  8. Hibernate中一级缓存概念以及flush与clear的区别

    Hibernate采用缓存机制提高数据查询效率.缓存分为一级缓存和二级缓存,一级缓存在Session中存在,二级缓存需要手动配置. 在一级缓存中,如果数据保存到数据库中后,而session又没有关闭的 ...

  9. jmeter 网速

    有人知道在jmeter 哪个里面哦 JMeterPlugins里面 network

  10. leetCode&lpar;28&rpar;&colon;Contains Duplicate II

    Given an array of integers and an integer k, find out whether there there are two distinct indices i ...