10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[小ネタ] 今のCaddy(>=2.6.0)はudp/443が入れば無設定でHTTP/3(QUIC)できます

Last updated at Posted at 2025-02-05

Caddy 2.9.1 時点におけるHTTP/3の実装状況

現時点のCaddy (2.9.1) 時点では特にHTTP/3 (QUIC) を有効化するために 特別なディレクティブを書く必要はなく、デフォルトで有効になっています。

厳密には 2.6.0 (2022-09リリース) からデフォルトでHTTP/3が有効 になっているようです。

そもそも HTTP/3 (QUIC) ってなんだっけ?

QUICはUDP上の伝送プロトコルで、設計がやや古く性能や特性に不満があるTCPの置き換えを狙うものです。TCPでは独立していたTLS(暗号化)の機能もQUICに包含されます。また、通常TCPがOSで実装されているのとは異なり、QUICはユーザーランドで実装されます。OSからは単純なUDPとして認識されます。

TCP上のプロトコルであるHTTPをQUIC上に移植したものがHTTP/3です。Chromeなどメジャーブラウザは全てHTTP/3をサポートしています。

HTTP/1.1 HTTP/2 HTTP/3
多重転送 なし サポート サポート
HOLブロッキング あり TCPレベルで存在 QUICレベルで大幅に軽減
ヘッダ圧縮 なし HPACK QPACK
TLS オプショナル 事実上必須 必須 (QUIC)
伝送プロトコル tcp/80, tcp/443 (TLS) tcp/80, tcp/443 (TLS) udp/443 (QUIC)

今日、普通にWebサーバを構築した場合、セキュリティグループには tcp/80tcp/443 を指定するだけだと思います。この場合はHTTP/2サーバとしてしか動作できません。

実際に Caddy が HTTP/3 を受け付けるかローカルでテストしてみる

https://foobar.localhost で待ち受けるCaddyを立ち上げます。

$ caddy reverse-proxy --from https://foobar.localhost --to :3100

:3100 にリバースプロキシしているので、 hello だけ応答するサーバも :3100 に用意してあげましょう。

$ caddy respond "hello" --listen :3100

これで https://foobar.localhost にアクセスすると hello と応答するサイトが用意できたので、ChromeでアクセスしてHTTP/3が使われるか確認してみます。

とはいえ、デフォルトでChromeはなかなかHTTP/3を使わないようになっているので、以下のように新規に Chrome を立ち上げ、 foobar.localhost:443 へのリクエストはなるべくQUICを使ってもらうようにしてもらいます。

# 以下は macOS での Chrome 立ち上げです
# Windows の場合は chrome.exe に対して同じように --origin-to-force-quic-on=... のフラグを指定してください
$ open -a "Google Chrome" -n --args --origin-to-force-quic-on=foobar.localhost:443

立ち上がったChromeで https://foobar.localhost にアクセスしてみましょう。

image.png

インスペクターの Network / Protocol 欄に h3 が並んでいるのがわかると思います。これがHTTP/3です。

curl でも確認してみます。とはいえ、こちらも macOS の curl (libcurl/8.7.1)は現時点でHTTP/3をサポートしていないので、Dockerのcurlを起動してみます。ただ、これも 公式のcurlイメージ がHTTP/3をサポートしていないので badouralix/curl-http3 で確認します。

# Docker内部からのアクセスなので、 -k --resolve ... が必要となる
# (Docker for Macの実装がマシになったらもうちょっときれいに書けるかも)
$ docker run --rm -it badouralix/curl-http3 \
  curl --http3-only -k -v \
    --resolve foobar.localhost:443:自分のマシンのIPアドレス \
    https://foobar.localhost

* Skipped certificate verification
* Connected to foobar.localhost (自分のマシンのIPアドレス) port 443
* using HTTP/3
* Using HTTP/3 Stream ID: 0
> GET / HTTP/3
> Host: foobar.localhost
> User-Agent: curl/8.2.0-DEV
> Accept: */*
>
< HTTP/3 200
< server: Caddy
< server: Caddy
< content-type: text/plain; charset=utf-8
< date: Wed, 15 Jan 2025 09:44:55 GMT
< content-length: 5
<
* Connection #0 to host foobar.localhost left intact
hello%

HTTP/3 で繋げているようです。

AWS(Lightsail)上にHTTP/3でデプロイしてみる

実際にHTTP/3を受け付けるサーバを立ててみたいと思います。

といっても、以下のような tcp/80 tcp/443 に加えて udp/443 が設定されているサーバを立ち上げるだけです。

image.png

立ち上げたサーバに以下のCaddyfileを記入します。通常の設定と変わるところは一つもありません。

/etc/caddy/Caddyfile
{
    email ksaitou@test.example.net
}

test.example.net {
    respond "hello!"
}

立ち上げたサーバについて、Chrome等でアクセスするか、Nginxが提供しているサービス を使って、HTTP/3導通可能かチェックします。

image.png

特に問題なくHTTP/3で繋げられることが分かります。

まとめ

2.6.0 以降のCaddyを今現在使っている場合は udp/443 を開けるだけで HTTP/3 を今すぐ有効にすることができます。

無理をして有効にする必要もありませんが、有効になっていることによって、特に通信環境が劣悪なモバイル環境においてユーザ体験が向上する可能性があります。今後のWebサーバ構築の際は udp/443 を最初から開いておくことも検討していいでしょう。

関連エントリー

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?