千家信息网

Nginx如何使用limit_req_zone对同一IP访问进行限流

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍Nginx如何使用limit_req_zone对同一IP访问进行限流,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!nginx可以使用ngx_http_limit
千家信息网最后更新 2026年11月03日Nginx如何使用limit_req_zone对同一IP访问进行限流

这篇文章主要介绍Nginx如何使用limit_req_zone对同一IP访问进行限流,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

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;~^(?P[0-9\.]+),?.*$$firstAddr;}## 针对原始用户 IP 地址做限制limit_req_zone $clientRealIp zone=one:10m rate=1r/s;

同理,我们可以用limit模块对网络爬虫进行限流。

http模块

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访问进行限流"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

处理 配置 两个 模块 空间 长度 用户 地址 字节 就是 队列 缓冲 原始 内容 后缀 客户 客户端 篇文章 延迟 测试 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云信互联网科技有限公司 新华互联网科技学校 科技互联网产品 齐家互联网科技 中国互联网科技发展 互联网科技的未来发展 互联网高科技股票 联恩商钥互联网科技有限公司 深圳前海聚择互联网科技有限公司 北京华百购互联网科技有限公司 互联网金融科技元年 广州千川互联网科技有限公司 黑云互联网科技有限公司 浙南科技城互联网大厦招聘 上海互联网科技公司ppt 下一代互联网重大应用科技园 江苏互联网科技小贷 互联网金融运营模式中的金融科技 广州三三互联网科技有限公司 北京军民互联网科技公司 青岛互联网科技公司 有木互联网科技 互联网 视角下的科技创新 明优互联网科技有限公司 互联网金融科技元年 梅州GM互联网络科技有限公司 扫呗互联网科技有限公司 新氧科技和美国互联网有关系吗 互联网时代高科技布局 互联网科技快速发展优美句子
0