返回博客

如何启用 HTTP/2(和 HTTP/3):Nginx、Apache、CDN

2025-08-139 分钟阅读

想要更快的加载速度?启用 HTTP/2,如果可能的话,启用 HTTP/3。本指南将展示如何在 Nginx、Apache 和常见 CDN 上启用这两种协议,如何检查它们是否正常工作,以及在它们不工作时的快速修复方法。

为什么选择 HTTP/2(和 HTTP/3)?

HTTP/1.1 会打开多个连接并重复发送头部信息。HTTP/2 则通过一个连接复用请求,并压缩头部信息。HTTP/3 通过 QUIC 协议在 UDP 上运行,避免了传输层阻塞。结果是:加载速度更快,尤其是在移动设备和高延迟的网络上。

快速检查:它们是否已启用?

  • 开发者工具 (DevTools):网络 (Network) 标签页 > 添加“协议 (Protocol)”列。查找 h2 或 h3。
  • 命令行 (CLI)curl -I --http2 https://example.com
  • HTTP/3curl -I --http3 https://example.com(较新版本的 curl)
  • 瀑布图 (Waterfalls):许多文件应该同时在同一个连接上开始加载。

Nginx:启用 HTTP/2(和 HTTP/3)

server {
   # HTTP/2
   listen 443 ssl http2;
   listen [::]:443 ssl http2;

   # 如果您的编译版本支持 QUIC,请取消注释
   # listen 443 quic reuseport;
   # add_header Alt-Svc 'h3=":443"; ma=86400' always;

   server_name example.com;

   ssl_protocols TLSv1.2 TLSv1.3;
   ssl_prefer_server_ciphers off;
   ssl_session_cache shared:SSL:10m;
   ssl_session_timeout 1d;

   add_header Strict-Transport-Security "max-age=31536000" always;
   # 在此处添加您的 SSL 证书配置
}

要求:已编译 HTTP/2 模块,并且 TLS 库支持 ALPN。大多数现代软件包都包含这两者。

Apache:启用 HTTP/2

# 加载模块
LoadModule http2_module modules/mod_http2.so

# 在全局或 vhost 中启用
Protocols h2 http/1.1

# 可选:限制为现代 TLS
H2ModernTLSOnly on

Apache 对 HTTP/3 的支持尚处于实验阶段。生产环境请继续使用 HTTP/2。

CDN:启用 HTTP/2/3(Cloudflare、CloudFront、Akamai、Fastly)

大多数 CDN 都支持 HTTP/2 和 HTTP/3。为 HTTPS 流量启用它们。如果您运行自己的边缘服务器并希望使用 HTTP/3,请打开 UDP/443 端口。如果 UDP 被阻止,客户端将回退到 HTTP/2。CDN 到源站的协议是独立的;如果方便,请使用它,但用户影响主要来自边缘。

Cloudflare

仪表板 (Dashboard) > 速度 (Speed) > 优化 (Optimization) > HTTP/2 和 HTTP/3(默认启用)

AWS CloudFront

分发设置 (Distribution settings) > 支持的 HTTP 版本 (Supported HTTP Versions) > HTTP/2 和 HTTP/3

Fastly

服务配置 (Service configuration) > 设置 (Settings) > HTTP/2 和 HTTP/3 支持

验证 + 回退行为

浏览器在 TLS 握手期间通过 ALPN 自动协商。如果 HTTP/3 失败(UDP 被阻止),它们将回退到 HTTP/2。如果 HTTP/2 失败(旧服务器),它们将使用 HTTP/1.1。无需手动干预。

检查您的设置:

  • 现代浏览器会在开发者工具的协议列中显示 h2/h3
  • 瀑布图显示单个连接上的并行下载
  • H3 通常比桌面设备更能帮助移动/不稳定链接

故障排除

HTTP/2 不工作?

  • 检查您的服务器编译版本是否包含 HTTP/2 模块
  • 验证 TLS 库是否支持 ALPN(OpenSSL 1.0.2+)
  • 确保您是通过 HTTPS 进行测试(浏览器需要它)
  • 检查是否有代理/负载均衡器将其降级为 HTTP/1.1

HTTP/3 不工作?

  • 验证 UDP 端口 443 是否已打开
  • 检查您的编译版本是否支持 QUIC
  • 确认 Alt-Svc 头部是否已发送
  • 从不同的网络进行测试(有些会阻止 UDP)

常见问题解答

我需要 HTTPS 才能使用 HTTP/2 吗?

是的。浏览器仅在 TLS 上使用 HTTP/2。

需要 HTTP/3 吗?

不需要,但如果可以,请启用它。将 HTTP/2 作为回退方案保留。

如何检查 HTTP/2/3 是否已激活?

使用开发者工具的协议列,或运行 curl 并带上 --http2 或 --http3 参数。

为什么启用 HTTP/2 没有带来太大变化?

应用程序的缓慢和网络损耗仍然存在。请对您的应用程序进行缓存和性能分析;对于不稳定链接,请使用 HTTP/3。