limit_conn 必须与 limit_conn_zone 配合使用才生效,因前者仅执行计数查询,后者定义共享内存区并存储IP连接状态;zone 必须在 http{} 块顶层定义,否则启动报错。

limit_conn 要生效,必须和 limit_conn_zone 配合使用,缺一不可;单独写 limit_conn 不会起作用,也不会报错,但连接限制完全失效。
为什么 limit_conn 单独写在 location 里没用
limit_conn 是执行指令,它本身不存储任何状态——它只负责“查某个 zone 里这个 IP 当前连了多少个”。真正做计数、存 IP 状态、分配共享内存的,是 limit_conn_zone。而这个 zone 必须定义在 http{} 块顶层,否则 Nginx 启动时直接报错:unknown limit_conn_zone "xxx"。
-
limit_conn_zone $binary_remote_addr zone=perip:10m;这行必须放在http{}最外层,不能套在server或location里 -
$binary_remote_addr比$remote_addr更省内存(少存 ASCII 字符),64 位系统下每个 IP 只占约 128 字节 - 10m 内存 ≈ 支持 16 万个独立 IP 的并发计数;如果业务有大量真实用户(比如百万级 DAU),建议设为
20m或更高 - 若用了 CDN(如 Cloudflare),
$binary_remote_addr拿到的是 CDN 节点 IP,得配合set_real_ip_from和real_ip_header X-Forwarded-For修正
limit_conn perip 5 到底限制什么
它限制的是「已建立、尚未关闭的 TCP 连接数」,不是请求数,也不是每秒请求数。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- HTTP/1.1 keepalive 连接:一个标签页维持一个长连接,算 1 个
- WebSocket、SSE、长轮询:只要底层 TCP 连接没断,就算 1 个
- HTTP/2 下容易失效:单个 TCP 连接可复用上百个 stream,
limit_conn perip 5只卡住 5 个连接,但实际请求压力可能翻几十倍 - 想全站生效,就把
limit_conn perip 5;写在server{}块顶层;写在location /api里,就只对那个路径生效 - 超限时默认返回 503,但日志里不打记录——必须显式加
limit_conn_log_level warn;和limit_conn_status 503;才能确认行为
和 limit_req 混用时要注意什么
limit_req 控请求数(令牌桶),limit_conn 控连接数(计数器),两者触发时机、作用对象、配置位置都不同,混用不当会导致策略失效或误拦截。
-
limit_req在请求头解析完后立即检查,适用于防爬、防爆破;limit_conn在连接进入 upstream 前才计数,对纯静态资源(如图片、CSS)不生效 - HTTP/2 场景下,仅靠
limit_conn不够,建议补一层limit_req zone=perip rate=10r/s burst=20 nodelay;,从请求维度兜底 - 不要把
limit_conn和limit_rate放在同一location:前者卡连接,后者限响应吐速;若后端慢,连接会长期占用,新请求直接被limit_conn拒绝,用户看到的是 503,而不是“下载变慢” - 测试时别用单个
curl发多次请求——要用ab -c 10 -n 100或wrk -t4 -c50 -d10模拟真实并发,否则看不出连接拒绝效果
验证配置是否真生效
光改配置不等于生效,很多问题出在“以为开了,其实没开”。
- 执行
nginx -t只校验语法,不校验逻辑;用nginx -T 2>/dev/null | grep limit_conn_zone确认 zone 确实加载进去了 - 看错误日志:
tail -f /var/log/nginx/error.log,被限连接会打limiting connections by zone "perip",但前提是设置了limit_conn_log_level - 用真实外网 IP 测试:本地
curl或localhost全是127.0.0.1,看不出效果;最好从另一台机器用ab或浏览器多标签访问 - 注意代理链:如果 Nginx 前面还有一层负载均衡或 WAF,
$binary_remote_addr可能始终是内网 IP,得逐层确认X-Real-IP是否透传到位
limit_req 的协同粒度——漏掉任一环,攻击者都能绕过。

















