[編集者:NGINXは、QUICを使用したHTTP/3を正式にサポートするようになりました。オープンソースユーザー向けにはNGINX 1.25.1メインライン版、エンタープライズのお客さま向けにはNGINX Plus R30の一部として提供されています。]
[ngx_snippet name=’table-style-blog’]
このたび、QUIC+HTTP/3に対応したNGINXのプレビュー実装が、2つのディストリビューション向けにビルド済みバイナリパッケージとして提供開始されたことをお知らせします。
- Red Hat Enterprise Linux 9およびバイナリ互換の派生ディストリビューション
- Ubuntu 22.04
このバイナリは、プレビュー実装をホストする別のquicブランチにあるnginx-quicリポジトリから提供される最新の成果物です。F5がNGINXでQUIC+HTTP/3の開発に着手して以来、引き続きダウンロードしてビルドすることで、QUIC+HTTP/3に対応し、QUICをサポートするSSL/TLSライブラリを選択できるNGINX Open Sourceを利用できます。このコードは試験的とされていますが、複数のコミュニティメンバーから、nginx-quicを本番環境で問題なく使用しているとの報告が寄せられています。
ビルド済みバイナリをリリースする主な目的は、QUIC+HTTP/3を使用したNGINXのテストをより迅速かつ容易にすることです。このバイナリを使用すれば、ソースからコンパイルする必要がなく、標準のパッケージ管理ツールでインストールできます。
本稿執筆時点では、オープンソースのSSL/TLSにおける事実上の標準であるOpenSSLはQUICをサポートしていません。そのため、バイナリディストリビューションは、依存関係として自動的にインストールされるquictlsライブラリパッケージを使用してビルドしています。現時点で安定性、互換性、機能のバランスが最も優れていることから、quictlsを採用しました。
バイナリディストリビューションのインストール手順については、NGINX QUIC Webサイトをご覧ください。
QUIC+HTTP/3向けのNGINXの設定
NGINXでQUIC+HTTP/3を構成するための新しいディレクティブがいくつか追加されていますが、既存の仮想サーバー(server{})構成ブロック内で、HTTP/1.1およびHTTP/2用のディレクティブと簡単に組み合わせることができます。
機能する最も基本的な構成にするには、server{}ブロック(およびその子location{}ブロック)に3つのディレクティブを含めるだけです。
| ディレクティブ | 説明 |
|---|---|
listen 443 quic reuseport; | NGINXがHTTP/1.1およびHTTP/2と同じポート(ここでは 443)でHTTP/3接続を待ち受けるように、 複数のNGINXワーカープロセスがある場合に正しく動作させるには、 |
ssl_protocols TLSv1.3; | QUICの要件に従い、受け入れるプロトコルのリストにTLS 1.3を含めます。(このディレクティブはすでに設定に含まれている可能性がありますが、必要に応じて追加してください。) 幅広いブラウザーをサポートするには、以前のバージョンのTLSも含める必要があると考えられます。TLS 1.3のブラウザーサポートについては、Can I use TLS 1.3?を参照してください。 |
add_header Alt-Svc 'h3=":$server_port"; ma=86400'; | このディレクティブを追加すると、QUICへのアップグレードが可能であることと、接続先のポートをブラウザーに通知するレスポンスヘッダーがNGINXによって追加されます。 慣例上、このポート(ここでは
|
以下は、server{}ブロックの例です。
server { # for better compatibility we recommend
# using the same port number for QUIC and TCP
listen 443 quic reuseport; # QUIC
listen 443 ssl; # TCP
ssl_certificate certs/example.com.crt;
ssl_certificate_key certs/example.com.key;
ssl_protocols TLSv1.3;
location / {
# advertise that QUIC is available on the configured port
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
#proxy_pass <upstream_group>;
#root /<root_directory>;
}
}新たに追加されたオプションのHTTP/3関連ディレクティブと変数(上記のスニペットには記載されていません)には、次のものがあります。
$http3–(変数)リクエストがHTTP/3セッション中に送信された場合はh3に設定されます(それ以外の場合は空文字列です)。quic_retry–(ディレクティブ)onに設定すると、リクエスト元のIPアドレスを検証するため、使用する新しい接続IDを指定したQUIC再試行メッセージをリクエスト元に返すようNGINXに指示します。QUICはUDP上で動作するため、TCPの3ウェイ接続ハンドシェイクによる接続の検証は行えません。QUIC再試行パケットは、この制約を部分的に補います。ssl_early_data–(ディレクティブ)onに設定すると、同じクライアントから以前に接続があった場合、新しいTLS 1.3接続を介してクライアントが送信する最初のリクエストで、NGINXがアプリケーションデータを受け入れます。これはゼロラウンドトリップタイム(0‑RTT)接続再開と呼ばれます。「アーリーデータ」の送信サポートはTLS 1.3の機能です。TLSハンドシェイクに必要な追加のラウンドトリップメッセージ交換をなくすことで、QUIC+HTTP/3のパフォーマンス向上に寄与します。注:0‑RTT接続再開では、アーリーデータにリプレイ攻撃を受ける可能性があります。これは、アーリーデータにGET以外のHTTPリクエストメソッドが含まれている場合にセキュリティリスクとなるためです。詳細については、F5ブログのTLS 1.3に関するセクション(Announcing NGINX Plus R17)をご覧ください。
この図は、QUIC+HTTP/3で0‑RTT接続再開を使用すると、NGINXへのQUIC接続を再開する際にクライアントが最初のメッセージでHTTPリクエストを送信できるため、パフォーマンスが向上する仕組みを示しています。一方、TLSを使用するTCPでは、安全な接続を確立するために、クライアントがNGINXとのTLSハンドシェイクを新たに実行する必要があり、追加で数回のラウンドトリップが発生します。

新しいディレクティブと変数の詳細については、3. Configurationのnginx-quic READMEセクションを参照してください。
QUIC+HTTP/3を使用したNGINXのテスト
前述のとおり、ビルド済みバイナリをリリースする目的の1つは、NGINXがHTTP/3トラフィックを正しく処理しているかどうかを容易にテストできるようにすることです。簡単なコマンドラインテストでは、HTTP/3をサポートするようにcurlをビルドするか、ビルド済みコンテナを使用できます。また、ほとんどのブラウザの新しいバージョンはQUIC+HTTP/3をサポートしています。
QUICを有効にしたサイトがブラウザーからのHTTP/3接続リクエストに応答していることを確認するには、ブラウザーの開発者ツールを使用して、NGINXから返されるHTTPヘッダーを調べます。ブラウザーからTCP経由で送信された最初のHTTPリクエストに対するNGINXのレスポンスに、Alt-Svcヘッダー(前述)が含まれていれば、QUIC+HTTP/3は正しく実装されています。
この時点で、QUIC対応ブラウザーはAlt-Svcディレクティブで指定されたポートにQUIC接続を確立し、それ以降のHTTPリクエストとレスポンスはQUIC経由で送受信されます。QUIC+HTTP/3が使用されていることを確認する別の方法として、もう1つadd_headerディレクティブを追加し、カスタムHTTPヘッダーの値を$server-protocol変数で取得したプロトコルに設定できます。ヘッダーの値が、QUIC接続の確立前のHTTP/1.xから、QUIC使用時のHTTP/3.0へ変化することを追跡できます。
カスタムHTTPヘッダーをlocationブロックでX-protocolに設定する例を次に示します。
location / { # advertise that QUIC is available on the configured port
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
# signal whether we are using QUIC+HTTP/3
add_header X-protocol $server_protocol always;
#proxy_pass <upstream_group>;
#root /<root_directory>;
}別の方法として、Chromeの「HTTP Indicator」拡張機能のように、使用中のプロトコルを視覚的に示すツールもあります。(これは特定のブラウザー拡張機能を推奨するものではありません。拡張機能によって生じる可能性のあるセキュリティ上の影響が、ご自身の状況に照らして許容できるかどうかを確認してください)。
次のステップ
今後数週間にわたり、QUIC+HTTP/3向けソリューションの提供を継続するとともに、NGINXの最適化例をさらにご紹介します。それまでの間、今後の判断に役立てるため、皆さまが実施したテストの結果をぜひお寄せください。フィードバックは、NGINX開発メーリングリストおよび#quic‑http3チャンネル(NGINX Community Slack)で共有できます。
QUIC+HTTP/3に関する取り組みの最新情報(次の重要なマイルストーンである、nginx-quicリポジトリのNGINX Open Sourceメインラインブランチへの統合を含む)を受け取るには、NGINXアナウンスメーリングリストにご登録ください。
ウェビナーを視聴
また、2023年4月19日(水)に開催予定のウェビナー「NGINXとQUIC+HTTP/3を実際に体験」にも、ぜひご参加ください。
著者について

関連するブログ記事
チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。
AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。
JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。
F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。
NGINX PlusによるAWS Auto Scalingグループの負荷分散
新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります