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 回退。

笔记加载中…