跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何利用Nginx中http2_max_concurrent_streams限制并发

http2_max_concurrent_streams用于限制单个HTTP/2连接的最大并发流数,默认128,需Nginx≥1.9.5、启用HTTPS及listen ssl http2配置,不控制连接数或后端并发。 在 Nginx 中,
http2_max_concurrent_streams
用于控制单个 HTTP/2 连接上允许的最大并发流(stream)数量,它不直接限制客户端连接数或请求总数,而是约束“一个连接内能同时处理多少个请求”。合理设置该值可缓解资源争抢、防止个别连接过度占用服务端线程或内存。 这个指令的作用范围和生效前提 该指令仅对启用了 HTTP/2 的 server 块或 http 块有效,且必须满足以下条件才会起作用: Nginx 版本 ≥ 1.9.5(HTTP/2 支持从该版本正式引入) SSL/TLS 已启用(HTTP/2 在 Nginx 中强制要求 HTTPS) server 块中配置了
http2
参数,例如:
listen 443 ssl http2;
客户端实际使用 HTTP/2 协议发起连接(可通过浏览器开发者工具的 Network → Protocol 列确认) 典型配置方式与取值建议 可在
http
、
server
或
location
块中设置,推荐放在
server
块内以实现更精细的控制:
server { listen 443 ssl http2; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem;
# 单个 HTTP/2 连接最多同时处理 100 个请求(流)
http2_max_concurrent_streams 100;

location / {
    proxy_pass http://backend;
    proxy_http_version 1.1;
}
} 默认值是 128。常见调整场景: 后端处理能力较弱(如 PHP-FPM 进程数有限),可设为 32–64,避免单连接压垮上游 静态资源服务(高吞吐、低延迟),可适当提高至 256,提升复用效率 存在大量长轮询或 Server-Sent Events(SSE)连接时,应调低(如 16–32),防止流长期占位 它和其它并发限制的区别 需注意它不等同于以下机制: 不是连接数限制 :不限制客户端能建多少 TCP 连接,只限制每个连接内的并发流数 不替代 limit_conn / limit_req :后者控制 IP 级连接或请求频率,属于全局或客户端维度限流 不控制后端并发 :即使设为 10,若 client 开 10 个连接,仍可能向后端发 100 个请求;需配合
proxy_max_temp_file_size
、
upstream keepalive
等协同优化 验证是否生效 可通过以下方式确认配置已加载且被客户端遵守: 重启 Nginx 后执行
nginx -t
和
nginx -s reload
用支持 HTTP/2 的 curl 测试:
curl -I --http2 https://your-domain.com
,观察响应头是否含
HTTP/2 200
在高并发压测中,抓包分析 TCP 流中的 GOAWAY 帧或 RST_STREAM 错误码(如
ENHANCE_YOUR_CALM
),可能是触发了流数上限 查看 Nginx error log,当流超限时会记录类似:
client closed stream prematurely while sending request to upstream
(需结合日志级别和调试开启)

相关文章