NginxでHTTP/3が動いた (Cloudflareパッチ)

2020/060/01 追記
nginx公式版が提供されました。こちらを御覧ください
asnokaze.hatenablog.com


NginxをHTTP/3対応させるパッチがCloudflareから提供されました (CloudflareのHTTP/3ライブラリ Quicheを利用しています。現状ではHTTP/3ドラフト23版の対応になります)
github.com

基本的に、書いてるとおりにやればビルドできるのですが、無事HTTP/3しゃべるところまで確認できました

ビルド

rustインストールしておく

$ curl https://sh.rustup.rs -sSf | sh
$ source $HOME/.cargo/env

書いてあるとおり

$ curl -O https://nginx.org/download/nginx-1.16.1.tar.gz
$ tar xzvf nginx-1.16.1.tar.gz

$ git clone --recursive https://github.com/cloudflare/quiche

$ cd nginx-1.16.1
$ patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch

$ ./configure                              \ # ./configureで実行した
       --prefix=$PWD                           \
       --with-http_ssl_module                  \
       --with-http_v2_module                   \
       --with-http_v3_module                   \
       --with-openssl=../quiche/deps/boringssl \
       --with-quiche=../quiche
$ make

nginx.conf の編集

nginx-1.16.1$ vim ./conf/nginx.conf  #下記を追記

    server {
        listen       4433 quic;
        server_name  localhost;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        ssl_certificate      /path/to/server.crt;
        ssl_certificate_key  /path/to/server.key;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

起動

nginx-1.16.1$ sudo ./objs/nginx 

接続してみる

quicheのサンプルクライアントで接続する (draft-23バージョンでネゴシエーションします)

quiche$ cargo build --examples
quiche$ target/debug/examples/http3-client https://127.0.0.1:4433/index.html --no-verify   |head -n3
<!DOCTYPE html>
<html>
<head>

ちゃんとHTTP/3でアクセスログにも着てる

nginx-1.16.1$ tail ./logs/access.log 
127.0.0.1 - - [16/Oct/2019:18:21:43 +0900] "GET /index.html HTTP/3" 200 612 "-" "quiche"
127.0.0.1 - - [16/Oct/2019:18:21:45 +0900] "GET /index.html HTTP/3" 200 612 "-" "quiche"
127.0.0.1 - - [16/Oct/2019:18:22:19 +0900] "GET /index.html HTTP/3" 200 612 "-" "quiche"

パケットキャプチャもこの通り
f:id:ASnoKaze:20191016190623p:plain