要在 Nginx 中真正支持 HTTP/2 多路复用并实现传输加速,核心是确保 listen 443 ssl http2; 正确配置、TLS 协商成功(ALPN+h2)、静态资源交付轻量(alias+sendfile+Brotli+强缓存),并通过 Protocol 列和 Connection ID 验证单连接多流。

要在 Nginx 中让 Server 配置真正支持 HTTP/2 多路复用并实现传输加速,核心不是添加新模块或改写逻辑,而是确保协议协商成立、TLS 链路高效、静态资源交付轻量。多路复用是 HTTP/2 自带能力,只要配置到位,浏览器会自动在单连接上并发多个 stream。
必须在 listen 指令中同时声明 ssl 和 http2
HTTP/2 在 Nginx 中不能独立启用,必须与 HTTPS 绑定。关键写法只有一条:
-
正确写法:
listen 443 ssl http2;或listen [::]:443 ssl http2;(IPv6 也需单独加) -
错误写法:分两行写
listen 443 ssl;和listen 443 http2;,Nginx 不报错但实际不生效 - 明文
listen 443 http2;会直接报错,Nginx 拒绝启动
配套 TLS 配置要满足 ALPN 协商前提
仅写 http2 不够,浏览器能否走 h2 还取决于 TLS 层是否顺利协商出协议名:
- 指定安全协议版本:
ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/1.1) - 启用 OCSP Stapling 加速证书验证:
ssl_stapling on; ssl_stapling_verify on;,并配好ssl_trusted_certificate - 开启会话缓存减少重复握手:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h; - 使用支持 ALPN 的 OpenSSL(≥1.0.2,推荐 ≥1.1.1),可用命令验证:
openssl s_client -alpn h2 -connect example.com:443 -servername example.com | grep "ALPN protocol",输出应为h2
静态资源交付要适配多路复用特性
HTTP/2 对“小而多”的资源更友好,配置需避免拖慢单连接上的并发响应效率:
- 静态 location 优先用
alias而非root,减少路径拼接开销;例如:location /static/ { alias /var/www/assets/; } - 关闭无关处理:
ssi off;、不启用rewrite、不调用 Lua/Perl,保证请求路径最短 - 启用零拷贝传输:
sendfile on; tcp_nopush on; - 用 Brotli 替代 gzip 压缩:
brotli on; brotli_types text/css application/javascript text/html; - 对不变资源设强缓存:
expires 1y; add_header Cache-Control "public, immutable";
验证是否真正在用多路复用
不能只看响应头有没有 HTTP/2 字样,要确认“单连接多流”实际发生:
- Chrome DevTools → Network → 刷新页面 → 查任意请求的 Protocol 列是否显示
h2 - 终端执行:
curl -I --http2 https://example.com,首行返回HTTP/2 200即表示协商成功 - 观察 Connection ID:多个请求的
Connection ID相同,但Stream ID递增,说明复用成立


















