2021年5月5日水曜日

nginx-quic をビルドしてみた

nginx-quic をビルドしてみた

概要

nginx でも本格的に QUIC サポートが始まっており現在かなり使えるレベルにまでなっているので試してみました
Vagrant で構築した Ubuntu 18.04 上でビルドします

環境

  • Ubuntu 18.04
    • cmake 3.10
    • ninja 1.8.2
    • golang 1.10
  • Chrome 90.0.4430.85
  • nginx-quic 1.19.10
  • boringssl (revision: fe3b185e5d46e643727cbf3e7cb1edcb394f1317)

依存パッケージのインストール

  • sudo apt -y install mercurial ninja-build cmake build-essential g++ golang libpcre3 libpcre3-dev zlib1g-dev

自分の環境は上記で足りましたが他に足りないパッケージがある場合は適宜インストールしてください
OpenSSL のライブラリがないと言われる場合は後述する boringssl のビルドがうまくいっていない可能性があります

boringssl のビルド

nginx-quic のビルド

  • hg clone -b quic https://hg.nginx.org/nginx-quic
  • cd nginx-quic
  • ./auto/configure --with-debug --with-http_v3_module --with-cc-opt="-I../boringssl/include" --with-ld-opt="-L../boringssl/build/ssl -L../boringssl/build/crypto"
  • make
  • sudo make install

nginx のバイナリは /usr/local/nginx/sbin/nginx に配置されます

(Optional) サーバ証明書の作成

動作確認用の自己証明書を作成します
すでに適当なサーバ SSL 証明書がある場合はそれで代用可能です

https://hawksnowlog.blogspot.com/2021/01/how-to-generate-client-certs-on-ubuntu.html#optional-サーバ証明書の作成

nginx 起動

QUIC をオンにした nginx の設定ファイルを作成し起動します

  • cat /usr/local/nginx/conf/nginx.conf
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    log_format quic '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" "$quic" "$http3"';

    access_log logs/access.log quic;

    server {
        listen 8443 http3 reuseport;
        listen 8443 ssl;

        ssl_certificate     /etc/nginx/certificates/domain.com.crt;
        ssl_certificate_key /etc/nginx/certificates/domain.com.key;
        ssl_protocols       TLSv1.3;

        location / {
            add_header Alt-Svc '$http3=":8443"; ma=86400';
        }
    }
}
  • sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

動作確認

http3 が使える curl クライアントを使います
QUIC が使えるクライアントはいろいろありますのでお好きなものを使ってください

これで「HTTP/3 200」と表示されれば OK です
ちなみに nginx のログを見るとちゃんと HTTP3 で通信しているのが確認できます

  • tail -f /usr/local/nginx/logs/access.log
172.17.0.2 - - [29/Apr/2021:12:04:56 +0000] "GET / HTTP/3.0" 200 790 "-" "curl/7.76.1-DEV" "quic" "h3-29"

以下の動作確認方法 ERR_QUIC_PROTOCOL_ERROR となりできません
おそらく自己証明書などの関係かなと思います

chrome を使って quic でレスポンスされているか確認してみましょう
Chrome で QUIC をオンにして再起動します

  • chrome://flags/#enable-quic

https://192.168.100.10:8443/

NET::ERR_CERT_INVALID で先に進めない場合は「thiisunsafe」をタイプしましょう

最後に

設定ファイルなどもそのまま流用できますし QUIC でないクライアントの場合は HTTP2/1.1 で返してくれるのでかなり使えそうです
ただ自分でバイナリをビルドする必要があるのでそこがまだ面倒かなと思います

docker などで公式がリリースしてくれる日も近いかもしれません

参考サイト

0 件のコメント:

コメントを投稿