要在 Nginx 的 server 块中为特定域名开启 HTTP/2,必须在该域名的 HTTPS server 块中显式配置 listen 443 ssl http2,配合有效 SSL 证书、TLSv1.2+ 协议,并确保 Nginx ≥1.9.5 且编译时启用 http_v2_module。

要在 Nginx 的 server 块中为特定域名开启 HTTP/2,关键不是全局开关,而是精准配置该域名对应的 HTTPS 服务块——HTTP/2 只能在启用 TLS 的 443 端口上生效,且必须显式声明 http2,不能依赖版本或自动协商。
确认该 server 块已启用 HTTPS
HTTP/2 强制要求加密传输,所以必须先有有效的 SSL 配置。确保该域名的 server 块包含:
-
listen 443 ssl http2;(IPv4)和/或listen [::]:443 ssl http2;(IPv6)——ssl 和 http2 必须同时存在 -
ssl_certificate和ssl_certificate_key指向正确的 PEM 格式证书与私钥文件,路径可读 -
ssl_protocols TLSv1.2 TLSv1.3;—— 明确禁用 TLSv1.0/v1.1,否则 ALPN 协商可能失败
检查 Nginx 是否真支持该域名走 h2
即使配置写了 http2,也不代表生效。需验证三点是否全部满足:
- Nginx 版本 ≥ 1.9.5(推荐 1.20.2+),运行
nginx -v查看 - 编译时启用了
with-http_v2_module,运行nginx -V 2>&1 | grep with-http_v2_module确认输出非空 - 底层 OpenSSL ≥ 1.0.2e,且 Nginx 动态链接的是这个新版库,可用
nginx -V查路径 +ldd $(which nginx) | grep ssl双重确认
仅对目标域名启用,不影响其他站点
HTTP/2 是 per-server 的行为,不是全局特性。只要其他域名的 server 块没写 listen ... http2,就不会启用。例如:
server {
listen 443 ssl http2;
server_name shop.example.com;
ssl_certificate /path/to/shop.crt;
ssl_certificate_key /path/to/shop.key;
# 其他配置...
}
<p>server {
listen 443 ssl; # 注意:这里没有 http2 → 仍走 HTTP/1.1
server_name blog.example.com;
ssl_certificate /path/to/blog.crt;
ssl_certificate_key /path/to/blog.key;</p><h1>其他配置...</h1><p>}这样只有 shop.example.com 走 HTTP/2,blog.example.com 保持 HTTP/1.1,互不干扰。
验证是否真正生效
配置保存后,务必执行 nginx -t && systemctl reload nginx,然后验证:
- 浏览器打开 DevTools → Network → 刷新页面 → 右键表头勾选 Protocol,查看请求是否显示
h2 - 命令行测试:
curl -I --http2 https://shop.example.com,返回HTTP/2 200且无重定向才算通路正常 - 排查 ALPN:运行
openssl s_client -alpn h2 -connect shop.example.com:443 2>/dev/null | grep "ALPN protocol",输出应为ALPN protocol: h2


















