ブログ | NGINX

NGINX Plus R32 の発表

NGINX-F5 水平黒タイプ RGB の一部
プラバート・ディクシット サムネイル
プラバート・ディクシット
2024年5月28日公開

NGINX Plus リリース 32 (R32) の提供開始を発表できることを嬉しく思います。 NGINX オープンソースをベースにした NGINX Plus は、唯一のオールインワン ソフトウェア Web サーバー、ロード バランサー、リバース プロキシ、コンテンツ キャッシュ、API ゲートウェイです。

NGINX Plus R32 の新機能と強化された機能は次のとおりです。

  • SSL 証明書キャッシュ— NGINX Plus R32 では、SSL 証明書/キー ペアが繰り返される場所が多数ある構成の場合に、NGINX の起動時間とメモリ使用量が大幅に改善されました。
  • Stream_pass モジュール— NGINX Plus R32 では、ストリーム モジュールがルーターとして機能するようになり、接続をストリーム モジュールから http、メールなどの他のモジュールに条件付きで渡したり、ストリーム自体に戻したりできるようになりました。
  • NGINX Plus 公式コンテナ イメージ— NGINX Plus R32 では、特権コンテナ ランタイムと非特権コンテナ ランタイムの両方で公式 NGINX Plus コンテナ イメージが利用できるようになりました。 さらに、どちらの展開方法にも、NGINX 管理プレーン ソリューションとのシームレスな統合を可能にするコンパニオン デーモンである NGINX エージェントを含むオプションのコンテナー イメージが付属しています。

このリリースの最後を飾るのは、NGINX オープンソースから継承された新機能とバグ修正、および NGINX JavaScript モジュールの更新です。

行動における重要な変化

注記: NGINX Plus R31 以外のリリースからアップグレードする場合は、現在のバージョンとこのバージョン間のすべてのリリースについて、以前の発表ブログ「動作の重要な変更」セクションを必ず確認してください。

OpenTracing モジュールの廃止

NGINX Plus R18 で導入された OpenTracing モジュールは非推奨となり、NGINX Plus R34 では削除対象としてマークされています。 それまでは、関連パッケージはすべての NGINX Plus リリースで利用可能になります。 OpenTracing モジュールの使用を、 NGINX Plus R29で導入されたOpenTelemetry モジュールに置き換えることを強くお勧めします。

ModSecurityモジュールの削除

ModSecurity モジュールは 2024 年 3 月 31 日にサポートが終了しました。 その結果、modsec パッケージは NGINX Plus リポジトリから削除され、今後は NGINX Plus リポジトリから利用できなくなります。

PGP キーの更新

NGINX オープンソースおよび NGINX Plus パッケージは、PGP キーを使用して署名されます。 このキーは 2024 年 6 月 16 日に有効期限が切れるように設定されています。 既存のパッケージを 2024 年 6 月 16 日以降も引き続き検証できるように、キーの有効期限を更新しました。 今後のリリースのパッケージに署名するための新しいキー ペアを生成します。

すべての NGINX ユーザーは、次の手順に従って更新された PGP キーをダウンロードしてインストールする必要があります。

Ubuntu/Debianの場合:

wget -qO - https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

RHEL/CentOS の場合:

sudo rpm -e gpg-pubkey-7bd9bf62-5762b5f8
sudo rpm --import https://nginx.org/keys/nginx_signing.key

2024 年 6 月 16 日以降は、キーを更新するまでソフトウェア署名を検証できなくなります。

今後のパッケージングとリリースポリシー

今後の NGINX Plus リリースでは、パッケージングとリリース ポリシーを合理化する予定です。 NGINX Plus は、サポートされているオペレーティング システム ディストリビューションの最新バージョンでのみ構築およびテストされます。 古いディストリビューションに NGINX Plus をインストールする場合、パッケージ マネージャーによって依存ライブラリとパッケージの更新が提案されることがあります。

プラットフォームサポートの変更

このリリースでは、サポートされているプラットフォームに次の変更が加えられました。

サポートされる新しいオペレーティング システム:

  • ウブントゥ 24.04

削除された古いオペレーティング システム:

  • 2023年12月31日にEOLに達したFreeBSD 12

NGINX Plus R33 で非推奨となり削除が予定されている古いオペレーティング システム:

  • CentOS7/RHEL7/Oracle Linux 7
  • アルパインLinux3.16

新機能の詳細

NGINX のロード動作を改善するための SSL 証明書キャッシュ

以前は、NGINX は NGINX 構成で参照されるたびに証明書、キー、または証明書失効リストをロードしていました。 つまり、同じオブジェクトへの複数の参照により、そのオブジェクトのリロードが同じ回数発生することになります。 この遅延は、信頼できる証明書のリストなどのディレクティブを継承するときにさらに増大します。 特定の条件下では、この動作により NGINX の起動時間が大幅に影響し、設定を保存するために大量のメモリが必要になる可能性があります。

新しい動作では、SSL ディレクティブはキャッシュされた証明書ファイルと関連オブジェクトを参照するようになりました。 その結果、同じ証明書オブジェクトを繰り返し参照する構成のメモリフットプリントと読み込み時間が大幅に削減されます。 この利点は、信頼できる証明書の小さなセットが多数のロケーション ブロックにわたって参照される大規模な NGINX 構成の場合に最も顕著になります。

以下は、NGINX が約 5400 個のロケーション ブロック (トップレベルおよびネスト) と 878 個の証明書で構成されている場合の読み込み時間の改善を視覚化したものです。

読み込み時間の改善

グラフの右側に向かうにつれて読み込み時間が大幅に減少していることに注目してください。平均読み込み時間は、変更前の約 40 秒から、新しい動作では約 6 秒に減少しています。

ストリームモジュールから他のモジュールへの接続の受け渡し

NGINX Plus R32 は、NGINX に新しい構成レイヤーを追加するNGINX オープンソース 1.25.5の機能を継承しています。具体的には、NGINXストリームモジュールはルーターとして機能するようになり、ストリーム コンテキストから http、メールなどの他のコンテキスト、またはストリーム コンテキスト自体内の別の仮想サーバーに接続を渡す機能を持つプロキシとして機能します。

この機能は、このリリースで導入されたngx_stream_pass_module モジュールの一部として利用できます。 このモジュールには、クライアント接続を渡すアドレスを指定するために使用できる単一のディレクティブ「pass」があります。 アドレスは、IP アドレスとポートの組み合わせ、ソケット パス、または NGINX 変数によって参照されて指定できます。

この機能により、すべてのトラフィックを単一の L4 エンドポイント経由で実行したいお客様は、L4 ストリーム コンテキストで SSL 接続を終了し、ストリーム コンテキスト内の他のモジュール (http、メール) または他の仮想サーバーに渡すことができるようになりました。 さらに、SSL 接続はサーバー名またはプロトコルに基づいて条件付きで終了し、残りのトラフィックを他の場所にプロキシすることもできます。 これにより、単一のエンドポイントからのトラフィックを管理するための新しい一連の構成動作が可能になります。

次の構成スニペットは、ストリーム モジュール内の SSL 接続を終了し、要求されたサーバー名に基づいて、条件に応じて、それらを http コンテキストまたはストリーム コンテキスト内の別の仮想サーバーに渡します。

http {
server {
listen 8000;

location / {
return 200 foo;
}
}
}

stream {
map $ssl_server_name $pass_port {
foo.example.com 8000;
default 9001;

}

server {
listen 9000 ssl;

ssl_certificate domain.crt;
ssl_certificate_key domain.key;

pass 127.0.0.1:$pass_port;
}
server{
listen 9001;
return bar\n;
}

}

この例では、すべての SSL 接続はストリーム サーバー ブロックで終了します。 受信リクエスト内のサーバー名に応じて、接続はポート 8000 でリッスンしている http サーバーに渡されるか、ポート 9001 でリッスンしているストリーム仮想サーバーに渡されます。

モジュールの別のアプリケーションは、サードパーティのモジュールが SSL 終了をサポートしていないユースケースに対処します。 このようなシナリオでは、stream_pass モジュールは、TLS 暗号化接続をサードパーティ モジュールに渡す前に終了できます。

この例では、ネイティブで SSL をサポートしていないRTMP モジュールが、stream_pass モジュールを使用して TLS 暗号化トラフィックを受け入れる方法を示します。

rtmp {
server {
listen 1935;#rtmp

application foo{

live on;
}
}
}

stream {
server {
listen 1936 ssl; #rtmps

ssl_certificate domain.crt;
ssl_certificate_key domain.key;

pass 127.0.0.1:1935;
}
}

この構成スニペットでは、SSL 接続はストリーム サーバー ブロックで終了され、rtmp に渡されます。 接続は RTMP モジュールに対して暗号化されていないように見えるため、SSL 接続をサポートするための追加のカスタマイズや処理オーバーヘッドが不要になります。

NGINX Plus コンテナイメージ

NGINX Plus R32 には、NGINX Plus の特権実行と非特権実行の両方に対応した NGINX Plus コンテナ イメージの公式提供が含まれています。 両方のコンテナ タイプは、NGINX がサポートする管理プレーンへの接続を容易にするために、NGINX エージェントのオプションのインストールでも利用可能になります。 イメージは、private-registry.nginx.com にある NGINX レジストリからダウンロードできます。 NGINX Plus 証明書とキー、または JSON Web Token (JWT) を使用してイメージにアクセスするには、次の手順に従ってください。

NGINX Plus R32 のその他の機能強化とバグ修正

MQTTモジュールのバグ修正

  • デフォルトのプロパティを使用する場合の不正なパケット: このリリースには、 NGINX Plus R29 で導入されたMessage Queuing Telemetry Transport (MQTT) モジュールで不正なパケットが発生する問題の修正が含まれています。 以前は、プロパティ フィールドが存在し、MQTT Connect メッセージ内のすべてのプロパティのデフォルト値が含まれていた場合、送信パケットの長さはプロパティ長フィールド (1 バイト) を考慮していませんでした。 これにより、パケットの長さが予想よりも 1 バイト短くなり、パケットの形式が不正になりました。 R32 のこの修正により、この問題は解決されます。

zone_sync モジュールのバグ修正

  • 設定の再読み込み時にメモリ リークが発生する: 以前は、保留中のキュー同期操作では、解放されることのない別のプールから割り当てられたチェーン リンクが使用されていました。 これにより、マスターとすべてのワーカー プロセスでメモリ リークが発生しました。 このリリースの修正により、保留中のキューにサイクル プールを使用する以前のゾーン同期実装に戻ります。

セキュリティ修正

実験的な HTTP3/QUIC 実装では、次の潜在的なセキュリティ問題が特定され、修正されました。

  • 書き込み時のヒープオーバーフロー ( CVE-2024-32760 ): 非公開の HTTP/3 エンコーダー命令により、NGINX ワーカー プロセスが終了したり、その他の影響が生じたりする可能性があります。
  • スタックオーバーフロー/解放後使用 ( CVE-2024-31079 ): 非公開の HTTP/3 リクエストにより、NGINX ワーカー プロセスが終了したり、その他の影響が生じたりする可能性があります。 この攻撃では、接続ドレイン プロセス中にリクエストが特定のタイミングで送信される必要がありますが、攻撃者はこれを可視化できず、影響も限定されます。
  • 空のヘッダーによる null ポインタ参照 ( CVE-2024-35200 ): 非公開の HTTP/3 リクエストにより、NGINX ワーカー プロセスが終了したり、その他の影響が生じたりする可能性があります。
  • QUIC ハンドシェイク中のメモリ漏洩 ( CVE-2024-34161 ): ネットワーク インフラストラクチャが断片化なしで 4096 以上の最大転送単位 (MTU) をサポートしている場合、未公開の QUIC メッセージによって NGINX ワーカー プロセスが終了したり、以前に解放されたメモリがリークされたりする可能性があります。

NGINXオープンソースから継承された変更

NGINX Plus R32 はNGINX Open Source 1.25.5をベースとしており、 NGINX Plus R31のリリース以降に行われた機能変更、特徴、バグ修正 (NGINX 1.25.4 および 1.25.5) を継承しています。

特徴:

  • ストリーム モジュール内の仮想サーバー。
  • ngx_stream_pass_module。
  • ストリーム モジュールの "listen" ディレクティブの "deferred"、"accept_filter"、および "setfib" パラメータ。
  • 一部のアーキテクチャのキャッシュ ライン サイズの検出。
  • Apple Silicon 上の Homebrew のサポート。

バグ修正:

  • Windows クロスコンパイルのバグ修正と改善。
  • QUIC で 0-RTT を使用しているときに予期しない接続の終了が発生しました。
  • 保留中の AIO 操作がある接続は、古いワーカー プロセスの正常なシャットダウン中に途中で閉じられる可能性があります。
  • 古いワーカー プロセスの正常なシャットダウン後に高速シャットダウンが要求された場合、ソケット リーク アラートは記録されなくなりました。
  • サブリクエストで AIO が使用された場合、ワーカー プロセス (SSL プロキシ用) でソケット記述子エラー、ソケット リーク、またはセグメンテーション エラーが発生する可能性があります。
  • SSL プロキシが「image_filter」ディレクティブとともに使用され、コード 415 のエラーが「error_page」ディレクティブでリダイレクトされた場合、ワーカー プロセスでセグメンテーション エラーが発生する可能性があります。
  • HTTP/3 のバグ修正と改善。

安全:

  • HTTP/3 を使用する場合、特別に細工された QUIC セッションの処理中にワーカー プロセスでセグメンテーション エラーが発生する可能性があります ( CVE-2024-24989CVE-2024-24990 )。

最近のリリースから継承された新しい変更、機能、バグ修正、回避策の完全なリストについては、NGINX の変更ファイルを参照してください。

NGINX JavaScript モジュールの変更

NGINX Plus R32 には、NGINX JavaScript (njs) モジュール バージョン 0.8.4 からの変更が組み込まれています。 以下は、0.8.2 (NGINX Plus R31 に同梱されたバージョン) 以降の njs の注目すべき変更点の一覧です。

特徴

  • 機能: 送信ヘッダーのサーバー ヘッダーを設定できます。
  • 特徴: CLI での QuickJS エンジンのサポート。

変更点

  • 改善: r.subrequest() の URI および args 引数の検証。
  • 改善: 重複する js_set 変数をチェックします。

バグ修正

  • バグ修正: Headers.set() を修正しました。
  • バグ修正: バッファ値を使用した js_set を修正しました。
  • バグ修正: タイムアウトが指定されていない場合の共有辞書の clear() メソッドを修正しました。
  • バグ修正: js_periodic が有効な場合の stub_status 統計を修正しました。
  • バグ修正: libxml2 2.12 以降でのビルドを修正しました。
  • バグ修正: オーバーフローと NaN 値に関する Date コンストラクターを修正しました。
  • バグ修正: querystring.parse() のアンダーフローを修正しました。
  • バグ修正: String.prototype.match() での潜在的なバッファオーバーリードを修正しました。
  • バグ修正: for-in ループの解析を修正しました。
  • バグ修正: 数字のない 16 進数、8 進数、および 2 進数リテラルの解析を修正しました。
  • バグ修正: タイムアウトなしで共有辞書のclear()メソッドを修正0.8.3
  • バグ修正: バッファ引数によるタイムアウトのない共有辞書の r.send() メソッドを修正しました。
  • バグ修正: パディングされていない base64 文字列での atob() を修正しました。

すべての機能、変更、バグ修正の包括的なリストについては、njs の変更ログを参照してください。

NGINX Plus をアップグレードまたは試用する

NGINX Plus を実行している場合は、できるだけ早く NGINX Plus R32 にアップグレードすることを強くお勧めします。 素晴らしい新機能に加えて、いくつかの追加の修正と改善も導入され、サポート チケットを発行する必要がある場合に NGINX がサポートしやすくなります。

NGINX Plus ユーザーでない方は、ぜひ試してみることをお勧めします。 セキュリティ、負荷分散、API ゲートウェイのユースケースに使用したり、強化された監視および管理 API を備えた完全にサポートされた Web サーバーとして使用したりできます。 今すぐ30 日間の無料トライアルを始めましょう。


「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"