NGINX Plus R32リリースのお知らせ

NGINX | 2024年5月28日

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

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 Open Sourceから継承された新機能とバグ修正、およびNGINX JavaScriptモジュールのアップデートが含まれています。

動作に関する重要な変更

注:NGINX Plus R31以外のリリースからアップグレードする場合は、現在のバージョンからこのバージョンまでのすべてのリリースについて、動作に関する重要な変更のセクションを過去のリリース告知ブログで必ず確認してください。

OpenTracingモジュールの非推奨化

NGINX Plus R18で導入されたOpenTracingモジュールは非推奨となり、NGINX Plus R34で削除される予定です。関連パッケージは、それまでのすべてのNGINX Plusリリースで提供されます。OpenTracingモジュールの使用を、OpenTelemetryモジュール(NGINX Plus R29で導入)に置き換えることを強く推奨します。

ModSecurityモジュールの削除

ModSecurityモジュールのサポートは2024年3月31日に終了しました。これに伴い、modsecパッケージはNGINX Plusリポジトリから削除され、今後は同リポジトリから入手できなくなります。

PGPキーの更新

NGINX Open Sourceおよび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をインストールする場合、パッケージマネージャーから依存ライブラリおよびパッケージの更新を提案されることがあります。

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

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

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

  • Ubuntu 24.04

削除された旧バージョンのオペレーティングシステム:

  • 2023年12月31日にEOLを迎えたFreeBSD 12

非推奨となり、NGINX Plus R33で削除予定の旧バージョンのオペレーティングシステム:

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

新機能の詳細

NGINXの負荷時の動作を改善するSSL証明書キャッシュ

以前のNGINXでは、NGINX設定内で証明書、鍵、または証明書失効リストが参照されるたびに、それらを読み込んでいました。そのため、同じオブジェクトを複数回参照すると、その回数と同じだけオブジェクトが再読み込みされていました。信頼できる証明書のリストなどのディレクティブを継承する場合、この遅延はさらに増大していました。特定の条件下では、この動作がNGINXの起動時間に大きな影響を及ぼし、設定の保存に大量のメモリが必要になる可能性がありました。

新しい動作では、SSLディレクティブがキャッシュされた証明書ファイルと関連オブジェクトを参照するようになりました。その結果、同じ証明書オブジェクトを繰り返し参照する構成では、メモリ使用量と読み込み時間が大幅に削減されます。特に、少数の信頼できる証明書を多数のlocationブロックから参照する大規模なNGINX構成で、大きな効果が得られます。

以下は、NGINXに約5,400個のlocationブロック(トップレベルおよびネスト)と878個の証明書を設定した場合の、ロード時間の改善を可視化したものです。

読み込み時間の短縮

グラフの右側では、読み込み時間が大幅に短縮されています。平均読み込み時間は、変更前の約40秒から、新しい動作では約6秒に短縮されています。

Streamモジュールから他のモジュールへの接続の引き渡し

NGINX Plus R32には、NGINX open source 1.25.5から継承された、NGINXの構成の柔軟性をさらに高める機能が搭載されています。具体的には、NGINXのstreamモジュールがルーターとして機能できるようになりました。このモジュールは、streamコンテキストからhttpやmailなどの他のコンテキスト、またはstreamコンテキスト内の別の仮想サーバーに接続を渡すことができるプロキシとして動作します。

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

この機能により、すべてのトラフィックを単一のL4エンドポイント経由で処理したい場合、L4ストリームコンテキストでSSL接続を終端し、他のモジュール(http、mail)またはストリームコンテキスト内の別の仮想サーバーに渡せるようになりました。さらに、サーバー名やプロトコルに基づいて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サーバーブロックで終端されます。受信リクエストのサーバー名に応じて、接続はポート8000で待ち受けるhttpサーバー、またはポート9001で待ち受けるstream仮想サーバーのいずれかに転送されます。

このモジュールは、サードパーティ製モジュールが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をインストールしたイメージも提供されています。イメージは、private-registry.nginx.comで利用可能なNGINXレジストリからダウンロードできます。NGINX Plusの証明書とキー、またはJSON Web Token(JWT)を使用してイメージにアクセスするには、こちらの手順に従ってください。

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

MQTTモジュールのバグ修正

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

zone_syncモジュールのバグ修正

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

セキュリティ修正

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

  • 書き込みを伴うヒープオーバーフロー(CVE-2024-32760):非公開のHTTP/3エンコーダー命令により、NGINXワーカープロセスが終了するか、その他の影響が生じる可能性があります。
  • スタックオーバーフロー/解放後使用(CVE-2024-31079):非公開のHTTP/3リクエストにより、NGINXワーカープロセスが終了するか、その他の影響が生じる可能性があります。この攻撃を成立させるには、コネクションのドレイン処理中にリクエストのタイミングを厳密に合わせる必要がありますが、攻撃者はこの処理を把握できず、タイミングに及ぼせる影響も限定的です。
  • 空のヘッダーによるヌルポインター参照(CVE-2024-35200):非公開のHTTP/3リクエストにより、NGINXワーカープロセスが終了するか、その他の影響が生じる可能性があります。
  • QUICハンドシェイク中のメモリ情報漏えい(CVE-2024-34161):ネットワークインフラストラクチャがフラグメンテーションなしで4096以上の最大転送単位(MTU)をサポートしている場合、非公開のQUICメッセージにより、NGINXワーカープロセスが終了したり、解放済みメモリの内容が漏えいしたりする可能性があります。

NGINX Open Sourceから継承された変更

NGINX Plus R32は、NGINX Open Source 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-24989、CVE-2024-24990)。

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

NGINX JavaScript Moduleの変更点

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以降でのビルドに関する問題を修正しました。
  • バグ修正:オーバーフローおよびNaN値に関するDateコンストラクターの問題を修正しました。
  • バグ修正:querystring.parse()で発生するアンダーフローを修正しました。
  • バグ修正:String.prototype.match()で発生する可能性があったバッファーの過剰読み取りを修正しました。
  • バグ修正:for-inループの解析を修正しました。
  • バグ修正:数字を含まない16進数、8進数、2進数リテラルの解析を修正しました。
  • バグ修正:0.8.3で導入された、タイムアウトが設定されていない共有辞書のclear()メソッドの不具合を修正。
  • バグ修正:タイムアウトが設定されていない共有ディクショナリで、Buffer引数を指定した場合のr.send()メソッドの不具合を修正しました。
  • バグ修正:パディングされていないbase64文字列を使用した場合のatob()の問題を修正しました。

すべての機能、変更、バグ修正の包括的な一覧については、njsの「変更履歴」を参照してください。

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

NGINX Plusをご利用の場合は、できるだけ早くNGINX Plus R32へアップグレードすることを強く推奨します。優れた新機能に加えて、複数の修正と改善も適用されるため、サポートチケットを起票する必要が生じた際に、NGINXによる支援をより円滑に受けられます。

NGINX Plusをまだご利用でない場合は、ぜひお試しください。セキュリティ、負荷分散、APIゲートウェイのユースケースに利用できるほか、強化された監視機能と管理APIを備え、充実したサポートを受けられるWebサーバーとしても利用できます。今すぐ30日間の無料トライアルを開始してください。

共有
タグ: F5 NGINX, News

関連するブログ記事

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
NGINX | 2024/01/18

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する

OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
NGINX | 2023/05/31

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正

Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
NGINX | 2023/02/09

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法

Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINX | 2022/05/24

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング

NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
NGINX | 2018/08/17

SELinuxでNGINXおよびNGINX Plusを使用する

Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。

NGINX PlusによるAWS Auto Scalingグループの負荷分散
NGINX | 2017/03/06

NGINX PlusによるAWS Auto Scalingグループの負荷分散

新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります