http/2多路复用是协议协商成功后自动生效的传输行为,非配置指令或前端代码可开启;必须在server块中写listen 443 ssl http2;,并满足https、alpn(tls≥1.2)、可信证书三前提,验证需见devtools中protocol为h2且同connection id并发多资源。

HTTP/2 多路复用不是“开启”出来的功能,而是协议协商成功后自动生效的传输行为。它不依赖某条配置指令或前端代码开关,关键在于打通从客户端到服务端的完整 HTTP/2 链路,并让连接真正复用起来。
确保服务端正确启用 HTTP/2
Nginx 等主流服务器不支持在 http { } 块中全局开启 HTTP/2。必须在具体 server 块里写明:
-
listen 443 ssl http2;——http2 必须和 ssl 出现在同一行,缺一不可 - 配置有效 TLS 证书(推荐 Let’s Encrypt 的 fullchain.pem)
- 启用 ALPN 协商:确保
ssl_protocols TLSv1.2 TLSv1.3;,禁用老旧协议 - OpenSSL ≥ 1.0.2、Nginx ≥ 1.9.5,且编译时含
--with-http_v2_module
验证是否真正在用多路复用
不能只看配置写了没,要确认“单连接多流”实际发生:
- 浏览器 DevTools → Network → 右键表头勾选 Protocol 列,多个资源显示
h2是基础条件 - 进一步观察 Connection ID:相同 Connection ID 下并发加载多个资源,才说明复用成功
- 用
curl -I --http2 https://yoursite.com返回首行含HTTP/2 200表示协商成功 - Wireshark 抓包过滤
http2,查看同一 TCP 流中是否存在多个不同Stream ID的帧交错发送
静态资源交付适配多路复用特性
HTTP/2 更适合“小而多”的资源模式,配置需转向轻量+长效:
- 启用 Brotli 压缩(比 gzip 更高效):
brotli on;+ 指定类型如text/css application/javascript - 对不变资源设强缓存:
expires 1y;+add_header Cache-Control "public, immutable"; - 避免重复压缩已压缩格式(JPEG/PNG/woff2),节省 CPU,把连接留给更多并发 stream
- 静态 location 尽量简洁:优先用
alias而非root,关闭 SSI、rewrite 等无关模块
反向代理链路也要跑 HTTP/2
如果 Nginx 做反代,仅前端走 HTTP/2 不够,后端链路也得升级,否则多路复用止步于 Nginx:
-
proxy_pass必须指向https://地址(不能是http://) - 显式声明:
proxy_http_version 2.0; - 清理干扰头:
proxy_set_header Connection '';和proxy_set_header Upgrade ''; - upstream 中启用连接池:
keepalive 32;(建议 16–64),让单个连接承载多个后端 stream
不复杂但容易忽略











