Nginx的limit_conn可限制同一IP并发连接数,超限时返回503且不转发请求;需正确定义zone、配置limit_conn指令、重载生效,并用curl短连接并发验证,结合日志中conn=0和limit=addr识别拦截。

直接用并发请求工具发起超过 limit_conn 阈值的连接,就能观察到拦截效果——Nginx 会立即返回 503 Service Temporarily Unavailable,且不建立后端连接。
确认 limit_conn 配置已生效
确保在 http、server 或 location 块中正确定义了 limit_conn_zone 和 limit_conn。例如:
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /api/ {
limit_conn addr 2; # 同一 IP 最多 2 个并发连接
proxy_pass http://backend;
}
}
配置后需重载 Nginx:nginx -s reload,并检查错误日志是否报错(如 zone 未定义、语法错误等)。
用 curl + 并发脚本快速验证
不用复杂压测工具,一个 shell 循环配合后台 curl 即可模拟并发:
- 开一个终端,执行:
for i in {1..5}; do curl -s -o /dev/null -w "%{http_code}\n" http://your-domain/api/test & done; wait - 若 limit_conn 设为 2,大概率看到输出中混有多个 503(其余可能是 200),说明超出限制的请求被拒绝
- 注意:curl 默认使用 HTTP/1.1,复用 TCP 连接;如要测试“真实连接数”,建议加
-H "Connection: close"或用--http1.1 --no-http2强制短连接
通过日志和监控交叉验证
在 server 或 location 中开启 access_log,并添加 $limit 和 $limit_rate 变量辅助判断:
log_format limitlog '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'limit=$limit conn=$limit_conn';
access_log /var/log/nginx/limit_test.log limitlog;
触发并发后查看日志:
– 每行末尾的 conn=2 表示当前连接命中了 zone=addr 的 limit_conn 限制(值即设定上限)
– 若某请求日志中 limit=addr 但 conn=0,说明该连接被限流拦截,未进入后续处理流程(此时响应码必为 503)
排除干扰因素
- 浏览器限制:现代浏览器对同一域名默认最多 6 个并发连接,且会复用连接。测试时务必用命令行工具(curl、ab、wrk),避免浏览器缓存或连接池干扰
- 其他限流叠加:检查是否同时启用了 limit_req(限速)、limit_rate(限带宽)或防火墙连接数限制,它们可能掩盖 limit_conn 效果
- IP 识别问题:若前端有代理(如 CDN、LB),$binary_remote_addr 实际是代理 IP。应改用 $http_x_forwarded_for 或自定义可信头 + real_ip 模块还原真实客户端 IP


















