必须写成listen 443 ssl http2,因HTTP/2在浏览器中强制要求TLS加密;需满足Nginx≥1.9.5、OpenSSL≥1.0.2、启用http_v2模块,并配置有效证书、TLSv1.2+及ALPN协商。

要在 Nginx 的 HTTPS 配置中正确启用 HTTP/2,不能只加 http2,必须同时满足环境依赖、配置语法和 TLS 协商三方面要求。浏览器强制要求 HTTP/2 走加密通道,所以纯 listen 443 http2 是无效的,必须写成 listen 443 ssl http2。
确认底层支持是否到位
HTTP/2 不是“一配即用”的功能,需逐项验证:
- Nginx 版本 ≥ 1.9.5(推荐 1.20+):运行
nginx -v查看 - 编译时启用了
http_v2_module:执行nginx -V 2>&1 | grep http_v2,输出应包含该模块 - OpenSSL 版本 ≥ 1.0.2(建议 1.1.1 或更高):用
nginx -V 2>&1 | grep -i openssl检查链接版本 - SSL 证书有效且完整:域名匹配、未过期、私钥可读;自签名或链不全会导致 ALPN 协商失败
修改 server 块监听指令
在站点配置的 server 块中,定位 HTTPS 监听行,直接升级写法:
- IPv4:把
listen 443 ssl;改为listen 443 ssl http2; - IPv6:添加或改为
listen [::]:443 ssl http2; - 禁止拆成两行(如分别写
listen 443 ssl;和listen 443 http2;),必须合并为单条指令 - 保留原有
ssl_certificate和ssl_certificate_key路径,确保文件权限允许 Nginx 读取
设置关键 TLS 协商参数
仅加 http2 不足以让浏览器协商成功,ALPN 机制依赖明确的协议栈限制:
- 强制启用 TLS 1.2 及以上:
ssl_protocols TLSv1.2 TLSv1.3;(务必移除TLSv1.0和TLSv1.1) - 无需手动设置
ssl_buffer_size或ssl_prefer_server_ciphers off,除非有特殊调优需求 - 彻底删除任何残留的
spdy相关配置(Nginx 1.9.5+ 已完全移除 SPDY 支持)
验证 HTTP/2 是否生效
重启 Nginx 后,用以下方式确认:
- 浏览器访问站点,打开开发者工具 → Network 标签页 → 刷新页面 → 查看任意请求的 Protocol 列,显示
h2表示成功 - 命令行验证:
curl -I --http2 https://yourdomain.com,若返回头中含HTTP/2 200即通过 - 检查 Nginx 错误日志:
/var/log/nginx/error.log,无 “ALPN negotiation failed” 类报错


















