nginx触发limit_conn限制时默认返回503,但可通过limit_conn_status指令自定义状态码(如429、444),该指令仅在启用limit_conn的http/server/location块中生效,用于精准区分限流与服务故障。

默认情况下,Nginx 在触发 limit_conn 并发连接限制时,会直接关闭连接并返回 HTTP 状态码 503 Service Unavailable。但这个行为不总是合适——比如前端需要区分“服务不可用”和“连接被限流”,或监控系统依赖特定状态码做告警;这时,limit_conn_status 就是关键开关。
limit_conn_status 的作用与生效位置
它专门控制 limit_conn 触发时返回的 HTTP 状态码,仅影响并发连接超限场景(不是请求频率超限),且必须配合 limit_conn 指令一起使用。它本身不启用限流,只改写响应头中的状态码。
- 可配置在
http、server或location块中,优先级遵循 Nginx 配置继承规则:越靠近请求路径的配置越优先 - 必须在已启用
limit_conn的上下文中设置才有效,单独写无效 - 支持的状态码范围通常是 4xx 和 5xx(如 429、444、503),不建议使用 2xx 或 3xx
常用自定义状态码选择与含义
选什么码,取决于你的业务语义和下游处理逻辑:
- 429 Too Many Requests:最推荐。RFC 6585 明确定义为“客户端发送了太多请求”,语义清晰,前端和 API 网关普遍识别该码做退避重试
- 444 No Response:Nginx 特有码,表示“关闭连接且不发任何响应体”。适合强风控场景,避免暴露服务端信息,但需确保客户端能容忍无响应
- 403 Forbidden:暗示“权限不足”,适用于将限流视为安全策略一部分的场景(如防爬),但可能干扰真实鉴权逻辑
- 保持 503:适合与现有运维体系对齐,比如已有基于 503 的自动扩容或告警链路
配置示例与注意事项
以下是一个典型 location 级限流 + 自定义状态码的写法:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name api.example.com;
location /v1/submit {
limit_conn addr 2;
limit_conn_status 429;
proxy_pass http://backend;
}
}
}
- 这里限制每个 IP 最多 2 个并发连接,超限时返回 429
-
limit_conn_status必须写在limit_conn同一作用域内(如都在 location 中),否则不生效 - 若同时配置了
limit_req(请求频率限流),它的错误码由limit_req_status控制,与limit_conn_status无关 - 注意:444 状态码不会发送任何响应(包括响应头),客户端看到的是连接被重置(connection reset),抓包可见 RST 包
验证是否生效
可通过 curl 模拟并发连接快速验证:
- 启动两个并发请求:
curl -I http://api.example.com/v1/submit && curl -I http://api.example.com/v1/submit - 第三个请求应返回你设定的状态码(如 429),而非默认 503
- 查 Nginx error log,若配置错误(如 status 超出范围),会报类似
invalid value "600" in "limit_conn_status"的警告











