nginx 不支持直接配置 http/2 最大并发流数,其默认值 100 由源码硬编码且不可通过配置修改;推荐通过 limit_conn 限制单 ip 连接数、limit_req 控制请求速率、收紧超时与头部限制实现双维度资源防护。

Nginx 本身不提供直接配置 HTTP/2 最大并发流数(max_concurrent_streams)的指令,该参数由客户端与服务端在 HTTP/2 连接建立时通过 SETTINGS 帧协商,而 Nginx 的 ngx_http_v2_module 模块硬编码了默认值为 100,且不可通过 nginx.conf 修改。
但你可以通过以下两种方式间接控制、缓解因过多并发流导致的资源耗尽问题:
一、限制每个连接的并发流数(需重新编译,生产环境极少启用)
Nginx 官方未开放 http2_max_concurrent_streams 配置项。
理论上,若你使用的是自定义编译的 Nginx(如 patch 后版本),可通过源码修改 src/http/v2/ngx_http_v2.h 中的 NGX_HTTP_V2_MAX_CONCURRENT_STREAMS 宏定义(默认 100),然后重编译。
⚠️ 注意:这不是标准配置方式,官方不支持,升级或维护成本高,不推荐线上使用。
二、用更有效、原生支持的方式防资源耗尽(推荐)
HTTP/2 的并发流滥用往往伴随连接复用和慢速攻击,真正起效的防护是组合策略:
-
限制单个 IP 的并发连接数(防连接层耗尽)
使用limit_conn模块,针对$binary_remote_addr控制 TCP 连接总数:http { limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m; server { listen 443 ssl http2; # 必须开启 http2 才生效 ssl_certificate ...; ssl_certificate_key ...; limit_conn conn_per_ip 5; # 每个IP最多5个TCP连接 limit_conn_status 429; } }✅ 效果:即使每个连接开100个流,5个连接最多也就500流,避免单IP霸占全部 worker 连接。
-
限制请求速率 + 突发缓冲(防流级密集请求)
结合limit_req控制单位时间内的请求处理量(无论多少流都算请求):http { limit_req_zone $binary_remote_addr zone=http2_req:10m rate=20r/s; server { location /api/ { limit_req zone=http2_req burst=40 nodelay; proxy_pass http://backend; } } }✅ 效果:防止一个连接内短时间内发起数百个流(如恶意 client 并行发 API 请求),从逻辑层削峰。
-
强化连接超时与头部限制(防 Slowloris 类攻击)
HTTP/2 虽抗慢速攻击更强,但仍需收紧基础连接参数:server { # 关键:缩短空闲连接存活时间 keepalive_timeout 15s; client_header_timeout 10s; client_body_timeout 10s; # 限制单次请求头大小(防 header flood) http2_max_field_size 8k; http2_max_header_size 16k; http2_max_requests 1000; # 单连接最多处理1000个请求后断开(重用连接上限) }
三、补充建议:监控与兜底
- 开启 Nginx 日志记录
$connection_requests(当前连接已处理请求数)和$status,识别异常高请求连接; - 在 upstream 层(如 backend)加熔断/限流(如 Envoy 或应用层 RateLimiter),形成多层防护;
- 若业务敏感,可在 SSL/TLS 层用
ssl_preread+ GeoIP 或 WAF(如 ModSecurity)做前置连接过滤。
Nginx 对 HTTP/2 流的控制本质是“连接 + 请求”双维度治理,而非直接调流数。靠 limit_conn + limit_req + 连接超时三者配合,比强行改流上限更稳定、更易运维。











