NGINX Plus Release 31(R31)の提供を開始することをお知らせします。NGINX PlusはNGINXオープンソースをベースにした唯一のオールインワンソフトウェア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 Instance Managerに報告する機能がネイティブで提供され、デフォルトで有効になっています。NGINXインスタンスが使用状況に関する情報を何らかの理由でNGINX Instance Managerに提供できない場合、警告メッセージがログに記録されます。
現在の環境でこの機能を設定する方法の詳細については、「NGINX使用状況のネイティブレポート」セクションを参照してください。
以下のオペレーティングシステムが新たにサポートされます。
以下のオペレーティングシステムはサポート対象外となります。
以下のオペレーティングシステムはNGINX Plus R32でサポート対象外となる予定です。
NGINX Plus R31ではネットワーク上のNGINX Instance Managerとネイティブに通信できる機能が導入され、ライセンスコンプライアンスが自動化されます。F5 Flex Consumption Programに参加している場合はNGINX Plusインスタンスを手動で追跡する必要がなくなります。
デフォルトではNGINX Plusは起動時にnginx-mgmt.local
ホスト名のDNSルックアップを介してNGINX Instance Managerの検出を試みます。このホスト名は設定可能ですが、(わかりやすいように)AレコードをローカルDNSに追加し、デフォルトのホスト名とNGINX Instance Managerを実行しているシステムのIPアドレスを関連付けることをお勧めします。NGINX Plusは、NGINX Instance Managerを検出すると、その間でTLS接続を確立して、30分ごとにバージョン番号、ホスト名、および一意の識別子を報告します。
さらにセキュリティを強化するために、オプションのmgmt
構成ブロックを使用して、この接続をmTLSでプロビジョニングすることをお勧めします。NGINX Instance ManagerはNGINX Plusインスタンスの総使用量をF5サービスに定期的に報告します。
NGINX Plusにおいて、nginx-mgmt.local
ホスト名の解決、またはNGINX Instance Managerとの通信に問題が発生するとエラーログに警告メッセージが表示されます。
以下のエラーメッセージの例はNGINX Plusインスタンスがnginx-mgmt.local
を解決できないことを示しています。
2023/12/21 21:02:01 [warn] 3050#3050: usage report: host not found resolving endpoint "nginx-mgmt.local”
以下のエラーメッセージの例はNGINX PlusインスタンスでNGINX Instance Managerとの通信に問題が発生していることを示しています。
2023/12/21 21:02:01 [warn] 3184#3184: usage report: connection timed out
mgmt
構成ブロック設定のカスタマイズNGINX PlusインスタンスがNGINX Instance Managerと通信する方法を微調整したい場合は新しいmgmt
構成ブロックと関連するディレクティブを使用できます。これにより、カスタムリゾルバの定義、IPアドレスまたは代替ホスト名を使用したNGINX Instance Managerシステムの識別、TLSオプションの指定、mTLS使用によるセキュリティ強化、およびその他のカスタムパラメータの指定が可能になります。
以下に、カスタム構成の例を示します。
mgmt { usage_report endpoint=instance-manager.local interval=30m;
resolver 192.168.0.2; # Sample internal 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 Instance Managerのダウンロードとインストールの詳細については、インストールガイドを参照してください。
注:以前のバージョンの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 on;
また、以下に、proxy_ssl_name
を使用して選択したアップストリームサーバー名を渡す方法を示します。
proxy_ssl_name
$upstream_last_server_name;
NGINX JavaScript v0.8.1では、http
とstream
の両方のコンテキストで利用できる新しいディレクティブjs_periodic
が導入されました。このディレクティブは定期的な間隔で実行するJavaScriptコンテンツハンドラを指定できます。これは、カスタムコードを定期的に実行する必要があり、NGINX変数にアクセスする必要がある場合に便利です。コンテンツハンドラは引数としてセッションオブジェクトを受け取り、グローバルオブジェクトにもアクセスできます。
デフォルトではコンテンツハンドラはワーカープロセス0で実行されますが、特定のワーカープロセスまたはすべてのワーカープロセスで実行されるように設定できます。
このディレクティブは、location
コンテキストで使用できます。
example.conf:location @periodics {
# to be run at 15 minute intervals in worker processes 1 and 3
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フレームの送信遅延の軽減、Generic Segmentation Offload(GSO)モードにおける輻輳制御動作の改善などがあります。
mgmt
モジュールの追加NGINX Plus R31ではngx_mgmt_module
により、NGINXの使用状況をNGINX Instance Managerにレポートできるようになりました。この情報には、NGINXホスト名、NGINXバージョン、および一意のインスタンス識別子が含まれます。
このモジュールは、NGINXインスタンスがNGINX Instance Managerと通信する方法を微調整するためのディレクティブをいくつか提供します。利用可能なディレクティブと設定オプションの完全なリストについては、NGINXのドキュメントを参照してください。
Message Queuing Telemetry Transport(MQTT)のサポートは、NGINX Plus R29で導入されましたが、今回のリリースではMQTTモジュールで確認された問題のバグ修正がいくつか含まれています。
重要な修正の1つはパスワードが提供されない場合にCONNECTメッセージが拒否されていた問題に対処したことです。これまでは、ユーザー名フィールドの後にパスワードが続くことが無条件に想定されていました。しかし、MQTT仕様には匿名認証などパスワードの入力が必須ではない特殊なケースもあります。今回の修正により、パケットのcflags
フィールドにより、パスワードが想定されているかどうかが条件付きでチェックされます。このフラグが設定されていない場合、パスワードが必須ではないことを意味します。
また、MQTT CONNECTメッセージの長さが受信したバイト数より小さい場合にメッセージ解析が停止するというバグも修正されました。
server_tokens
のサポートNGINX Plus R31では、HTTP/3接続用にはなかったserver_tokens
変数のサポートが追加されました。string
フィールドを使用して、エラーページの署名と「Server」レスポンスヘッダーフィールド値を明示的に設定できます。文字列フィールドが空の場合、「Server」フィールドの値が無効になります。
NGINX Plus R31は、NGINXオープンソース1.25.3をベースとしていて、NGINX Plus R30のリリース以降(NGINX 1.25.2および1.25.3)に行われた機能変更、機能、およびバグ修正を継承しています。
TLS_AES_128_CCM_SHA256
暗号スイートのサポート – 今回の機能拡張により、TLS_AES_128_CCM_SHA256
のサポートがQUICに追加されました。これは現在NGINX 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であることをテストするようになりました。これにより、追加のライブラリ初期化設定(特にOPENSSL_INIT_set_config_appname()
コール)が提供されないBoringSSLおよびLibreSSLでこのインターフェースが使用されないことが保証されます。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からの変更点が含まれています。以下に、NGINX Plus R30でリリースされた0.8.0以降のnjsにおける主な変更点を示します。
error()
、info()
、log()
、time()
、timeEnd()
、およびwarn()
http
とstream
用のjs_periodic
ディレクティブが導入され、定期的に実行するJSハンドラを指定できるようになりました。items()
メソッドを実装しました。このメソッドは、期限切れではないすべてのキー/値ペアを返します。existsSync()
メソッドを追加しました。parse()
メソッドにおける壊れたXMLの例外の処理を修正しました。RegExp.prototype.exec()
を修正しました。size()
およびkeys()
メソッドを修正しました。r.internalRedirect()
のエラー例外を修正しました。Object.getOwnPropertyNames()
の正しくないキー順序を修正しました。items()
メソッドを修正しました。すべての機能、変更点、およびバグ修正の包括的なリストについては、njs Changesログを参照してください。
NGINX Plusを実行している場合は、できるだけ早くNGINX Plus R31にアップグレードすることを強くお勧めします。素晴らしい新機能に加え、いくつかの修正や改善も追加されます。また、最新の状態にしておくことで、サポートチケットを発行する必要がある場合に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."