关于 limit_req_zone 和 limit_req 的问题

2018-04-06 11:36:11 +08:00
 lisonfan

Nginx 的配置

http {
  ...
  limit_req_zone $binary_remote_addr zone=allips:10m rate=100r/s;
  ...
}

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

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

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

求助各路大神

2869 次点击
所在节点    NGINX
7 条回复
dndx
2018-04-06 13:52:31 +08:00
需要配置 burst,否则在打开的一瞬间,rate 看起来是无穷大,就被拒了。
lisonfan
2018-04-06 14:00:24 +08:00
@dndx #1
嗯,然后我试了
```
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;
...
}
```
才能达到预期效果
lisonfan
2018-04-06 14:21:57 +08:00
@dndx #1
看了一下 https://blog.csdn.net/hellow__world/article/details/78658041 这个资料,是不是可以这样理解
所有的请求先放在 burst 里,如果每秒的请求量大于 burst+rate 就丢弃
lisonfan
2018-04-06 14:41:05 +08:00
@dndx #1
刚说错了
limit_req_zone 其实是设置空间的大小和 nginx 对单个 IP 的请求处理速度
limit_req 设置的是队列的大小
如果单个 IP 的每秒请求次数大于队列大小加上每秒限制的处理速度,超过的部分就会被拒绝
dndx
2018-04-06 15:06:57 +08:00
burst = 1 肯定不行,建议跟 rate 一致,设为 100。

NGINX 的时间戳精度只有 1ms,对于 1ms 之内的请求看起来频率都是无穷大,所以 burst 是必须要有的。这块可以参考令牌桶算法的实现原理来理解。
lisonfan
2018-04-06 19:23:37 +08:00
@dndx #5
感谢,
还有一个问题想请教一下,关于 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 来解决这个问题吗?
lisonfan
2018-04-06 19:34:45 +08:00
@dndx #5
刚刚看 https://www.sunzhongwei.com/limit-request-rate.html 这个文章上说 zone size 的意思是每秒开辟一个新的 zone,每秒超出的部分会被拒绝

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/444633

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX