宣告支持不等于实际可用
服务器在 Alt-Svc 响应头中宣告支持 HTTP/3,客户端通过 HTTP/1.1 或 HTTP/2 接收该响应头。这个响应头只是一项承诺。HTTP/3 通过 UDP 上的 QUIC 运行,因此即使 UDP 完全被阻止,页面仍可能正常加载,浏览器也会不作提示地继续使用 HTTP/2.
curl -sI https://server.example/ | grep -i alt-svc确认实际传输
只有通过 QUIC 完成的请求才能确认 HTTP/3. 请使用编译时启用了 HTTP/3 支持的 curl;许多系统软件包没有这项支持,此时选项会被拒绝,这并不能说明服务器有问题。在浏览器中打开开发者工具,查看协议列,这类请求会显示 h3。首次访问时浏览器可能使用 HTTP/2,因此请重新加载页面。
curl -V | grep -i http3
curl -sS --http3-only -o /dev/null -w '%{http_version}\n' https://server.example/检查 NGINX 配置
NGINX 除了 TCP 监听器,还需要 QUIC 监听器,所用版本及其构建也必须支持 QUIC。必须使用 TLS 1.3,因为 QUIC 直接使用它。重新加载前先检查配置。Alt-Svc 中的 ma 值表示客户端记住这项承诺的时长,单位为秒,因此测试时应设置较短的时间。
listen 443 ssl;
listen 443 quic reuseport;
http2 on;
add_header Alt-Svc 'h3=":443"; ma=300' always;
nginx -V 2>&1 | grep -o with-http_v3_module
sudo nginx -t在整条路径上放行 UDP 443
最常见的失败原因是防火墙只允许 TCP 443,而不允许 UDP 443。检查服务器及所有外部过滤器。可以在服务器上确认套接字是否正在监听。一些企业网络和公共网络会有意阻止 QUIC,因此在一个网络中测试失败,并不能证明服务器有问题:请换一个网络重试。
sudo ss -lunp | grep ':443'
sudo ufw allow 443/udp
sudo tcpdump -ni any udp port 443新协议更快吗?
HTTP/3 对存在丢包或需要切换网络的连接帮助最大,因为一个丢失的数据包不会阻塞其他流。在良好的有线连接上,差异可能很小,而服务器的 CPU 使用率可能更高。应根据自己的实际情况测量,不要假定一定会更快,并为无法使用 UDP 的客户端保留 HTTP/2。
CH-J Server Manager 中的 HTTP/3 测试
Server Diagnostics 自带 HTTP 客户端,因此测试不依赖系统的 curl。只有完成 QUIC 传输后,它才会报告 HTTP/3 已确认,并且只将 Alt-Svc 视为支持宣告。如果 UDP 超时,它会提示服务器支持情况仍未验证,因为问题可能出在您与服务器之间的网络上;回退到其他协议不会被算作成功。