nginx可通过limit_conn模块限制单个ip并发连接数以防御连接耗尽攻击;需在http块中用limit_conn_zone定义基于$binary_remote_addr的共享内存区域,再在server或location中用limit_conn引用该区域并设阈值,配合limit_req、keepalive_timeout、real_ip配置及日志监控实现综合防护。

可以通过 Nginx 的 limit_conn 模块对单个 IP 地址的并发连接数进行限制,从而有效缓解恶意压力测试或连接耗尽类攻击。关键在于正确配置共享内存区域、连接限制阈值,并结合 limit_conn_zone 定义限流维度。
定义连接限制的共享内存区域
使用 limit_conn_zone 指令在 http 块中声明一个基于客户端 IP 的限流区域:
limit_conn_zone $binary_remote_addr zone=addr:10m;
说明:
• $binary_remote_addr 是客户端 IP 的二进制表示(比 $remote_addr 更节省内存);
• zone=addr:10m 表示创建名为 addr 的共享内存区域,大小为 10MB,足够存储约 16 万个独立 IP 的连接状态;
• 该指令必须放在 http 块中,不能写在 server 或 location 内。
在 server 或 location 中启用连接限制
在需要防护的上下文中添加 limit_conn 指令:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;">limit_conn addr 10; # 每个 IP 最多 10 个并发连接
limit_conn_log_level error;
limit_conn_status 503;}
说明:
• limit_conn addr 10 表示应用名为 addr 的区域,每个 IP 限 10 个并发连接;
• limit_conn_log_level error 控制超限时记录为 error 级别(默认 warn),便于排查;
• limit_conn_status 503 设置拒绝连接时返回的 HTTP 状态码(默认 503),可配合前端重试策略;
• 若放在 location /api/ 下,则只限制该路径的并发连接,适合重点接口防护。
配合其他模块提升防护效果
limit_conn 主要防连接层泛洪,建议组合使用以下措施增强健壮性:
- 用
limit_req限制请求速率(如每秒最多 5 个请求),防高频短连接刷接口; - 开启
keepalive_timeout合理值(如 15s),避免长连接堆积占用资源; - 通过
real_ip_header和set_real_ip_from正确识别真实客户端 IP(尤其在有 CDN 或反向代理时); - 监控
Nginx的ngx_http_limit_conn_module指标,如被拒绝连接数(limit_conn_rejected),及时调整阈值。
验证与调试技巧
部署后可通过简单脚本模拟并发连接验证是否生效:
for i in {1..15}; do
curl -s -o /dev/null -w "%{http_code}\n" http://example.com/ &
done; wait观察是否出现多个 503 响应;同时检查 Nginx 错误日志:
• 匹配 "limiting connections by zone" 表示规则已加载;
• 出现 "rejected" 日志说明触发了限制;
• 若所有请求都 503,可能是共享内存不足或 IP 识别错误(如全部记为 127.0.0.1),需检查 real_ip 配置。










