NGINX Plus リリース 31 (R31) が利用可能になったことをお知らせいたします。 NGINX オープンソースをベースにした NGINXPlus は、唯一のオールインワン ソフトウェア Web サーバー、ロード バランサー、リバース プロキシ、コンテンツ キャッシュ、API ゲートウェイです。
NGINX Plus R31 の新機能と強化された機能は次のとおりです。
このリリースの最後を飾るのは、NGINX オープンソースから継承された新機能とバグ修正、および NGINX JavaScript モジュールの更新です。
注記: NGINX Plus R30 以外のリリースからアップグレードする場合は、現在のバージョンとこのバージョン間のすべてのリリースについて、以前の発表ブログの「動作の重要な変更」セクションを必ず確認してください。
NGINX Plus R18 で導入された OpenTracing モジュールは廃止される予定です。 これは、NGINX Plus R34 の将来のリリースから削除される予定です。 それまでの間、このパッケージはすべての NGINX Plus リリースで利用可能になります。 NGINX Plus R29 で導入されたOpenTelemetry モジュールを使用することを強くお勧めします。
NGINX Plus ユーザーは、コンプライアンス上の理由から、NGINX の使用状況を F5 に報告する必要があります。 NGINX Plus R31 のリリースにより、NGINX の使用状況をNGINX インスタンス マネージャーに報告する機能がネイティブに提供され、デフォルトで有効になっています。 何らかの理由で NGINX インスタンスが NGINX インスタンス マネージャーに使用状況情報を提供できない場合は、警告メッセージが記録されます。
ご使用の環境でこの機能を構成する方法の詳細については、 「ネイティブ NGINX 使用状況レポート」セクションを参照してください。
サポートされる新しいオペレーティング システム:
削除された古いオペレーティング システム:
NGINX Plus R32 で非推奨となり削除が予定されている古いオペレーティング システム:
NGINX Plus R31 では、ネットワーク上の NGINX インスタンス マネージャーとのネイティブ通信が導入され、ライセンス コンプライアンスが自動化されます。 F5 Flex Consumption Programに参加すると、NGINX Plus インスタンスを手動で追跡する必要がなくなります。
デフォルトでは、NGINX Plus は起動時にnginx-mgmt.local
ホスト名の DNS ルックアップを介して NGINX インスタンス マネージャーを検出しようとします。 ホスト名は設定可能ですが、(簡単にするために) ローカル DNS に A レコードを追加し、デフォルトのホスト名を NGINX インスタンス マネージャーを実行しているシステムの IP アドレスに関連付けることをお勧めします。 その後、NGINX Plus は NGINX インスタンス マネージャーへの TLS 接続を確立し、バージョン番号、ホスト名、一意の識別子を 30 分ごとに報告します。
セキュリティをさらに強化するために、オプションのmgmt
構成ブロックを使用して、この接続を mTLS でプロビジョニングすることもお勧めします。 NGINX インスタンス マネージャーは、定期的に、NGINX Plus インスタンスの合計使用量を F5 サービスに報告します。
NGINX Plus でnginx-mgmt.local
ホスト名の解決または NGINX インスタンス マネージャーとの通信に問題が発生した場合、エラー ログに警告メッセージが表示されます。
これは、NGINX Plus インスタンスがnginx-mgmt.local
を解決できないことを示すエラー メッセージの例です。
2023/12/21 21:02:01 [警告] 3050#3050: 使用状況レポート: エンドポイント「nginx-mgmt.local」を解決するホストが見つかりません
以下は、NGINX Plus インスタンスが NGINX インスタンス マネージャーとの通信に問題が発生していることを示すエラー メッセージの例です。
2023/12/21 21:02:01 [警告] 3184#3184: 使用状況レポート: 接続がタイムアウトしました
mgmt
構成ブロック設定のカスタマイズNGINX Plus インスタンスが NGINX インスタンス マネージャーと通信する方法を微調整したい場合は、新しいmgmt
構成ブロックと関連するディレクティブを使用することを選択できます。 これにより、カスタム リゾルバを定義し、IP アドレスまたは代替ホスト名を使用して NGINX インスタンス マネージャー システムを識別し、TLS オプションを指定し、セキュリティ強化のために mTLS を使用し、その他のカスタム パラメータを指定できるようになります。
以下はカスタム構成のサンプルです。
mgmt {
usage_report エンドポイント = インスタンス マネージャー.ローカル 間隔 = 30 分;
リゾルバー 192.168.0.2; # サンプル内部 DNS IP
uuid_file /var/lib/nginx/nginx.id;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers DEFAULT;
ssl_certificate client.pem;
ssl_certificate_key client.key;
ssl_trusted_certificate trusted_ca_cert.crt;
ssl_verify on;
ssl_verify_depth 2;
}
これらのディレクティブの詳細については、製品ドキュメントを参照してください。
NGINX インスタンス マネージャーのダウンロードとインストールの詳細については、インストール ガイドを参照してください。
注記: 以前のバージョンの NGINX Plus を使用している場合でも、次の手順に従ってインスタンスをレポートできます。
このリリースより前は、NGINX Plus はアップストリーム グループ内のすべてのサーバーが同一であると想定していました。 つまり、同じリクエストに応答し、同じ SNI 名 ( proxy_ssl_server_name
が使用されている場合) に応答し、同じ名前に一致する SSL 証明書を返すことができる必要がありました。
ただし、この動作では不十分なシナリオが存在します。 たとえば、アップストリーム サーバーの背後で複数の仮想サーバーが共有されており、特定のリソースにリクエストをルーティングするために異なる SNI やホスト ヘッダーで区別する必要がある場合などです。 また、アップストリーム グループ内のすべてのサーバーで同じ証明書を使用できない場合や、アップストリーム サーバーを別のアップストリーム グループに配置する際に制限がある場合もあります。
NGINX Plus R31 では、アップストリーム サーバーごとに構成できる SNI のサポートが導入されました。 変数$upstream_last_server_name
は、選択されたアップストリーム サーバーの名前を参照します。この名前は、 proxy_ssl_server_name
およびproxy_ssl_name
ディレクティブを使用してプロキシ サーバーに渡すことができます。
proxy_ssl_server_name を
onに設定して、サーバー名が SNI を通過できるようにする方法は次のとおりです。
proxy_ssl_server_name をオンにします。
proxy_ssl_name
を使用して選択したアップストリーム サーバー名を渡す方法は次のとおりです。
proxy_ssl_name
$アップストリームの最後のサーバー名;
NGINX JavaScript v0.8.1 では、 http コンテキスト
とstream
コンテキストの両方で使用できる新しいディレクティブjs_periodic
が導入されました。 このディレクティブを使用すると、JavaScript コンテンツ ハンドラーを定期的に実行する指定ができます。 これは、カスタム コードを定期的に実行する必要があり、NGINX 変数にアクセスする必要がある場合に役立ちます。 コンテンツ ハンドラーは、セッション オブジェクトを引数として受け取り、グローバル オブジェクトにもアクセスできます。
デフォルトでは、コンテンツ ハンドラーはワーカー プロセス 0 で実行されますが、特定のワーカー プロセスまたはすべてのワーカー プロセスで実行されるように構成できます。
このディレクティブは、場所の
コンテキストで使用できます。
example.conf:
location @periodics {
# ワーカー プロセス 1 と 3 で 15 分間隔で実行されます
js_periodic main.handler interval=900s worker_affinity=0101;
resolver 10.0.0.1;
js_fetch_trusted_certificate /path/to/certificate.pem;
}
example.js:
async function handler(s) {
let reply = await ngx.fetch('https://nginx.org/en/docs/njs/');
let body = await reply.text();
ngx.log(ngx.INFO, body);
}
構文と設定の詳細については、 NGINX JavaScript ドキュメントを参照してください。
NGINX 構成に多数の「場所」が含まれているシナリオでは、NGINX の起動にかなりの時間がかかる可能性があります。 多くの場合、これは受け入れられないかもしれません。 根本的な問題は、場所のリストを並べ替えるために使用される並べ替えアルゴリズムにあります。
NGINX R31 では、既存のソートアルゴリズムを、時間計算量がO(n2)
の挿入ソートから、時間計算量が O(n*log n)
のマージソートに置き換える機能強化が導入されています。
20,000 の場所のテスト構成では、この更新後に合計起動時間が 8 秒から 0.9 秒に短縮されたことが確認されました。
NGINX Plus R31 では、QUIC + HTTP/3 実装に次のようないくつかの機能強化とパフォーマンスの最適化が導入されています。
追加のパフォーマンス最適化には、確認応答パケットの送信時に発生する可能性のある遅延の削減、確認応答 (ACK) フレームをキューの先頭に配置してフレームの再送信と ACK フレームの配信の遅延を削減すること、および汎用セグメンテーション オフロード (GSO) モードでの輻輳制御動作の改善が含まれます。
管理
モジュールNGINX Plus R31 では、 ngx_mgmt_module を
使用すると、NGINX の使用状況情報を NGINX インスタンス マネージャーに報告できます。 この情報には、NGINX ホスト名、NGINX バージョン、一意のインスタンスの識別子が含まれます。
このモジュールは、NGINX インスタンスが NGINX インスタンス マネージャーと通信する方法を微調整するためのいくつかのディレクティブを提供します。 利用可能なディレクティブと設定オプションの完全なリストについては、 NGINX Docsを参照してください。
メッセージ キューイング テレメトリ トランスポート (MQTT) サポートはNGINX Plus R29 で導入され、このリリースには MQTT モジュールで確認された問題に対するいくつかのバグ修正が含まれています。
重要な修正の 1 つは、パスワードが提供されなかった場合に CONNECT メッセージが拒否される問題に対処することです。 以前は、ユーザー名フィールドの後にパスワードが続くことが無条件に想定されていました。 ただし、MQTT 仕様には、匿名認証など、パスワードの提供が必須ではない特別なケースがあります。 この修正では、パケットのcflags
フィールドを調べて、パスワードが期待されているかどうかを条件付きでチェックします。 フラグが設定されていない場合は、パスワードが必須ではないことを意味します。
別のバグ修正では、メッセージの長さが受信したバイト数より少ない場合に MQTT CONNECT メッセージの解析が停止されます。
server_tokens
のサポートNGINX Plus R31 では、HTTP/3 接続で不足しているserver_tokens
変数のサポートが追加されました。 文字列
フィールドを使用すると、エラー ページの署名と「Server」応答ヘッダー フィールドの値を明示的に設定できます。 文字列フィールドが空の場合、「Server」フィールドの発行が無効になります。
NGINX Plus R31 は NGINX Open Source 1.25.3 をベースとしており、NGINX Plus R30 のリリース以降 (NGINX 1.25.2 および 1.25.3) に行われた機能変更、特徴、バグ修正を継承しています。
TLS_AES_128_CCM_SHA256
暗号スイートのサポート– この機能強化により、現在 NGINX QUIC 実装でサポートされていない唯一の暗号スイートであるTLS_AES_128_CCM_SHA256
サポートが QUIC に追加されます。 OpenSSL ではデフォルトで無効になっていますが、次のディレクティブで有効にできます: ssl_conf_command Ciphersuites TLS_AES_128_CCM_SHA256;
nginx
appName を提供します– OPENSSL_init_ssl()
インターフェイスを使用する場合、NGINX はOPENSSL_VERSION_NUMBER
をチェックする代わりに、 OPENSSL_INIT_LOAD_CONFIG
が定義され、true であるかどうかをテストするようになりました。 これにより、BoringSSL および LibreSSL では追加のライブラリ初期化設定 (特に、 OPENSSL_INIT_set_config_appname()
呼び出し) が提供されないため、このインターフェースがこれらのサーバーで使用されなくなります。O(n*log n)
のマージ ソートを使用しています。 これにより、特に構成内の「場所」の数が非常に多い場合に、 NGINX の起動エクスペリエンスが向上します。http2_max_concurrent_streams
を使用して構成されます。 リクエストの送信直後にストリームがリセットされる場合を考慮して、許可される同時ストリームの最大しきい値に達しない場合でも適用されます。client_header_buffer_size
ディレクティブで指定されたバッファに読み込まれます。 これにより、状態を保存中にバッファが読み取られる可能性があるという問題が発生しました。 現在の修正により、固定バッファ サイズではなく、使用可能なバッファ サイズのみを読み取ることができるようになりました。 このバグは、NGINX メインライン バージョン 1.25.1 (NGINX Plus R30) で初めて発生しました。Status のような空の「理由フレーズ」を持つステータス ヘッダー: 404 は
Common Gateway Interface (CGI) 仕様では有効ですが、解析中に末尾のスペースが失われました。 この結果、応答にHTTP/1.1 404
ステータス ラインが生成されましたが、末尾のスペースが欠落しているため HTTP 仕様に違反しています。 このバグ修正により、このような短いステータス ヘッダー行からはステータス コードのみが使用されるようになり、NGINX は、スペースと適切な理由フレーズ (使用可能な場合) を含むステータス行自体を生成します。最近のリリースから継承された新しい変更、機能、バグ修正、回避策の完全なリストについては、NGINX CHANGESファイルを参照してください。
NGINX Plus R31 には、NGINX JavaScript (njs) モジュール バージョン 0.8.2 からの変更が組み込まれています。 以下は、0.8.0 (NGINX Plus R30 リリースの一部) 以降の njs の注目すべき変更点のリストです。
error()
、 info()
、 log()
、 time()
、 timeEnd()
、 warn()
。http
およびストリーム
用のjs_periodic
ディレクティブを導入しました。items()
メソッドを実装しました。 このメソッドは、期限切れでないすべてのキーと値のペアを返します。existsSync()
メソッドを追加しました。parse()
メソッドでの壊れた XML 例外処理を修正しました。RegExp.prototype.exec() を
修正しました。size()
およびkeys()
メソッドを修正しました。r.internalRedirect()
の誤った例外を修正しました。Object.getOwnPropertyNames()
内のキーの誤った順序を修正しました。items()
メソッドを修正しました。すべての機能、変更、バグ修正の包括的なリストについては、njs変更ログを参照してください。
NGINX Plus を実行している場合は、できるだけ早く NGINX Plus R31 にアップグレードすることを強くお勧めします。 素晴らしい新機能に加えて、いくつかの追加の修正と改善も得られます。最新の状態にしておくと、サポート チケットを発行する必要がある場合に NGINX がサポートしやすくなります。
NGINX Plus をまだお試しいただいていない方は、ぜひお試しください。 セキュリティ、負荷分散、API ゲートウェイのユースケースに使用したり、強化された監視および管理 API を備えた完全にサポートされた Web サーバーとして使用したりできます。 今すぐ30 日間の無料トライアルを始めましょう。
「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"