直接在 Nginx server 块中配置 listen 443 ssl http2; 即可启用 HTTP/2,但必须同时配置有效 SSL 证书、TLSv1.2+ 协议及 ALPN 支持;缺一不可,明文端口或拆分指令均无效。

直接在 server 块的 listen 指令里加上 http2,但必须和 ssl 同时存在,且只作用于 HTTPS(443 端口)——HTTP/2 在浏览器中不支持明文传输,单独写 listen 443 http2 或 listen 80 http2 都无效。
基础配置写法
这是最简有效写法,缺一不可:
-
listen 443 ssl http2;—— 注意ssl和http2必须共存,顺序无关 - 配上有效的 SSL 证书路径:
ssl_certificate和ssl_certificate_key - 启用 TLSv1.2 或更高版本:
ssl_protocols TLSv1.2 TLSv1.3;
示例:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
}
必须检查的前置条件
加了 http2 却没生效?大概率卡在这几项:
- Nginx 版本 ≥ 1.9.5(推荐 ≥ 1.18.0),运行
nginx -v查看 - 编译时包含
--with-http_v2_module,运行nginx -V 2>&1 | grep http_v2确认输出含该字符串 - OpenSSL 版本 ≥ 1.0.2e(实际建议 ≥ 1.1.1),运行
nginx -V查看 OpenSSL 路径和版本,并用ldd $(which nginx) | grep ssl确认运行时链接的是新版 - 证书链完整、文件可读、私钥无密码(或已用
openssl rsa -in key.pem -out key-nopass.pem去密)
常见错误写法
这些配置看似接近,但会导致 HTTP/2 静默失效:
-
listen 443 http2;—— 缺ssl,Nginx 忽略http2 -
listen 80 http2;—— HTTP/2 不允许明文,浏览器根本不会协商 -
ssl on;已废弃,且与http2兼容性差,应删掉 - 同一 IP:443 上,一个
server块写http2,另一个没写 —— 可能引发 ALPN 协商冲突
验证是否真正生效
别只靠 nginx -t && nginx -s reload,要实测:
- 浏览器打开 DevTools → Network 标签 → 刷新页面 → 看任意请求的 “Protocol” 列是否显示
h2 - 命令行执行:
curl -I --http2 https://example.com(需 curl ≥ 7.47) - 检查 ALPN 是否通告:
openssl s_client -alpn h2 -connect example.com:443 2>/dev/null | grep ALPN,应输出ALPN protocol: h2


















