nginx 自 1.7.12 起支持 limit_conn_status 指令,可在连接超限时自定义 http 状态码(如 429),需置于 http/server 块中并与 limit_conn_zone 配合使用,仅影响连接限制触发的响应码。

Nginx 默认在连接数超限时返回 503 Service Temporarily Unavailable,但可通过 limit_conn_status 指令自定义该状态码,无需改写或重定向,直接响应指定 HTTP 状态。
确认 Nginx 版本支持
该指令自 Nginx 1.7.12 起引入,若使用较老版本(如 CentOS 7 默认的 1.12.x 或更低),需先升级到 1.14+(推荐 1.20+)以确保稳定支持。可通过 nginx -v 查看版本,编译安装时建议启用默认模块(--with-http_limit_conn_module 已内置,无需额外配置)。
在 limit_conn_zone 后设置 limit_conn_status
该指令必须放在 http 或 server 块中,且需位于对应 limit_conn 指令生效的上下文内。它不作用于限速(limit_rate)或请求数限制(limit_req),仅影响 limit_conn 触发时的响应码。
- 全局统一设置(推荐):在
http块中定义,所有启用连接限制的 location 都继承 - 局部覆盖:在特定
server或location块中重新声明,优先级更高 - 值必须是标准 HTTP 状态码(如 429、403、444),不支持自定义文本或非标准码(如 601)
配置示例与验证方法
以下配置将单 IP 连接数限制为 2,并在超限时返回 429 Too Many Requests:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn_status 429;
server {
listen 80;
location /api/ {
limit_conn addr 2;
proxy_pass http://backend;
}
}
}
验证方式:用 curl -I 多次并发请求同一 IP(可配合 ab 或 hey 工具),观察第 3 次起响应头中的 HTTP/1.1 429;同时检查 error log 是否出现 limiting connections by zone 记录(日志级别需设为 warn 或 info)。
注意事项与常见问题
该状态码仅作用于连接层面的拒绝,不改变响应体内容(Nginx 仍返回默认的 429 纯文本页面)。如需返回 JSON 提示,需搭配 error_page 和自定义页面:
-
error_page 429 /429.json;+location = /429.json { default_type application/json; return 429 '{"error":"too_many_connections"}'; } - 注意:自定义
error_page不会绕过limit_conn_status,只是替换响应体 - 若配置后仍返回 503,请检查是否遗漏
limit_conn_status所在作用域,或被更外层块中的同名指令覆盖 - 不支持 per-location 动态设置状态码(即不能在每个 location 内写不同
limit_conn_status)











