可通过 limit_conn_zone 指令结合 $http_x_biz_id 变量,以自定义请求头 X-Biz-Id 为键实现业务维度连接限流;需注意变量命名规范、空 Header 处理及 Header 透传验证。

可以通过 limit_conn_zone 指令结合 $http_* 变量,将自定义请求头(如 X-Biz-Id)作为连接限流的键,实现按业务维度隔离和限制连接数。
定义基于自定义 Header 的连接限制区域
Nginx 不支持直接对任意字符串做哈希,但可通过 $http_x_biz_id 这类内置变量引用客户端传入的 Header。需注意变量名需转为小写、中划线替换为下划线。
- 在
http块中添加:
limit_conn_zone $http_x_biz_id zone=biz_conn:10m;
表示以请求头X-Biz-Id的值为 key,创建名为biz_conn的共享内存区,最大容纳约 16 万个独立业务标识(10MB 约支持该量级) - 若 Header 为空或未携带,
$http_x_biz_id值为空字符串,所有无该 Header 的请求会归入同一桶,建议配合if或map做兜底处理
在 server 或 location 中启用连接限制
仅定义 zone 不生效,必须在具体作用域中调用 limit_conn 指令:
- 例如在某个 API location 中:
location /api/v1/static/ {
limit_conn biz_conn 50;
proxy_pass http://backend;
} - 表示每个不同的
X-Biz-Id最多允许 50 个并发连接;超出则返回 503(可配合limit_conn_status自定义状态码) - 若需对缺失 Header 的请求单独限流,可用
map构造默认标识:
map $http_x_biz_id $biz_key {
"" "unknown";
default $http_x_biz_id;
}
limit_conn_zone $biz_key zone=biz_conn:10m;
客户端调用与注意事项
业务方需在请求中稳定带上唯一且有业务意义的 Header,例如:
curl -H "X-Biz-Id: payment-service" https://api.example.com/api/v1/static/image.png
- Header 值应尽量简短、无特殊字符(避免空格、换行、控制符),否则 Nginx 可能截断或拒绝解析
- 确保上游代理(如 CDN、LB)未过滤或改写该 Header;可在日志中用
$http_x_biz_id验证是否透传成功 - 连接限制基于 TCP 连接数(非请求数),适用于长连接场景(如 HTTP/2、keepalive);若业务大量使用短连接,效果可能弱于
limit_req
验证与调试技巧
通过日志和响应头快速确认配置是否生效:
- 在 log_format 中加入
$limit_conn_status和$http_x_biz_id,观察哪些请求被限流及对应业务 ID - 用
nginx -t检查语法,重启后用ss -tn | grep :80 | wc -l辅助观察连接分布 - 测试时用多个终端并发请求不同
X-Biz-Id,再用相同 ID 超限,对比响应状态码和日志输出










