如何启用 HTTP/2(和 HTTP/3):Nginx、Apache、CDN
想要更快的加载速度?启用 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/3:
curl -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。