NginxでKTLSとQUICの実装

サーバーエンジニア

今回はNginxでKTLSとQUICを実装します。

これらを実装することにより、汎用的にサイトを高速化できます。

汎用的にと書いてしまいましたが、下記条件を想定しています。

  • UDP通信を許可していない場所はHTTP/3は使われずHTTP/2が使われます。※案外多い
  • HTTP/3が使えるのならそちらで高速化したい

KTLSとは

KTLSとはカーネルTLSのことです。

LinuxのカーネルにTLSモジュールが4.13より実装されています。※4.17以上を使うようにしましょう。OpenSSLが対応していないため

OpenSSL 3.0.0を使用することにより、KTLSが利用できるようになりました。

KTLSとNginxとOpenSSLを使用するとユーザースペースとカーネル間のコピー操作の必要性が大幅に減少するため、

パフォーマンスが向上します。

BoringSSLはKTLSを実装しておらず、OpenSSLはQUICに対応していないため、quictlsを使用したいと思います。

ではさっそくNginxのブログを参考にさっそく実装していきたいと思う。

検証する環境

KTLSモジュールの有効化

■ modinfoでTLSを確認
[root@red-admin ~]# modinfo tls
filename:       /lib/modules/4.18.0-348.el8.0.2.x86_64/kernel/net/tls/tls.ko.xz
alias:          tcp-ulp-tls
alias:          tls
license:        Dual BSD/GPL
description:    Transport Layer Security Support

■ modprobeでTLSを有効化
[root@red-admin ~]# modprobe tls

■ ロードの確認
[root@red-admin ~]# lsmod |grep tls
tls                   102400  0

■ OS起動時にもTLSが有効化されるように設定
[root@red-admin ~]# echo tls > /etc/modules-load.d/tls.conf

OpenSSLのインストール

git clone https://github.com/quictls/openssl.git

Nginxのビルド

オプション
■ Nginx-qucブランチよりファイル取得
$ hg clone -b quic https://hg.nginx.org/nginx-quic && cd nginx-quic/

■ Nginxのビルド
$./auto/configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx \
--with-compat --with-file-aio --with-threads --with-http_addition_module \
--with-http_auth_request_module --with-http_dav_module --with-http_flv_module \
--with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module \
--with-http_random_index_module --with-http_realip_module --with-http_secure_link_module \
--with-http_slice_module --with-http_stub_status_module --with-http_sub_module --with-mail \
--with-mail_ssl_module --with-stream --add-module=/home/redadmin/src/ngx_brotli \
--with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module \
--with-http_ssl_module --with-http_v2_module --with-http_v3_module \
--with-cc-opt='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC' \
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -no-pie' \
--with-openssl=/home/redadmin/src/openssl --with-debug --with-openssl-opt=enable-ktls

$ make

$sudo make install

動作確認

Nginxの確認

[redadmin@red-admin src]$ nginx -V
nginx version: nginx/1.21.4
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-4) (GCC)
built with OpenSSL 3.0.0+quic 7 sep 2021
TLS SNI support enabled

KTLSの確認

※エラーログをdebugモードで確認

$ sudo cat nginx-error.log | grep -a "BIO"

2021/12/11 21:15:50 [debug] 69927#69927: *2750 BIO_get_ktls_send(): 1
2021/12/11 21:21:32 [debug] 69927#69927: *2760 BIO_get_ktls_send(): 1

「BIO_get_ktls_send」が出力されているため、ktlsは動いているようです。

Nginxのブログによるとサイトは2割くらい高速化したそうです。

参考サイト

Improving NGINX Performance with Kernel TLS and SSL_sendfile( ) - NGINX
NGINX Open Source 1.21.4 introduces support for kernel TLS (kTLS), which boosts performance by significantly reducing the need to copy data between user space a...

コメント