在 Nginx 中启用 HTTP/2 协议需要在 HTTPS 监听配置中添加 http2 参数,且必须满足 Nginx 版本不低于 1.9.5 以及 OpenSSL 支持 ALPN 协议。该配置仅对加密连接生效,明文 HTTP 无法启用 HTTP/2,配置错误会导致协议降级为 HTTP/1.1。
先说结论:启用 HTTP/2 能显著减少 TLS 握手次数和 TCP 连接开销,但必须基于有效的 HTTPS 配置且后端代理建议保持 HTTP/1.1。
- 适合:需要提升高并发下 HTTPS 请求响应速度、减少队头阻塞的 Web 服务或 API 网关。
- 先准备:确认 Nginx 版本≥1.9.5、OpenSSL≥1.0.2 且已编译 http_v2_module 模块。
- 验收:通过浏览器开发者工具 Network 面板或 curl 命令验证协议列显示为 h2。
命令速用版
检查 Nginx 是否支持 HTTP/2 模块及 OpenSSL 版本,确认环境满足硬性要求。
nginx -V | grep http_v2 openssl version
修改配置文件 server 块,将 listen 指令升级为支持 h2 的写法。
listen 443 ssl http2;
重载配置使更改生效。
nginx -s reload
为什么会这样
HTTP/2 通过多路复用和头部压缩技术解决了 HTTP/1.1 的队头阻塞问题,但主流浏览器仅支持基于 TLS 的 HTTP/2(h2)。
Nginx 启用 http2 指令本身不会自动带来性能质变,真正起作用的是它触发的全链路 HTTPS 协议升级与连接模型重构。多路复用允许单连接承载全部请求,显著削减了 TLS 握手次数和 TCP 连接开销。若缺少有效的 TLS 证书或 OpenSSL 不支持 ALPN 协议协商,客户端会强制降级为 HTTP/1.1。
分步处理
步骤 1:确认编译参数与版本
执行nginx -V查看编译参数,必须包含`--with-http`_v2_module和`--with-http`_ssl_module。检查 OpenSSL 版本,建议不低于 1.0.2,推荐 1.1.1 及以上以支持 ALPN。
步骤 2:配置 HTTPS 监听
在 server 块中修改 listen 指令,必须将 ssl 和 http2 写在同一行,拆成两条指令无效。
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
}步骤 3:优化 SSL 与 HTTP/2 参数
启用会话缓存和 OCSP Stapling 减少握手延迟,调整头部大小限制避免长 Header 被拒。
ssl_session_cache shared:SSL:10m; ssl_stapling on; http2_max_field_size 16k; http2_max_header_size 32k;
步骤 4:配置反向代理(如有)
客户端到 Nginx 走 HTTP/2 已释放大部分性能红利,向上游服务建议保持 HTTP/1.1 以避免流控制异常。
location / {
proxy_pass https://backend;
proxy_http_version 1.1;
proxy_set_header Connection '';
upstream_keepalive 32;
}怎么验证是否生效
方法 1:浏览器开发者工具
打开浏览器 Network 标签,刷新页面,查看协议列是否显示h2。若显示http/1.1,检查证书有效性或 ALPN 支持。
方法 2:命令行 curl 测试
使用支持 HTTP/2 的 curl 版本(7.47+)发起请求,观察返回头信息。
curl -I `--http2` https://example.com
方法 3:在线工具检测
使用 KeyCDN HTTP/2 Test 等在线工具输入域名,检测协议协商结果。
常见坑
1. listen 指令拆分错误
常见错误是把 ssl 和 http2 拆成两条 listen 指令,正确写法只有一条listen 443 ssl http2;。
2. 证书链不完整或自签名
自签名证书或链不完整的证书在现代浏览器中会导致强制降级为 HTTP/1.1,必须使用可信 CA 签发的有效证书。
3. 上游服务强行启用 HTTP/2
多数后端服务对代理模式下的 HTTP/2 支持不成熟,易出现连接挂起,内网环境 HTTP/1.1 + keepalive 已足够高效。
4. 忽略 TLS 版本限制
必须启用 TLS 1.2 或 TLS 1.3,禁用 TLS 1.0/1.1 及弱加密套件,否则 HTTP/2 协商可能失败。
常见问题
HTTP/2 必须在 HTTPS 下才能启用吗?
是的,主流浏览器仅支持基于 TLS 加密的 HTTP/2 协议。
Nginx 配置中必须包含 ssl 参数且使用有效证书,明文 HTTP 无法在浏览器端启用 HTTP/2。
Nginx 最低版本要求是多少?
Nginx 版本必须不低于 1.9.5 才支持 http2 指令。
推荐使用 1.20 及以上版本以获得更好的稳定性和功能支持。
反向代理上游需要配置 HTTP/2 吗?
不需要,建议上游保持 HTTP/1.1 配置。
内网延迟低且后端对 HTTP/2 代理支持有限,维持proxy_http_version 1.1更稳定。
如何确认 OpenSSL 支持 ALPN?
执行openssl version命令,版本需≥1.0.2。
较新的 Linux 发行版默认 OpenSSL 通常已满足 ALPN 协议协商要求。
参考来源
- Nginx 与 HTTP/2 协议:开启 http2 指令后对 HTTPS 性能的质变提升
- Nginx 中 HTTP2 协议开启教程:通过 listen 指令实现加速
- 如何利用 Nginx 开启 HTTP2 协议大幅提升并发传输性能
- Nginx 反向代理支持 HTTP2 协议提升并发性能指南
- Nginx 性能优化 (二):HTTP/2 升级指南,让你的网站开启极速模式