# ⚡ Servir HTTP/3 HTTP/3 est actif au sens où rien n'est à installer : le serveur ouvre un écouteur QUIC sur UDP 443 dès que l'ensemble de protocoles le permet. Ce qui demande du soin, c'est la vérification, car un client qui retombe silencieusement sur HTTP/2 ressemble exactement à un succès. ## 🧾 Avant de commencer - Un nom qui résout vers l'hôte, et un certificat pour ce nom ([HTTPS](/fr/start/https/)). - **UDP 443 ouvert** dans le pare-feu du fournisseur et celui de l'hôte. QUIC n'a pas de repli : si UDP est bloqué, les clients utilisent HTTP/2 et ne le disent pas. - Un client compatible HTTP/3. Le `curl` système de la plupart des distributions ne l'est pas — le demander est explicite : ```text curl: option --http3: the installed libcurl version doesn't support this ``` ## 🔌 L'activer ```caddyfile { email pingclair@pingclair.com servers { protocols h1 h2 h3 } } example.com { file_server /srv/site } ``` Mesuré sur l'hôte, le site en service : ```bash sudo ss -lunp | grep ':443 ' ``` ```text UNCONN 0 0 *:443 *:* users:(("pingclair",pid=5425,fd=22)) ``` Retirer `h3` de la liste enlève cet écouteur ; la liste est l'interrupteur ([TLS : ce qui se règle](/fr/guides/tls-tuning/#-which-protocols-are-served)). Un site seul peut être sorti de HTTP/3 sans arrêter l'écouteur : ```caddyfile example.com { tls { http3 off } file_server /srv/site } ``` ## ✅ Prouver qu'un client l'a utilisé Le journal d'accès du serveur ne nomme pas le protocole : la preuve vient du client. Tout curl construit avec ngtcp2 ou quiche convient ; un conteneur est le plus rapide sur un hôte dont le curl ne sait pas faire HTTP/3 : ```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` est ce qui laisse le conteneur utiliser le chemin UDP de l'hôte ; sans cela, la requête peut passer par un espace de noms réseau qui bloque QUIC. La première ligne est toute la réponse : la ligne de statut dit `HTTP/3`, pas `HTTP/2`. Demander la même URL avec `--http2` et `--http1.1` montre les deux autres, ce qui prouve que le client ne retombe pas simplement. Quand aucun conteneur n'est disponible, une poignée de main QUIC se vérifie avec l'OpenSSL du système, s'il est 3.5 ou plus récent : ```bash openssl s_client -quic -alpn h3 -connect example.com:443 -servername example.com