技术解析

关于 limit_req_zone 和 limit_req 的问题
0
2021-05-21 01:08:14
idczone

Nginx 的配置

http {
  ...
  limit_req_zone $binary_remo美国服务器te_addr zone=allips:10m rate=100r/s;
  ...
}

server {
  ...
  limit_req zone=allips nodelay;
  ...
}

这样配置我理解为每个 IP 每秒请求不超过 100 次,每秒请求大于 100 次直接返回 503

但是这样的配置我连 phpmyadmin 都打不开了

求助各路大神


需要配置 burst,否则在打开的一瞬间,rate 看起来是无穷大,就被拒了。


嗯,然后我试了
```
http {
...
limit_req_zone $binary_remote_addr zone=allips:10m rate=100r/s;
...
}
server {
...
limit_req zone=allips burst=1 nodelay;
...
}
```
也不行
我现在的配置是
```
http {
...
limit_req_zone $binary_remote_addr zone=allips:10m rate=50r/s;
...
}
server {
...
limit_req zone=allips burst=50 nodelay;
...
}
```
才能达到预期效果


看了一下 https://blog.csdn.net/hellow__world/article/details/78658041 这个资料,是不是可以这样理解
所有的请求先放在 burst 里,如果每秒的请求量大于 burst+rate 就丢弃


刚说错了
limit_req_zone 其实是设置空间的大小和 nginx 对单个 IP 的请求处理速度
limit_req 设置的是队列的大小
如果单个 IP 的每秒请求次数大于队列大小加上每秒限制的处理速度,超过的部分就会被拒绝

burst = 1 肯定不行,建议跟 rate 一致,设为 100。
NGINX 的时间戳精度只有 1ms,对于 1ms 之内的请求看起来频率都是无穷大,所以 burst 是必须要有的。这块可以参考令牌桶算法的实现原理来理解。


感谢,
还有一个问题想请教一下,关于 limit_req_zone zone size 的,
我看官方文档( http://nginx.org/en/docs/http/ngx_http_limit_req_module.html )说:“ If the zone storage is exhausted, the least recently used state is removed. Even if after that a new state cannot be created, the request is terminated with an error.”
看文档的这个意思貌似有点坑了,如果 10M 用完了,也无法删除历史记录的话,之后所有的请求全拒绝了。这时候只能管理员手动重启 Nginx 来解决这个问题吗?


刚刚看 https://www.sunzhongwei.com/limit-request-rate.html 这个文章上说 zone size 的意思是每秒开辟一个新的 zone,每秒超出的部分会被拒绝

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服