Nginx启用HTTP/2必须同时满足四条件:Nginx≥1.9.5、编译含http_v2_module、OpenSSL≥1.0.2e且运行时正确链接、配置listen 443 ssl http2及有效SSL证书与TLSv1.2+,缺一即被静默忽略。

Linux 下配置 Nginx 启用 HTTP/2 并不能靠“加个参数”就生效,它是一套必须全部满足的硬性条件组合:Nginx 版本、编译模块、OpenSSL 版本与链接、SSL 配置四项缺一不可。任意一项不达标,listen 443 ssl http2 就会被静默忽略,浏览器仍走 HTTP/1.1。
确认底层支持是否真正就绪
别急着改配置,先验证基础环境:
- 运行
nginx -v,确保版本 ≥ 1.9.5(推荐 1.20+) - 运行
nginx -V 2>&1 | grep -o with-http_v2_module,输出必须是with-http_v2_module(不是空或报错) - 运行
nginx -V 2>&1 | grep -i openssl,确认编译时用了 OpenSSL ≥ 1.0.2e(更推荐 1.1.1 或 3.x) - 运行
ldd $(which nginx) | grep ssl,检查实际运行时链接的libssl.so是否为你期望的版本(例如libssl.so.1.1),而非系统旧版(如 CentOS 7 默认的 1.0.2k)
配置 HTTPS + HTTP/2 监听
HTTP/2 强制要求 HTTPS,且必须显式启用 ALPN 协商机制:
- 编辑站点配置文件(如
/etc/nginx/conf.d/example.com.conf或/etc/nginx/sites-enabled/example.com) - 在
server块中,将监听行改为:listen 443 ssl http2;(IPv4)listen [::]:443 ssl http2;(IPv6,如有需要) - 确保同一
server块内已配置有效证书路径:ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/privkey.pem; - 禁用老旧协议:
ssl_protocols TLSv1.2 TLSv1.3;(务必去掉 TLSv1.0 和 TLSv1.1)
避免常见失效陷阱
很多配置看似正确却无效,问题常出在这些细节:
- 不要在同一 IP:Port 上混用多个
server块,一个监听 443 的块里同时存在 HTTP/1.1 和 HTTP/2 配置,容易导致 ALPN 协商失败 - 若使用 Certbot 自动部署,检查其生成的配置是否已含
http2(新版 Certbot 默认添加,旧版需手动补) - CDN(如 Cloudflare 免费版)会终止 TLS 并回源走 HTTP/1.1,此时 Nginx 配置再正确也无用——需确认请求是否直连你的 Nginx
-
ssl_buffer_size、ssl_prefer_server_ciphers等非必要项无需强行添加,除非有明确调优需求
验证是否真实生效
重启后不能只看 nginx -t 和 systemctl reload nginx,要实测协议协商:
- Chrome 或 Edge 开发者工具 → 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


















