怎么在 Nginx 配置里启用 HTTP/2 协议提升 HTTPS 连接性能

文章导读
在 Nginx 中启用 HTTP/2 协议需要在 HTTPS 监听配置中添加 http2 参数,且必须满足 Nginx 版本不低于 1.9.5 以及 OpenSSL 支持 ALPN 协议。该配置仅对加密连接生效,明文 HTTP 无法启用 HTTP/2,配置错误会导致协议降级为 HTTP/1.1。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 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 监听

怎么在 Nginx 配置里启用 HTTP/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+)发起请求,观察返回头信息。

怎么在 Nginx 配置里启用 HTTP/2 协议提升 HTTPS 连接性能
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 版本限制

怎么在 Nginx 配置里启用 HTTP/2 协议提升 HTTPS 连接性能

必须启用 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 升级指南,让你的网站开启极速模式