BLOG | NGINX

NGINX Plus R32リリース

NGINX-Part-of-F5-horiz-black-type-RGB
Prabhat Dixit サムネール
Prabhat Dixit
Published May 29, 2024

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

NGINX Plus R32の新機能および拡張機能は以下の通りです。

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

このリリースの最後を締めくくるのは、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日にサポート終了となりました。その結果、modSecurityパッケージは、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

On RHEL/CentOS:

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

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

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

今後のNGINX Plusのリリースでは、パッケージングとリリースポリシーを合理化する予定です。NGINX Plusは、サポート対象のOSディストリビューションの最新バージョンのみでビルドおよびテストされます。NGINX Plusを古いディストリビューションにインストールする場合、パッケージマネージャにより、依存するライブラリやパッケージのアップデートを推奨されるかもしれません。

プラットフォーム対応の変更

本リリースでは、サポート対象のプラットフォームに以下の変更が加えられました。

以下のオペレーティングシステムが新たにサポートされます。

  • Ubuntu 24.04

以下のオペレーティングシステムはサポート対象外となります。

  • 2023年12月31日にサポート終了となったFreeBSD 12

以下のオペレーティングシステムはNGINX Plus R33でサポート対象外となる予定です。

  • CentOS7/RHEL7/Oracle Linux 7
  • Alpine Linux 3.16

新機能の詳細

SSL証明書のキャッシュによるNGINXのロード時動作の改善

これまでNGINXでは、証明書、鍵または証明書失効リストは、NGINX構成で参照されるたびにロードされていました。つまり、同じオブジェクトを複数回参照すると、その分だけそのオブジェクトがリロードされていました。この時間は、信頼できる証明書のリストのようなディレクティブを継承するときに、重大な問題になります。この動作は、特定の条件下では、NGINXの起動時間に大きな影響を与え、構成の保存のために大量のメモリを必要とする可能性がありました。

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

以下の図は、約5,400のロケーションブロック(トップレベルとネストされたもの)と、878の証明書で構成されたNGINXにおけるロード時間の改善を視覚化したものです。

load time improvement

グラフの右側でロード時間が大幅に低下していることに注目してください。平均ロード時間が、変更前の約40秒から、新しい動作では6秒以下に短縮されています。

Streamモジュールから他のモジュールへの接続の受け渡し

NGINX Plus R32は、NGINXの構成の可能性を広げるNGINXオープンソース1.25.5の機能を継承しています。具体的には、NGINX streamモジュールがルーターとして機能できるようになり、streamコンテキストからhttpやmailなどの他のコンテキストに接続を渡したり、streamコンテキスト内の別の仮想サーバーに接続を渡したりするプロキシとして機能できるようになりました。

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

この機能を使用することで、すべてのトラフィックを単一のL4エンドポイントを介して実行したい場合、L4のstreamコンテキストでSSL接続を終了させ、そのSSL接続を他のモジュール(http、mail)や同じstreamコンテキスト内の他の仮想サーバーに渡すことができます。さらに、サーバー名やプロトコルに基づいた条件付きで、SSL接続を終了させ、残りのトラフィックを別の場所にプロキシすることもできます。これにより、単一のエンドポイントからのトラフィックを管理するための構成動作の新しい可能性が開けます。

以下の構成スニペットでは、streamモジュールでSSL接続を終了させ、リクエストされたサーバー名に基づいた条件付きで、httpコンテキスト、または同じstreamコンテキスト内の別の仮想サーバーに接続を渡します。

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接続はstreamのserverブロックで終了します。接続は、着信リクエストのサーバー名に基づいて、ポート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接続は、streamのserverブロックで終了し、rtmpに渡されます。RTMPモジュールでは、この接続は暗号化されていないように見えるので、SSL接続をサポートするための追加のカスタマイズや処理のオーバーヘッドの必要がなくなります。

NGINX Plusコンテナイメージ

NGINX Plus R32では、NGINX Plusの特権実行と非特権実行の両方で公式のNGINX Plusコンテナイメージを利用できます。どちらのコンテナタイプも、NGINXがサポートする管理プレーンへの接続を簡単にするNGINX Agentをオプションでインストールして利用できます。これらのイメージは、NGINXレジストリ(private-registry.nginx.com)からダウンロードできます。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オープンソース1.25.5をベースとしていて、NGINX Plus R31のリリース以降(NGINX 1.25.4および1.25.5)に行われた機能変更、機能、およびバグ修正を継承しています。

機能:

  • streamモジュールの仮想サーバー。
  • ngx_stream_pass_module。
  • streamモジュールの「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 CHANGESファイルを参照してください。

NGINX JavaScriptモジュールの変更点

NGINX Plus R32には、NGINX JavaScript(njs)モジュールのバージョン0.8.4からの変更点が含まれています。以下に、NGINX Plus R31でリリースされた0.8.2以降のnjsにおける主な変更点を示します。

機能

  • 機能:送信ヘッダーのServerヘッダーを設定できます。
  • 機能:CLIでQuickJSエンジンがサポートされます。

変更点

  • 改善:r.subrequest()のURIとargs引数の検証。
  • 改善:js_set変数の重複のチェック。

バグ修正

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

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

NGINX Plusのアップグレードまたはお試し

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

NGINX Plusをまだお試しでない方は、ぜひお試しください。セキュリティ、ロードバランシング、APIゲートウェイのユースケースとして、またはモニタリングと管理APIが強化された完全サポートのWebサーバーとして使用できます。30日間の無料トライアルで、今すぐ始めることができます。


"This blog post may reference products that are no longer available and/or no longer supported. For the most current information about available F5 NGINX products and solutions, explore our NGINX product family. NGINX is now part of F5. All previous NGINX.com links will redirect to similar NGINX content on F5.com."