
BayServer for JavaおよびBayServer for PythonはHTTP/3サーバを動かすことができます。
まずは、以下を参照して必要なライブラリをインストールしてください。
BayServerの設計ファイル
BayServerでは、HTTP/3サーバは自分自身へのプロキシサーバとして動作します。つまり、受け取ったリクエストがHTTPポートに転送されるように設計します。
また、ブラウザをHTTP/3ポートへ誘導するために、HTTP/1(またはHTTP/2サーバ)のサーバへのリクエストの応答にはAlt-Svcヘッダを追加するようにします。この時、「HTTP/3サーバはHTTP/1サーバの代替サーバである」と言います。
例えば、以下のように2020番ポートでHTTP、2024番ポートでHTTPSを受け付けていたとします。
[port 2020]
[port 2024]
[secure]
cert cert/quicui.crt
key cert/quicui.key
以下の3つの設定を加えます。
- 2024番ポート、すなわちHTTPSサーバへのアクセスがあったときに、UDPの2024番ポートに誘導するような設定
- UDPの2024番ポートでHTTP/3サーバを動かす設定
- HTTP/3サーバへのアクセスを2020番ポートにプロキシする設定
具体的には、以下のように変更します。
(リスト中の丸文字番号は上記番号に対応させているだけなので、番号自体は入力しないでください)
[port 2020]
[port 2024]
addHeader Alt-Svc: h3=":2024"; ma=3600 ①
[secure]
cert cert/quicui.crt
key cert/quicui.key
[port :udp:2024] ②
docker h3
[secure]
cert cert/quicui.crt
key cert/quicui.key
[city *] ③
[town /]
[club *]
docker httpWarp
destCity localhost
destPort 2020
destTown /
UNIXドメインソケットを使用する
HTTPポートをUNIXドメインソケットにすることで、プロキシの通信パフォーマンスを向上させることができます。この場合は先ほどの設定から以下の2つの変更をします。
- UNIXドメインソケットのポートを追加
- プロキシの接続先をUNIXドメインソケットのポートに変更
[port :unix:/tmp/hoge] ①
[port 2020]
[port 2024]
addHeader Alt-Svc: h3=":2024"; ma=3600
[secure]
cert cert/quicui.crt
key cert/quicui.key
[port :udp:2024]
docker h3
[secure]
cert cert/quicui.crt
key cert/quicui.key
[city *]
[town /]
[club *] ②
docker httpWarp
destCity :unix:/tmp/hoge
destTown /
HTTP/3サーバーに関する注意事項
BayServerだからと言うわけではなく、一般的にHTTP/3サーバーを動かす場合にはいろいろ注意事項があります。
Chromeでの注意事項
基本的にオレオレ証明書では動かせないと思ってください。
どうしてもオレオレ証明書でも動かしたい場合は、Chromeの起動オプションが必要になります。ただし、HTTP/1(またはHTTP/2)サーバからの誘導(代替サーバとしてのHTTP/3の使用)はできません。
オプション | 機能 |
–origin-to-force-quic-on={Host:Port} | 特定のホストポートに対するアクセスはHTTP/3サーバーにダイレクトに接続する。 |
–ignore-certificate-errors-spki-list={Hash} | 指定したハッシュ値を持つ証明書は信頼する |
証明書のハッシュ値は以下のようにして求めます
$ openssl x509 -noout -pubkey -in {FileName} | openssl pkey -pubin -outform der |
openssl dgst -sha256 -binary | base64
Firefoxでの注意事項
Firefoxは必ずHTTP/1サーバ(またはHTTP/2サーバ)にアクセスし、Alt-SvcヘッダによってHTTP/3サーバにアクセスします。HTTP/3サーバに直接アクセスさせるオプションはありません。
なお、証明書に関する制限はありません。(オレオレ証明書の場合警告は出るが)
代替サーバのホスト、ポート番号に関する制限
HTTP/1(またはHTTP/2)サーバのポート番号とHTTP/3サーバのポート番号は揃っていた方が無難かと。
揃っていない場合の動作はサポートされるのかよく分かりません。もっと言うとホスト名が違う場合の動作がサポートされるのかもよく分かりません。
動かしてみて判断してください。