http/2 必须在 server 块中通过 listen 443 ssl http2; 启用,且需同时满足 https 已启用、tls 支持 alpn、证书可信三个前提;实测需用浏览器 devtools 或 curl --http2 验证协议是否为 h2。

不能通过 http 块开启 HTTP/2 协议实现多路复用加速。
HTTP/2 必须在 server 块中启用
HTTP/2 多路复用不是靠在 http { } 块里添加某条“全局指令”就能生效的。Nginx 中不存在 http2 on; 这类写在顶层的配置。它必须在具体的 server 块中,通过 listen 指令显式声明:
-
listen 443 ssl http2;—— http2 必须和 ssl 同时出现在同一行 - 单独写
http2在http、location或另起一行都会被忽略或报错 - 即使整个
http块配置了通用 SSL 参数,只要listen行缺http2,该 server 仍走 HTTP/1.1
三个硬性前提缺一不可
仅加 http2 不够,必须同时满足:
-
HTTPS 已启用:使用
ssl_certificate和ssl_certificate_key配置有效证书(推荐 fullchain.pem) -
TLS 层支持 ALPN:设置
ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/1.1) - 证书可信:自签名或过期证书会导致浏览器降级回 HTTP/1.1
验证是否真正生效
不能只看配置写了没,要实测协议协商结果:
- 浏览器打开 DevTools → Network 标签页 → 查看任意请求的 Protocol 列是否显示
h2 - 终端执行:
curl -I --http2 https://yourdomain.com,返回首行含HTTP/2 200即成功 - 注意:
h2c(明文 HTTP/2)生产环境不建议启用,主流 CDN 和 Nginx 默认不支持
前端无需额外操作
多路复用由协议层自动完成,HTML 中不需要加任何属性或 JS 调用:
- 浏览器在单个 TCP 连接上自动并发处理多个请求,前提是域名统一、不触发子域分片
- 可配合
<link rel="preload" as="image">提前触发关键资源,抢占复用通道 - 避免同步脚本阻塞解析,否则会拖慢整个复用链路的启动时机










