仅用1个连接却触发Nginx连接限制?求计数规则解析
Nginx连接限制计数规则解析(HTTP/2场景)
核心问题:HTTP/2多路复用的计数逻辑
你遇到的问题本质是Nginx对HTTP/1.1和HTTP/2的limit_conn计数规则存在差异:
- 针对HTTP/1.1,
limit_conn按TCP连接计数,一个TCP连接对应一个计数项。 - 针对HTTP/2,由于协议支持多路复用(单个TCP连接可同时处理多个请求流),Nginx默认会把每个并发请求流算作一个“连接”,纳入
limit_conn的统计限制中。
也就是说,哪怕客户端只用了1个TCP连接,只要这个连接上同时存在的请求流数量超过你设置的50,后续的请求流就会触发连接限制——这就是你日志中约30个请求被限制的原因。
Nginx连接计数的具体规则
limit_conn_zone定义的是计数维度,你用$binary_remote_addr是按客户端IP维度统计,但统计的“单位”在HTTP/2场景下是请求流,而非TCP连接。- 当请求流处理完成后,对应的计数会被释放;如果请求处理速度慢,并发请求流堆积就容易触发限制。
调整建议
- 若目标是限制客户端的TCP连接数而非请求流数,建议结合
limit_req做请求频率限制,或者调整http2_max_concurrent_streams(默认值128),将单个HTTP/2连接的最大并发流数控制在limit_conn设置的数值以内。 - 若需要保留对请求流的限制,可根据业务实际需求调整
limit_conn的数值,匹配HTTP/2的并发流承载需求。
内容的提问来源于stack exchange,提问作者Philipp S
相关产品推荐
相关产品推荐

