
HTTP/3把原来的TCP+TLS换成用UDP来做的QUIC协议,把可靠的传输、拥塞控制和加密握手都放在一个层次上。在弱网、跨网以及移动网络的情况下,页面的第一个数据包到达时间和整个请求完成的时间之间的差距变小了很多。
QUIC 的加速方式不是通过增加带宽来实现的,而是依靠减少延迟:多个流之间互不干扰,单个流丢包只重传该流;初次建立连接只需一次往返时间(1-RTT),会话复用可以零往返时间(0-RTT)发送请求;用 Connection ID 来标识连接,在 Wi-Fi 切换到 4G 或 5G 网络时不会断开;配合 TLS 1.3 和 QPACK 头部压缩技术,适用于静态资源、API、直播以及电商等高并发场景。
Nginx 1.25+ 已经包含了 ngx_http_v3_module(实验性模块,需要手动启用),源代码编译时推荐使用 OpenSSL 3.5.1+ 或者 BoringSSL/QuicTLS,否则 0-RTT 早期数据的能力会受到限制:
./configure \
--with-http_v3_module \
--with-http_ssl_module \
--with-openssl=/path/openssl \
--with-cc-opt="-I/usr/local/openssl/include" \
--with-ld-opt="-L/usr/local/openssl/lib"
make && make install
最小化站点配置中保留了TCP 443兼容回退以及UDP 443:
server {
listen 443 ssl;
listen 443 quic reuseport;
http2 on;
http3 on;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_certificate /path/fullchain.pem;
ssl_certificate_key /path/privkey.pem;
ssl_early_data on; # 开启 0-RTT(仅安全幂等请求)
add_header Alt-Svc 'h3=":443"; ma=86400' always;
add_header Early-Data $ssl_early_data;
}
首先打开安全组和防火墙之间的 UDP 443 通道,然后进行验证:
nginx -t
systemctl reload nginx
ss -tulnp | grep ':443'
curl --http3 -I https://域名
第一次用HTTP/2的时候,在得到Alt-Svc之后才会进行第二次请求来协商h3。如果使用了CDN的话,那么边缘节点需要单独打开HTTP/3,而源站并不会自动转发该协议体验。
总结
HTTP/3 并不是所有的情况都可以加速,在丢包、抖动和移动切换的情况下效果最好。Nginx 自带的模块已经满足生产环境的要求:双栈监听、TLS 1.3 强制、0-RTT 按需开启、保留 HTTP/2 回退,这是一个比较稳妥的选择。