NGINX Plus リリース 26 (R26)が利用可能になったことをお知らせします。 NGINX オープンソースをベースにした NGINX Plus は、唯一のオールインワンソフトウェア Web サーバー、ロード バランサー、リバース プロキシ、コンテンツ キャッシュ、API ゲートウェイです。
NGINX Plus R26の新機能と強化された機能は次のとおりです。
http{}
コンテキストで仮想サーバーに IMAP 電子メール プロトコルを提案した場合)。async
およびawait
キーワードとPromise
オブジェクトを使用する非同期関数がサポートされるようになり、暗号化操作 (乱数の生成や Cookie の暗号化など) 用の WebCrypto API が実装されました。このリリースには、 IBM System Z (s390x)アーキテクチャのサポート、TCP 接続の各方向を個別に閉じる機能、および Perl 互換正規表現 (PCRE) ライブラリのバージョン 2 のサポートが含まれています。
js_include
をサポートしなくなりましたNGINX Plus R23のリリース時に発表されたように、バージョン0.4.0NGINX JavaScript モジュールでは、 js_include
ディレクティブがjs_import
ディレクティブに置き換えられました。 js_include
ディレクティブは当時非推奨となり、このリリースではサポートされなくなりました。
NGINX Plus R26にアップグレードする前に、NGINX 設定ファイルでjs_include
をjs_import
に置き換え、NGINX 設定で参照される関数の JavaScript ファイルにexport
ステートメントを追加します。 次の手順に従ってください。
NGINX 設定ファイルを編集します。
js_include
をjs_import
に置き換え、暗黙のmodule_name ( .js拡張子のないディレクティブへの JavaScript ファイル名パラメータ) をメモします。
JavaScript 関数を参照する各ディレクティブで、関数名の前にmodule_nameを付けます。 関数名はこれらのディレクティブの最初のパラメータです。
たとえば、次のように変更します。
js_set $foo myFunction;
に:
js_set $fooモジュール名.myFunction;
NGINX 構成ファイルで参照される関数を定義する JavaScript ( module_name .js ) ファイルを編集します。 参照される関数に名前を付けて、次のようなエクスポート
ステートメントを各ファイルに追加します。
デフォルトをエクスポートする { myFunction, otherFunction }
export
ステートメントは.jsファイル内のどこにでも記述できますが、慣例により関数の真上かファイルの末尾に配置されます。
サードパーティの Cookie-Flag モジュールはNGINX Plus R23で非推奨となり、その時点で発表されたとおり、このリリース時点ではNGINX モジュール リポジトリでは利用できなくなりました。
NGINX Plus R26にアップグレードする前に、NGINX 設定を編集して、 set_cookie_flag
ディレクティブ (非推奨のモジュールで定義) を組み込みのproxy_cookie_flags
ディレクティブに置き換えます。
NGINX が TLS および HTTP/2 接続を確立する方法が更新されました。 NGINX とクライアント (通常はブラウザ) 間の TLS ハンドシェイクの一環として、ハンドシェイクによって確立されたセッションで使用される通信プロトコルがネゴシエートされます (ほとんどの場合、ネゴシエーションによってセッションが HTTP 1.xから HTTP/2 にアップグレードされます)。 TLS の Next Protocol Negotiation (NPN) 拡張は、この目的で最初に使用された方法でしたが、NPN は現在では廃止されていると見なされ、 RFC 7301として公開されている Application‑Layer Protocol Negotiation (ALPN) 拡張に置き換えられています。
NGINX Plus R26 ではNPN がサポートされなくなったため、クライアントは ALPN のみを使用する必要があります。
さらに、ALPN 実装が拡張され、強化されました。強化された TLS ハンドシェイクを参照してください。
NGINX Plus R24のリリースでは、すべての NGINX ソフトウェアのパッケージ リポジトリが再編成され、NGINX Plus のインストール手順が変更されました。
NGINX Plus をインストールまたはアップグレードすると、オペレーティング システムのパッケージ マネージャー ( apt
、 yum
、または同等のもの) が NGINX Plus のソフトウェア リポジトリで構成されます。
古いplus-pkgs.nginx.comリポジトリを使用するように構成された既存のシステム ( NGINX Plus R23以前を実行しているシステム) でNGINX Plus R26にアップグレードする場合は、新しいpkgs.nginx.com/plusリポジトリを参照するようにパッケージ マネージャーを更新する必要があります。 F5 ナレッジベースの手順を参照してください。
NGINX Plus R26の初期インストールを実行する場合は、『 NGINX Plus 管理者ガイド』の「NGINX Plus のインストール」を参照してください。
NGINX Plus R26は古いリポジトリでは利用できません。今後更新されることはありません。
NGINX Plus ソフトウェア パッケージには、 NGINX Plus API用の YAML 形式のOpenAPI 仕様とSwagger UI が含まれなくなりました。これらには、 NGINX Plus 管理ガイドからアクセスできるようになりました。
サポートされる新しいオペレーティング システムとアーキテクチャ:
削除された古いオペレーティング システム:
NGINX Plus R27で非推奨となり削除が予定されている古いオペレーティング システムとアーキテクチャ:
JSON Web トークンを検証する際、NGINX は JSON Web キー セット (JWKS) を使用してトークンの署名を検証するか、トークンを復号化します。 JWKS は、構成ファイルに保存することも、HTTP リクエストを介して外部サービスから取得することもできます。 さらに、JWKS をメモリにキャッシュすることにはいくつかの利点があります。
JWKS をメモリにキャッシュするには、新しいauth_jwt_key_cache
ディレクティブを追加し、各キー セットの有効期限を指定します (この例では 3 時間)。
JWK を外部サーバーから取得する場合は、標準のコンテンツ キャッシュを設定し、 proxy_cache_use_stale
ディレクティブを含めることもお勧めします。これにより、期限切れの JWKS をバックグラウンドで更新しながら引き続き提供するように NGINX Plus に指示します。
JWKS キャッシュに加えてコンテンツ キャッシュを使用する利点は 2 つあります。
回復力- JWKS は期限が切れた場合でもキャッシュから取得できます。 これにより、JWKS プロバイダーが一時的に利用できない場合の回復力が向上しますが、セキュリティ リスクが増加するというトレードオフがあります。
認可サーバーへの影響– キャッシュされた JWKS の有効期限が切れると、JWKS キャッシュが単独で使用されているか、コンテンツ キャッシュと組み合わせて使用されているかによって、認可サーバーに異なる影響が及びます。
JWKS キャッシュのみの場合、期限切れの JWKS の新しいバージョンがキャッシュに再入力されるまで、すべての受信認証要求は認証サーバーに転送されます。 認証サーバーの応答が遅い場合、JWKS に対する HTTP リクエストの繰り返しが急増する可能性があります。 この余分な負荷により認証サービスが過負荷になり、問題が悪化する可能性があります。
期限切れの JWKS の提供でコンテンツ キャッシュが有効になっている場合、JWKS のリクエストが 1 つだけ認証サーバーに転送され、後続のリクエストはコンテンツ キャッシュが読み込まれた後、NGINX がそれらを満たすことができるまでキューに入れられます。 これにより、認証サービスに対する需要 (およびリソース消費) が減少します。
ALPACAなどの TLS に対する攻撃が増加しています。 エクスプロイトに対するプロアクティブな防御への継続的な取り組みの一環として、NGINX の TLS 接続の処理を強化しました。
アプリケーション層プロトコル ネゴシエーション (ALPN) は、TLS ハンドシェイクのオプションの拡張機能であり、TLS ハンドシェイク中にクライアントとサーバーによって使用され、ハンドシェイクによって確立された暗号化セッションで使用するレイヤー 7 プロトコルを選択します。 ALPN の最も一般的な使用例は、ブラウザと Web サーバーまたはアプリ サーバー間のセッションで HTTP/ 1.xから HTTP/2 へのアップグレードをネゴシエートすることです。
NGINX Plus は、確立されているセッションの NGINX 構成コンテキストと一致しないプロトコルをクライアントが ALPN 経由で提案した場合、TLS ハンドシェイクを拒否するようになりました。 たとえば、 http{}
コンテキストで定義された仮想サーバーには HTTP の ALPN プロトコル ID が必要ですが、 mail{}
コンテキストの仮想サーバーには SMTP、POP、または IMAP のプロトコル ID が必要です。
NGINX Plus R26 では、ネゴシエートされたプロトコルをキャプチャするための$ssl_alpn_protocol
[ HTTP ][ Stream ] 変数が導入されました。 ( NGINX Plus R15のstream{}
コンテキストで導入された$ssl_preread_alpn_protocols
変数は、ハンドシェイク中にクライアントによってアドバタイズされたすべてのプロトコルのリストを引き続きキャプチャします。)
このスニペットは、 $ssl_alpn_protocol を
使用してアクセス ログのエントリのalpn=
フィールドにプロトコルを含めるalpnログ形式を定義します。
stream{}
コンテキストの新しいssl_alpn
ディレクティブは、NGINX Plus が受け入れるプロトコルを定義します。 NGINX Plus がクライアントによって提示されるすべてのプロトコルを考慮できるようにするには、ディレクティブを省略します。
NGINX Plus R26にはバージョンが組み込まれています0.7.2NGINX JavaScript モジュール (njs) の 2 つの機能強化が含まれています。
async
およびawait
キーワードとPromise
オブジェクトを使用した非同期関数のサポートが強化されました。注記: このセクションでは、非同期操作と暗号化操作の JavaScript 構造を理解していることを前提としています。 コード スニペットの完全な分析はこのブログの範囲外です。
[編集者注– このセクションで説明するユースケースは、NGINX JavaScript モジュールの多くのユースケースのうちのほんの一部です。 完全なリストについては、 「NGINX JavaScript モジュールの使用例」を参照してください。
PHP などの一般的に使用される多くのスクリプト言語では、コマンドと関数は同期して実行されます。つまり、スクリプトが関数を呼び出した後、関数が結果を返すまでスクリプトは一時停止(実行を停止)します。
JavaScript は非同期的に動作することもできます。関数が非同期的に呼び出されると、スクリプトは関数から結果が返されるのを待たずに実行を続けます。
次のサンプル スクリプトをご覧ください。
njs ランタイムは定義されたタイムアウトが経過するのを待たないため、空の応答が返されます (待機した場合、出力はb,a
になります)。
$カール http://127.0.0.1/ $
非同期操作を正しく処理することは、意図した結果を得るために明らかに重要です。 JavaScript ではこれを行う方法がいくつか提供されていますが、一般的な NGINX の使用例では、実行フローを同期させる方法で非同期関数をラップすることが望ましい場合がよくあります。 ここで、 Promise
オブジェクトとasync
およびawait
キーワードが役立ちます。
ECMAScript 6 (JavasScript の ECMA‑262 言語仕様の第 6 版) では、 Promise
オブジェクトを非同期関数の戻り値の型として定義しています。 次の 3 つの状態のいずれかが存在します。
キーワードasync を
使用して JavaScript 関数を定義すると、関数の戻り値の型がPromise
に設定されます。 Promise
オブジェクトを扱う njs 関数を記述する場合、 async
およびawait
キーワードは重要です。
次の例を見てみましょう。
fs.readFile
関数 (12 行目) はPromise
を返します。 これは、ファイルがuser.textと呼ばれる場合にのみfs.readFile()
が呼び出されるようにするカスタム非同期
関数でラップされています。 await
キーワードがあるため、ラッピング関数はPromise
を待機し、データを返します。
fs.readFile() を
別の関数でラップすると、エラーをキャッチしやすくなります。非同期
関数で例外が発生すると、 Promise
の状態がdenied
に設定されます。 これを行う別の方法は、9 行目を、拒否されたPromise を
返すステートメントに置き換えることです。
Promise
オブジェクトを直接操作することもできます。 次の例では、 Promise.resolve
関数はp1
とp2
のそれぞれに対してPromise
を返します。 Promise.all
関数は、結果を返す前に、 p1
とp2 の
両方の Promise が解決されるのを待機します。
これで、 curl
コマンドからの出力が目的のものになりました (タイムアウト値が短いため、最初にb
が返されることに注意してください)。
$カール http://127.0.0.1/ b,a $
NGINX JavaScript は、 WebCrypto APIを介して強化された暗号化機能にアクセスできるようになりました。一般的な njs 暗号化の使用例は次のとおりです。
この njs コードは乱数を生成します:
この NGINX Plus 構成は njs コードを呼び出します。
関数の出力は次のような乱数になります。
$カール 127.0.0.123225320050,3668407277,1101267190,2061939102,2687933029,2361833213,32543985,4162087386
WebCrypto のgetRandomValues
関数は、安全な乱数と WebCrypto 全般を使い始めるのに最適なエントリ ポイントです。 その実装は非常にシンプルで、関数はPromise
を返すのではなく、結果を直接返します。
ただし、他のより集中的な WebCrypto 暗号化機能の一部は非同期で動作します。 たとえば、 сrypto.subtle.digest()
のドキュメントには次のように記載されています。
指定されたデータのダイジェストを生成します。 使用するダイジェスト アルゴリズムの識別子とダイジェストするデータを引数として受け取ります。 を返す 約束
ダイジェストで実現されます。
したがって、 сrypto.subtle.digest()
を直接呼び出しても、それがasync
関数にラップされていない限り、その結果が次のステップで使用できることは保証されません。 そこで、ここではasync
およびawait
キーワードを使用して関数にラップし、関数が返される前にハッシュ変数に結果が確実に設定されるようにします。
この NGINX Plus 設定のjs_set
ディレクティブは、 setReturnValue
関数によって返された値 ( host_hash
関数にラップされている) を$hosthash
変数に入力します。
以下は、ホスト名example.comをハッシュする例です。
$ curl -H "ホスト: example.com" 127.0.0.1 # e8e624a82179b53b78364ae14d14d63dfeccd843b026bc8d959ffe0c39fc4ded1f4dcf4c8ebe871e657a12db6f11c3af87c9a1d4f2b096ba3deb56596f06b6f4
現代のアプリケーションがあらゆるデジタルバイオームに浸透するにつれて、NGINX のような重要な生命維持コンポーネントもそれらとともに移動することが重要になります。そのため、CentOS 8.1+、RHEL 8.1+、Ubuntu 20.04 を搭載したIBM Z (s390x)アーキテクチャで NGINX Plus をサポートできることを嬉しく思います。 既存のメインフレーム資産上で最新のアプリケーションをホストすることを検討している組織は、NGINX と NGINX Plus をソフトウェア ベースの Web サーバー、ロード バランサー、リバース プロキシ、コンテンツ キャッシュ、API ゲートウェイとして導入できるようになりました。
新しいproxy_half_close
ディレクティブにより、TCP 接続の各方向を独立して閉じることができるため、 stream{}
コンテキストでの効率が向上します。
以前のバージョンの NGINX Plus では、 Perl 互換正規表現 (PCRE) ライブラリ(バージョン 1) を使用して、NGINX 構成で使用される正規表現を評価します。 この重要なオープンソース プロジェクトは最近サポート終了となり、 PCRE2に置き換えられました。 NGINX Plus は PCRE2 を使用して構築されていますが、基盤となるオペレーティング システムで利用可能なバージョンを使用して、PCRE と PCRE2 の両方で構築された動的モジュールをサポートします。 構成の変更は必要ありません。
NGINX Plus を実行している場合は、できるだけ早くNGINX Plus R26にアップグレードすることを強くお勧めします。 また、いくつかの追加の修正と改善も行われ、サポート チケットを発行する必要があるときに NGINX がサポートしやすくなります。
NGINX Plus をまだお試しいただいていない方は、セキュリティ、負荷分散、API ゲートウェイとして、または強化された監視および管理 API を備えた完全にサポートされた Web サーバーとして、ぜひお試しください。 30 日間の無料トライアルを今すぐ開始できます。
「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"