启用 http/2 需在 nginx server 块中写 listen 443 ssl http2;,ssl 和 http2 必须同在一行且配齐证书、tlsv1.2+ 及 alpn;验证用 chrome devtools protocol 列或 curl -i --http2;可选 http2_push 加速首屏。

直接在 Nginx 的 server 块中把 HTTPS 监听行写成 listen 443 ssl http2;,就能启用 HTTP/2 多路复用——它不是额外功能开关,而是协议协商的触发条件。首屏资源并行加载、减少队头阻塞的效果,就靠这一行生效后的底层协议能力自动实现。
必须写对 listen 行:ssl 和 http2 缺一不可
HTTP/2 只能在加密通道上运行,Nginx 不允许明文启用(listen 443 http2 会报错或降级)。关键规则很明确:
-
ssl和http2必须出现在同一行listen指令中,中间用空格分隔,结尾带分号 - IPv4 和 IPv6 需分别配置,例如:
listen 443 ssl http2;和listen [::]:443 ssl http2; - 不能拆成两行,也不能写成
listen 443 ssl; http2 on;——后者是无效语法,Nginx 会忽略或启动失败
配套 HTTPS 基础不能省:证书 + TLS 协议版本
仅加 http2 不足以让浏览器真正走 h2,还需满足三个支撑条件:
- 证书路径正确且可读:
ssl_certificate和ssl_certificate_key指向有效文件(推荐 Let's Encrypt 全链证书) - TLS 版本至少为 1.2:
ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/1.1 提升安全性) - 服务端需支持 ALPN 扩展(现代 OpenSSL 默认开启),用于在 TLS 握手阶段协商
h2协议名
验证是否生效:看 Protocol 列或 curl 返回
配置保存并重载 Nginx 后,不用改代码就能观察效果:
- 打开 Chrome DevTools → Network 标签页,刷新页面,检查任意请求的 Protocol 列是否显示
h2 - 终端执行:
curl -I --http2 https://yourdomain.com,若响应头第一行是HTTP/2 200,说明协商成功 - 多资源并行加载表现:HTML、CSS、JS、图片等不再排队等待 TCP 连接,同一连接内可交错传输
进阶优化:配合 HTTP/2 Server Push 加速首屏
多路复用解决“并发数限制”,Server Push 进一步减少关键资源的往返延迟。在已启用 http2 的前提下,可添加:
- 在
location /或匹配 HTML 的location ~ \.html?$块中,加入精确路径推送指令:http2_push /css/main.css;<br>http2_push /js/app.js;<br>http2_push /fonts/icon.woff2;
- 注意:Nginx 1.13.9+ 才支持原生
http2_push;旧版本可用add_header Link "/main.css>; rel=preload; as=style";模拟 - 推送资源必须是静态文件、路径绝对且存在,否则无效;过度推送反而增加带宽负担











