nginxとquicheでHTTP/3対応Webサーバーを構築する

数か月前にやったことですが、思い出しながら再度ビルドしました。

リンクはhttps://mimoex.net:4433/です。

検証用マシンのOSはCentOS8です。

コマンドとして入力するファイル名のバージョン番号などはアスタリスクになっていますのでその時に応じて変えてください。

nginxとquicheのソースコードをDLする。

nginx.orgから最新版のソースコードを落としてきて、解凍する。

# curl -O https://nginx.org/download/nginx-*.tar.gz
# tar xvzf nginx-*

githubからquicheのソースコードを落とす。

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

quicheのパッチを貼る。

# cd nginx-*
# patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch

ビルドに必要なライブラリをインストール

# dnf group install "Development Tools"
# dnf install pcre-devel cmake cargo

CentOS8でDevelopment Toolsをインストールするとrustが入りますが、バージョンが古いので

attributes are not yet allowed on `if` expressions

というエラーが出てquicheのnginxをビルドできません。

ということで最新版のrustをインストールします。

すでに古いバージョンのrustが入っている場合はアンインストールしましょう。

# dnf remove rust

最新版のrustは公式サイトに記載されている方法が容易です。

https://www.rust-lang.org/tools/install

# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/envrustc --version
# source $HOME/.cargo/env
# rustc --version
rustc 1.48.0 (7eac88abb 2020-11-16)

1.43.0以上であれば問題らしいっぽいです。

ビルドを行う

ngnixには便利なモジュールをインストール時に選択できますが、HTTP/3を使いたいだけなのでgithubのREADMEどおりにconfigureします。

# ./configure \
--prefix=$PWD \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_v3_module \
--with-openssl=../quiche/deps/boringssl \
--with-quiche=../quiche

いろいろやってみたい場合は–helpで引数を見てください。

configureは少々時間がかかります。終わったらmakeします。

makeはもっと時間がかかります。

# make

confファイルを設定する

confファイルの作り方は多くの方が記事を量産しているので詳しくは書きません。

# cd conf
# cp nginx.conf nginx.conf.orign
# nano nginx.conf

server { 下部の

listen 80;

から

location/ {

前までを次のように書き換える。

listen 443 quic reuseport;
listen 443 ssl http2;
server_name _;
ssl_certificate /証明書のパス/fullchain.pem;
ssl_certificate_key  /証明書のパス/privkey.pem;
ssl_protocols TLSv1.3;
proxy_request_buffering off;
add_header alt-svc 'h3-29=":443"; ma=86400';

Let’s Encryptで証明書を取っている場合はこんな感じだと思います。

また、既存のWebサーバなどで443番ポートが使われている場合は適宜変えてください。

また、公開したいルートディレクトリの設定も行ってください。

systemdを使う

# nano /etc/systemd/system/nginx-quiche.service

新規にファイルを作成し、次のように記述します。

[Unit]
Description=The NGINX HTTP/3 and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/root/http3-nginx/nginx-1.19.5/logs/nginx.pid
ExecStartPre=/root/http3-nginx/nginx-1.19.5/objs/nginx -t
ExecStart=/root/http3-nginx/nginx-1.19.5/objs/nginx
ExecReload=/root/http3-nginx/nginx-1.19.5/objs/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
# systemctl start nginx-quiche

で起動させます。

エラーが出たら

# systemctl status nginx-quiche

で様子を見ます。

今回は”logs”ディレクトリがなかったのでエラーが出ました。

# mkdir logs
# systemctl start nginx-quiche
# systemctl enable nginx-quiche

あとはIPアドレスなりを入力してページが見れると思います。

感想

結構簡単にQUICに対応したWebサーバを建てることができます。

現状ではBoringSSLを使ってQUICを実装してるぽいですが、HTTP/3以降ではOpenSSLを辞めるんですかね…

2010年代に大規模な脆弱性が見つかり信頼性が揺らいでいるOpenSSLはこれからどうなるのでしょうか…

参考文系

https://www.rust-lang.org/tools/install

https://github.com/cloudflare/quiche/tree/master/extras/nginx

https://blog.cloudflare.com/experiment-with-http-3-using-nginx-and-quiche/

https://www.nginx.com/resources/wiki/start/topics/examples/systemd/