Debian环境下Nginx限流配置正确性及测试方法咨询
一、你的配置是否正确?
首先从语法层面来说,你写的配置是合法有效的,但有一个关键细节需要注意:limit_req_zone 指令必须放在 http 块层级(不能嵌套在 server 或 location 内部)。如果你的 default 配置文件是被主配置/etc/nginx/nginx.conf通过include指令加载到http块中的(Debian默认配置会自动includesites-enabled/*),那你把limit_req_zone写在server块外面是完全没问题的。
不过从最佳实践角度,更推荐把这类全局共享的限流zone配置放在主nginx.conf的http块里,或者单独创建/etc/nginx/conf.d/limit.conf文件存放,这样后续多个站点(server块)都能复用这个限流规则,不用和单个站点的配置绑定在一起。
另外补充一个实用参数:你配置里的burst=5允许每秒突发5个请求,超出基础速率(1r/s)的请求会被Nginx延迟处理直到队列清空。如果希望直接拒绝超出burst的请求(而非延迟),可以加上nodelay参数:
limit_req zone=one burst=5 nodelay;
二、如何测试限流效果?
这里有几种简单易操作的测试方法:
1. 使用ab压力测试工具(推荐)
Debian下先安装工具包:
sudo apt update && sudo apt install apache2-utils
然后用以下命令模拟并发请求:
ab -n 20 -c 5 http://Realesta74.net/
-n 20:总共发送20个请求-c 5:同时并发5个请求
执行后查看结果中的状态码分布,如果配置生效,使用nodelay时部分请求会返回503 Service Unavailable;未加nodelay的话,能看到请求耗时明显变长(延迟处理的表现)。
2. 用循环curl快速发送请求
打开终端执行以下命令,连续发送多个请求:
for i in {1..10}; do curl -I http://Realesta74.net/; sleep 0.1; done
观察返回的响应头,触发限流时Nginx会返回503状态码,也可以直接看Nginx访问日志(默认路径/var/log/nginx/access.log),触发限流的请求会被标记为limit_req。
3. 查看Nginx日志验证
检查访问日志,触发限流的请求会包含limit_req关键字,示例如下:
192.168.1.1 - - [10/Oct/2024:12:34:56 +0800] "GET / HTTP/1.1" 503 190 "-" "curl/7.74.0" "-" "limit_req zone=one"
内容的提问来源于stack exchange,提问作者ruth23454

