Skip to content

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

基于 Apache License 2.0 发布