nginx可以使用ngx_http_limit_req_module模块的limit_req_zone指令进行限流访问,防止用户恶意攻击刷爆服务器。ngx_http_limit_req_module模块是nginx默认安装的,所以直接配置即可。
首先,在nginx.conf文件中的http模块下配置
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
说明:区域名称为one(自定义),占用空间大小为10m,平均处理的请求频率不能超过每秒一次。
$binary_remote_addr是$remote_addr(客户端IP)的二进制格式,固定占用4个字节(可能是C语言的long类型长度)。而$remote_addr按照字符串存储,占用7-15个字节。这样看来用$binary_remote_addr可以节省空间,但网上又说64位系统下都是占用64个字节,没搞清楚,总之尽量用$binary_remote_addr吧。
第二,在http模块的子模块server下面配置
location ~* .htm$ { limit_req zone=one burst=5 nodelay; proxy_pass http://backend_tomcat; }
我这里是对uri后缀为htm的请求限流,注意limit_req zone=one burst=5 nodelay;
其中zone=one和前面的定义对应。
burst这个网上都说峰值之类的,通过亲自试验发现这么说并不准确,应该叫缓冲队列的长度比较合适。
nodelay字面的意思是不延迟,具体说是对用户发起的请求不做延迟处理,而是立即处理。比如我上面定义的rate=1r/s,即每秒钟只处理1个请求。如果同一时刻有两个后缀为htm的请求过来了,若设置了nodelay,则会立刻处理这两个请求。若没设置nodelay,则会严格执行rate=1r/s的配置,即只处理一个请求,然后下一秒钟再处理另外一个请求。直观的看就是页面数据卡了,过了一秒后才加载出来。
真正对限流起作用的配置就是rate=1r/s和burst=5这两个配置。下面我们来分析一下具体案例。
某一时刻有两个请求同时到达nginx,其中一个被处理,另一个放到了缓冲队列里。虽然配置了nodelay导致第二个请求也被瞬间处理了,但还是占用了缓冲队列的一个长度,如果下一秒没有请求过来,这个占用burst一个长度的空间就会被释放,否则就只能继续占用着burst的空间,直到burst空间占用超过5之后,再来请求就会直接被nginx拒绝,返回503错误码。
可见,如果第二秒又来了两个请求,其中一个请求又占用了一个burst空间,第三秒、第四秒直到第五秒,每秒都有两个请求过来,虽然两个请求都被处理了(因为配置了nodelay),但其中一个请求仍然占用了一个burst长度,五秒后整个burst长度=5都被占用了。第六秒再过来两个请求,其中一个请求就被拒绝了。
这是我根据实际测试结果推论的,可能和真实的理论有所出入,但这样讲我觉得比较好理解。有清楚的朋友欢迎告知!
这里用到的$binary_remote_addr是在客户端和nginx之间没有代理层的情况。如果你在nginx之前配置了CDN,那么$binary_remote_addr的值就是CDN的IP地址。这样限流的话就不对了。需要获取到用户的真实IP进行限流。
简单说明如下:
## 这里取得原始用户的IP地址 map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^("htmlcode">limit_req_zone $anti_spider zone=anti_spider:10m rate=1r/s;server模块
location / { limit_req zone=anti_spider burst=2 nodelay; if ($http_user_agent ~* "spider|Googlebot") { set $anti_spider $http_user_agent; } }可以用curl -I -A "Baiduspider" www.remotejob.cn/notice.jsp 测试一下
以上这篇Nginx使用limit_req_zone对同一IP访问进行限流的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 群星.2023-非凡医者影视原声带【华纳】【FLAC分轨】
- 《寻找弗兰基》全成就一览
- 《传说法师2》EA评测:不是亲生的不心疼
- 《射戮骑士》评测:“幸存者!去杀穿硬核地狱!”
- 群星《名声(黑胶CD)》[WAV+CUE]
- 梅艳芳《女人花》SACD[原抓WAV+CUE]
- 孙露《因为想念》【WAV+CUE】
- 罗艺恒《What Could've Been》[FLAC/分轨][130.04MB]
- 罗熙楷《笼中鸟Caged Bird》[320K/MP3][72.27MB]
- 罗熙楷《笼中鸟Caged Bird》[FLAC/分轨][191.82MB]
- 英雄联盟s14晋级四强队伍是哪些 S14全球总决赛四强战队介绍
- 魔兽世界怀旧服专家模式什么时候开 怀旧服专家模式开启时间介绍
- 魔兽世界永久60级哪个职业最强 魔兽世界永久60级职业推荐
- 上海Major赛事专属版显示器首次亮相PNL高校决赛
- 寻找中国“龙” 感受乐元素的“科普力”