HTTP/3 配置与调优
HTTP/3 基于 QUIC(UDP),与 HTTP/2 共享 443 端口。客户端首次通过 HTTP/2 连接,服务器通过 Alt-Svc 头广播 HTTP/3 支持,后续请求升级。
启用 HTTP/3
HTTP/3 默认随 HTTPS 自动启用,无需额外配置:
toml
[[sites]]
listen_tls = [443]
acme_email = "your@email.com"
# protocols 默认 = ["h3", "h2", "http/1.1"],h3 自动启用禁用 HTTP/3
toml
[sites.tls]
protocols = ["h2", "http/1.1"] # 不含 h3完整 HTTP/3 调优配置
toml
[sites.tls.http3]
# ─── 连接级限流 ──────────────────────────────────────────────────
max_handlers = 0 # 最大并发 QUIC 连接数(0 = 自动检测,支持热更新)
# ─── 并发控制 ────────────────────────────────────────────────────
max_concurrent_bidi_streams = 200 # 单连接最大并发双向流(默认 200)
max_concurrent_uni_streams = 100 # 单连接最大并发单向流(默认 100)
# ─── 超时 ────────────────────────────────────────────────────────
idle_timeout_ms = 30000 # 空闲连接超时(毫秒,默认 30s)
keep_alive_interval_ms = 10000 # Keep-Alive PING 间隔(毫秒,默认 10s)
# ─── 流量控制窗口 ────────────────────────────────────────────────
receive_window = 8388608 # 连接级接收窗口(字节,默认 8MB)
stream_receive_window = 2097152 # 流级接收窗口(字节,默认 2MB)
send_window = 8388608 # 连接级发送窗口(字节,默认 8MB)
# ─── 连接优化 ────────────────────────────────────────────────────
enable_0rtt = false # 0-RTT Early Data(默认关闭,存在重放攻击风险)
mtu_discovery = true # PMTU 探测(默认开启,优化大包传输)
initial_rtt_ms = 333 # 初始 RTT 估算(毫秒,quinn 默认值)
max_ack_delay_ms = 25 # 最大 ACK 延迟(毫秒,RFC 9000 默认值)连接级内存限流
max_handlers 控制全局最大并发 QUIC 连接数,防止高并发大文件传输时 OOM:
toml
[sites.tls.http3]
# 最大并发 QUIC 连接数(0 = 自动检测)
# 自动计算公式:可用内存 × 80% / 16MB / worker 线程数
# 每个 QUIC 连接缓冲最多 send_window 字节,此限制防止内存爆炸
# 超出时新连接排队等待,不会被拒绝
# 支持热更新:通过 Admin API 重载配置后立即生效
max_handlers = 0| 可用内存 | 自动值(2 核) | 自动值(4 核) |
|---|---|---|
| 512MB | ~12 | ~6 |
| 1GB | ~25 | ~12 |
| 2GB | ~51 | ~25 |
| 8GB | ~204 | ~102 |
Nginx 没有等价配置项,同场景也会 OOM。Sweety 的
max_handlers提供比worker_connections更精细的 H3 内存控制。压测场景建议手动设置较高的值(如
max_handlers = 200),避免自动计算过于保守。
调优建议
高并发场景
toml
[sites.tls.http3]
max_concurrent_bidi_streams = 500
receive_window = 16777216 # 16MB
stream_receive_window = 4194304 # 4MB
send_window = 16777216 # 16MB高延迟网络(跨国/移动网络)
toml
[sites.tls.http3]
idle_timeout_ms = 60000 # 延长空闲超时
keep_alive_interval_ms = 15000 # 延长 Keep-Alive 间隔
initial_rtt_ms = 100 # 手动设置较小初始 RTT(已知延迟时)启用 0-RTT(提升首请求速度)
⚠️ 0-RTT 存在重放攻击风险,仅对幂等(GET/HEAD)请求安全
toml
[sites.tls.http3]
enable_0rtt = true防火墙配置
HTTP/3 使用 UDP 443,必须放行:
bash
# iptables
iptables -A INPUT -p udp --dport 443 -j ACCEPT
# nftables
nft add rule inet filter input udp dport 443 accept
# firewalld
firewall-cmd --add-port=443/udp --permanent && firewall-cmd --reload
# ufw
ufw allow 443/udp验证 HTTP/3
bash
# 使用 curl(需要 curl >= 7.88 并编译了 HTTP/3 支持)
curl -I --http3 https://your.domain.com
# 响应头应包含
# alt-svc: h3=":443"; ma=86400
# 查看实际使用的协议
curl -I --http3 -w "%{http_version}\n" https://your.domain.com浏览器验证:打开 Chrome DevTools → Network → Protocol 列,应显示 h3。