http/2多路复用需在server块listen指令中显式声明http2且启用tls,非http块配置;必须满足https、alpn支持(tls≥1.2)、证书可信三条件;生效后浏览器protocol列显示h2或curl--http2返回http/2即确认。

HTTP/2 多路复用不是靠 http 块里加某条“指令”就能开启的,它依赖协议协商机制,而非配置开关。Nginx 中并不存在 http2 on; 这类写在 http { } 块顶层的独立指令——HTTP/2 必须在 server 块的 listen 指令中显式声明,且仅对启用 TLS 的 HTTPS 服务生效。
你真正要做的,是确保以下三点在 server 级别正确配置:
- 启用 HTTPS 并绑定
http2参数 - 使用支持 ALPN 的 TLS 配置(TLS ≥ 1.2,推荐 1.3)
- 证书有效且被客户端信任
例如,正确写法是:
server {
listen 443 ssl http2; # ← 关键:http2 必须和 ssl 同时出现在 listen 行
server_name example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
}
注意:
-
http2不能写在http { }、location { }或单独一行;写在http块会报错或被忽略 - 明文 HTTP(h2c)在生产环境几乎不用,Nginx 默认不支持 h2c 升级,也不建议配置
- 即使整个
http块启用了 SSL 公共配置,若listen行缺http2,该 server 仍走 HTTP/1.1
验证是否生效,直接看浏览器 DevTools → Network → Protocol 列显示 h2,或执行:
curl -I --http2 https://example.com
返回状态行带 HTTP/2 200 即表示协商成功,多路复用自动启用。
不复杂但容易忽略










