必须配置listen 443 ssl http2,且满足nginx≥1.9.5、含http_v2模块、openssl≥1.0.2、有效ssl证书、tlsv1.2+协议及alpn支持,缺一不可。

要在 Nginx 中让 HTTPS 站点真正启用 HTTP/2,关键不是加个 http2 参数就完事,而是必须满足一套协同生效的条件。浏览器只认 HTTPS 上的 HTTP/2(即 h2),明文 HTTP/2(h2c)不被主流支持,所以一切都要围绕安全、兼容和配置完整性展开。
HTTPS 是硬性前提
HTTP/2 在 Chrome、Firefox、Safari 等浏览器中仅通过 TLS 启用。Nginx 不会报错,但若缺少有效 SSL 配置,客户端实际仍走 HTTP/1.1:
- 必须使用
listen 443 ssl http2(顺序不限,但ssl和http2必须在同一行) -
ssl_certificate指向完整证书链(如 Let’s Encrypt 的fullchain.pem),不能只配公钥 -
ssl_certificate_key指向私钥文件,权限应为600,Nginx 进程需有读取权限 - 不支持
listen 80 http2—— HTTP/2 over HTTP(h2c)在浏览器中基本不可用
TLS 配置必须达标
旧版 TLS 或弱加密套件会导致协商失败或降级,HTTP/2 无法建立:
- 启用且仅启用 TLSv1.2 和 TLSv1.3:
ssl_protocols TLSv1.2 TLSv1.3; - 禁用不安全套件(如 RC4、SHA1、TLS 1.0/1.1),推荐使用前向安全的 ECDHE 套件
- 开启 OCSP Stapling 加速证书验证:
ssl_stapling on; ssl_stapling_verify on;(需配置ssl_trusted_certificate) - 设置会话缓存提升复用率:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h;
模块与版本基础不可少
底层支持不到位,配置再正确也无效:
- Nginx 版本 ≥ 1.9.5(推荐 ≥ 1.20.0),编译时必须含
--with-http_v2_module和--with-http_ssl_module - OpenSSL 版本 ≥ 1.0.2(建议 ≥ 1.1.1 或 OpenSSL 3.x),否则无法支持 TLSv1.3 或 ALPN 协商
- 执行
nginx -V 2>&1 | grep -E "(http_v2|SSL)"可确认模块是否已启用
验证是否真正生效
不能只看配置语法正确,要实测连接协议:
- 浏览器开发者工具 → 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











