Nginx限流处理
limit_req_zone 是 Nginx 中用于限制请求速率的功能,常用于防止 DDoS 攻击或流量过载。以下是如何配置和测试 limit_req_zone 的详细步骤:
- 配置 limit_req_zone
在 Nginx 配置文件中(通常是 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf),添加限流配置。- 定义限流区域
在 http 块中定义一个限流区域:
- 定义限流区域
1 | http { |
limit_req_zone 参数:
- $binary_remote_addr:基于客户端 IP 地址限流。
- zone=one:10m:定义名为 one 的限流区域,大小为 10MB。
- rate=1r/s:限制每秒 1 个请求。
limit_req 参数:
- zone=one:应用限流区域 one。
- burst=5:允许突发 5 个请求。
- nodelay:不延迟处理突发请求。
- 重启 Nginx
保存配置文件后,重启 Nginx 使配置生效:
1 | sudo nginx -t # 测试配置文件是否正确 |
观察结果
- 如果限流生效,部分请求会返回 503 Service Temporarily Unavailable
- 查看 Nginx 日志(通常位于 /var/log/nginx/access.log 或 /var/log/nginx/error.log),确认限流行为
高级配置
- 多级限流
可以为不同路径设置不同的限流规则:1
2
3
4
5
6
7
8
9location /api/ {
limit_req zone=one burst=10 nodelay;
proxy_pass http://backend;
}
location /static/ {
limit_req zone=one burst=20;
alias /var/www/static/;
} - 白名单
对特定 IP 或网段不限流:1
2
3
4
5
6
7
8
9
10
11geo $limit {
default 1;
192.168.1.0/24 0; # 192.168.1.0/24 网段不限流
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=one:10m rate=1r/s;
- 多级限流
常见问题
- 限流不生效:
- 检查 Nginx 配置是否正确。
- 确保 limit_req_zone 和 limit_req 配置在同一层级。
- 请求被误限流
- 调整 burst 和 nodelay 参数。
- 检查客户端 IP 是否正确。
- 性能问题
- 使用 nodelay 减少延迟。
- 优化后端服务性能。
- 限流不生效:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 星尘物语!
评论