Nginx HTTP/2 与 HTTP/3
HTTP/2 在一条 TCP 连接上多路复用多个请求,配合头部压缩大幅减少网络往返与流量;HTTP/3 更进一步,改用基于 UDP 的 QUIC 协议。两者都能明显提升 HTTPS 网站的加载速度,是现代站点的标配。
HTTP/2 解决了什么问题
HTTP/1.1 同一连接只能串行处理请求,浏览器虽可开多条连接,仍受"队头阻塞"困扰。HTTP/2 的改进如下:
| 特性 | 说明 |
|---|---|
| 多路复用 | 一条连接上并发传输多个请求/响应,互不阻塞 |
| 头部压缩 | 用 HPACK 压缩重复的请求头,显著减少流量 |
| 二进制分帧 | 数据以帧为单位传输,解析更高效 |
| 服务器推送 | 主动推送资源(浏览器兼容一般,生产慎用) |
注意:nginx 只在 TLS 连接上启用 HTTP/2,因此必须先配好 HTTPS 才能使用。
确认已编译 http_v2 模块
HTTP/2 模块默认不编入二进制,多数发行版软件包已开启,可用 nginx -V 确认:
nginx -V 2>&1 | tr ' ' '\n' | grep http_v2
# 输出:--with-http_v2_module (无输出则需重新编译或更换软件包)
启用 HTTP/2(两种写法)
nginx 1.25.1 之前用 listen 指令的 http2 参数;1.25.1 起新增 http2 指令,推荐按下面的新写法配置:
server {
listen 443 ssl; # 1.25.1 及以后的推荐写法
http2 on; # 在 server 内单独开启 HTTP/2
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
}
旧写法在 1.25.1 之前是唯一方式,新版本仍兼容但会打印弃用警告,建议逐步迁移:
listen 443 ssl http2; # 1.25.1 之前的写法(老版本只能这样写)
校验语法并重载后,用带 HTTP/2 支持的 curl 验证:
nginx -t && nginx -s reload
curl -sI --http2 https://example.com -o /dev/null -w '%{http_version}\n'
# 输出:2
也可以打开浏览器开发者工具(F12),Network 面板协议列显示 h2 即已生效。
HTTP/3 与 QUIC
HTTP/3 基于 QUIC(UDP),TLS 握手与建连合并,弱网环境下连接建立更快。nginx 自 1.25.0 起实验性支持 HTTP/3,需编译 --with-http_v3_module 且 TLS 库支持 QUIC(如 OpenSSL 3.2+、QuicTLS、BoringSSL):
server {
listen 443 ssl; # TCP 443,兼容不支持 QUIC 的客户端
listen 443 quic reuseport; # UDP 443,承载 HTTP/3 流量
http2 on;
http3 on; # 显式开启 HTTP/3
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
add_header alt-svc 'h3=":443"; ma=86400' always; # 告知浏览器可尝试 h3
}
说明:reuseport 让多 worker 共享同一 UDP 端口以提升收包性能,内核不支持时可去掉;务必保留 TCP 监听作降级通道,避免网络屏蔽 UDP 时站点无法访问。
小结
HTTP/2 在 HTTPS 之上开箱即得:确认编译了 http_v2 模块,用 http2 on(1.25.1+)或 listen 443 ssl http2(旧版)即可启用。想进一步提速可尝试 HTTP/3,但需自行编译带 quic 支持的版本,并保留 TCP 回退。