Nginx启用HTTP/2必须满足:版本≥1.9.5、编译含http_v2模块、OpenSSL≥1.0.2,且listen指令须写为“listen 443 ssl http2”,配合有效SSL证书、TLSv1.2+协议及ALPN支持,最后通过curl或浏览器开发者工具验证h2协议生效。

直接在 listen 指令里加 http2 不够,必须搭配 ssl 且走 HTTPS —— HTTP/2 在浏览器中强制要求 TLS 加密,listen 443 http2 单独写是无效的,必须写成 listen 443 ssl http2。
确认基础环境是否达标
HTTP/2 不是开关式功能,依赖底层支持:
- Nginx 版本 ≥ 1.9.5(推荐 1.20+),运行
nginx -v查看 - 编译时启用
--with-http_v2_module,运行nginx -V 2>&1 | grep http_v2确认输出含该模块 - OpenSSL 版本 ≥ 1.0.2(推荐 1.1.1+),执行
nginx -V 2>&1 | grep -i openssl检查链接版本 - 证书必须有效、完整、匹配域名,自签名或过期证书会导致协商失败
修改 server 块监听配置
在站点配置的 server 块中,把原来的 HTTPS 监听行升级为明确支持 HTTP/2 的写法:
- IPv4:将
listen 443 ssl;改为listen 443 ssl http2; - IPv6:添加或修改为
listen [::]:443 ssl http2; - 不能拆成两行(如
listen 443 ssl;+listen 443 http2;),必须合并为一条指令 - 保留原有
ssl_certificate和ssl_certificate_key路径,确保文件可读
强化 SSL 协商关键项
仅加 http2 参数还不够,ALPN 协商失败会导致浏览器仍用 HTTP/1.1:
- 强制启用 TLS 1.2 及以上:
ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/TLSv1.1) - 不需手动加
ssl_buffer_size或ssl_prefer_server_ciphers off,除非有特定调优需求 - 避免使用已弃用的 SPDY 相关指令(如
spdy),Nginx 1.9.5+ 已完全移除 SPDY 支持
验证是否真正生效
别只信 nginx -t && systemctl reload nginx,要实测协议协商结果:
- 浏览器打开开发者工具 → Network 标签 → 刷新页面 → 查任意请求的 “Protocol” 列,显示 h2 才算成功
- 终端执行:
curl -I --http2 https://your-domain.com,返回状态行含HTTP/2 200且无重定向 - 排查 ALPN:运行
openssl s_client -alpn h2 -connect your-domain.com:443 2>/dev/null | grep ALPN,输出应为ALPN protocol: h2 - 注意 CDN 干扰:若用了 Cloudflare 免费版等中间代理,它可能终止 TLS 并以 HTTP/1.1 回源,此时 Nginx 配置再对也无效


















