# ⚡ 提供 HTTP/3 HTTP/3 默认就是可用的:只要协议集合允许,服务器就会在 UDP 443 上打开 QUIC 监听, 不需要安装任何东西。需要小心的是验证 —— 一个悄悄退回 HTTP/2 的客户端,看起来和 成功一模一样。 ## 🧾 开始之前 - 一个解析到本机的域名,以及它的证书([HTTPS](/zh-CN/start/https/))。 - 在服务商防火墙和主机上都**开放 UDP 443**。QUIC 没有回退:UDP 被挡住时,客户端 用 HTTP/2,而且不会告诉你。 - 一个支持 HTTP/3 的客户端。多数发行版自带的 `curl` 不支持,直接要它会明说: ```text curl: option --http3: the installed libcurl version doesn't support this ``` ## 🔌 开启 ```caddyfile { email pingclair@pingclair.com servers { protocols h1 h2 h3 } } example.com { file_server /srv/site } ``` 站点运行中,在主机上实测: ```bash sudo ss -lunp | grep ':443 ' ``` ```text UNCONN 0 0 *:443 *:* users:(("pingclair",pid=5425,fd=22)) ``` 把 `h3` 从列表里去掉,这个监听就消失;那个列表就是开关 ([TLS 能调什么](/zh-CN/guides/tls-tuning/#-which-protocols-are-served))。也可以 在不停止监听的情况下,把单个站点移出 HTTP/3: ```caddyfile example.com { tls { http3 off } file_server /srv/site } ``` ## ✅ 证明客户端用了它 服务器的访问日志不会写明协议,所以证据来自客户端。任何用 ngtcp2 或 quiche 构建的 curl 都行;在只有不支持 HTTP/3 的 curl 的主机上,用容器最快: ```bash docker run --rm --network host \ ymuski/curl-http3 curl -sI --http3 https://example.com/ ``` ```text curl 8.2.1-DEV (x86_64-pc-linux-gnu) libcurl/8.2.1-DEV BoringSSL zlib/1.2.13 nghttp2/1.52.0 quiche/0.18.0 ``` ```text HTTP/3 200 content-type: text/html; charset=utf-8 etag: "5e-6ab20622" accept-ranges: bytes x-served-by: pingclair server: Pingclair ``` `--network host` 让容器使用主机的 UDP 路径;不加的话,请求可能经过一个阻断 QUIC 的 网络命名空间。 第一行就是全部答案:状态行写的是 `HTTP/3`,不是 `HTTP/2`。用 `--http2` 和 `--http1.1` 请求同一个 URL 会显示另外两个,从而证明客户端并不是在悄悄回退。 无法使用容器时,可以用系统的 OpenSSL(3.5 或更新)检查 QUIC 握手: ```bash openssl s_client -quic -alpn h3 -connect example.com:443 -servername example.com