NGINX Plus リリース 20 (R20)が利用可能になったことをお知らせします。 NGINX Plus は、ロードバランサー、コンテンツ キャッシュ、Web サーバー、API ゲートウェイをオールインワンで提供する唯一の製品です。 NGINX オープンソースをベースにした NGINX Plus には、独自の拡張機能と受賞歴のあるサポートが含まれています。
NGINX Plus R20 は、 R19 でレート制限とキー値ストアに加えた機能強化に基づいて構築されています。 新しい機能は次のとおりです:
廃止された API – NGINX Plus R13 (2017 年 8 月リリース) では、メトリクス収集とアップストリーム グループの動的再構成のためのまったく新しいNGINX Plus API<.htmlspan>が導入され、以前にこれらの機能を実装していた Status および Upstream Conf API が置き換えられました。 当時発表されたとおり、非推奨の API はかなりの期間にわたって引き続き利用可能でサポートされていましたが、 NGINX Plus R16で終了しました。 構成にstatus
またはuploader_conf
ディレクティブが含まれている場合は、R20 へのアップグレードの一環として、それらをapi
ディレクティブに置き換える必要があります。
新しいNGINX Plus APIへの移行に関するアドバイスやサポートについては、ブログの移行ガイドを参照するか、サポート チームにお問い合わせください。
新しいオペレーティングシステムのサポート–
サポートされているプラットフォームの詳細については、 NGINX Plusおよび動的モジュールの技術仕様を参照してください。
NGINX Plus R20 では、運用チームと DevOps チームがレート制限アクティビティをリアルタイムで監視し、どのクライアントがレート制限を超えたかを正確に判断しやすくする機能が導入されています。
NGINX Plus は、レート制限するクライアント要求の種類を定義する方法や、過剰な要求を処理する方法に関して、常に高い柔軟性を提供してきました。 各リクエストは、次のいずれかの方法で処理されます。
以前のリリースでは、NGINX Plus がリクエストが遅延または拒否されたという事実を記録する場所は、次のような標準化されたエントリのエラー ログのみでした。
2019/12/02 11:42:12 [エラー] 57#57: *339 リクエスト制限超過: ゾーン「my_limit」による 0.600、クライアント: 172.17.0.1、サーバー: www.example.com、リクエスト: 「GET / HTTP/1.0」、ホスト:「www.example.com:80」
メッセージ形式が構造化されておらず、構成できないため、エラー ログから有用な情報を抽出するのは難しい場合があります。 さらに、レート制限がエラー ログ エントリに記載されているもの以外のメッセージ特性 (HTTP ヘッダーや ID 情報など) に基づいている場合は、アクセス ログで対応するエントリを見つけて、どのクライアントがレート制限を超えたかを正確に判断する必要があります。 新しい機能はこれらの問題に対処します。
NGINX Plus APIの新しいエンドポイント、 /api/ version /http/limit_reqs は
、 limit_req_zone
ディレクティブによって定義された各ゾーンに対して行われたレート制限の決定に対するすべての結果のカウンターを維持します。 これらのカウンターは、レート制限の決定をリアルタイムで監視するために使用することも、APM ソリューションと統合してダッシュボードを提供し、レート制限アクティビティに関するアラートを提供することもできます。
次の例では、 my_limit という1 つのゾーンが定義されています。
$ curl http://localhost/api/6/http/limit_reqs { "my_limit": { "delayed": 540、「遅延ドライ実行」: 12162、「合格」: 804541、「拒否」: 63、「拒否されたドライラン」: 1209 } }
これらのカウンターには、 NGINX Plus R19で導入されたdry-run モードで処理された過剰なリクエストのエントリも含まれていることに注意してください。
リアルタイム メトリックは、NGINX Plus が過剰なリクエストを処理しているタイミングを把握するのに非常に役立ちますが、誰がリクエストを生成しているかはわかりません。 この課題に対処するために、 NGINX Plus R20 では新しい$limit_req_status
変数が提供されます。 リクエストのレート制限ステータスを記録します。 DELAYED
、 DELAYED_DRY_RUN
、 PASSED
、 REJECTED
、またはREJECTED_DRY_RUN
。
その後、クライアント、URI、およびその他の関連情報を一意に識別する他の変数をログ形式に含めることができます。 次の構成では、JSON Web Token (JWT) 検証 (行 1) に基づいて、各クライアントに対して 1 秒あたり 10 リクエストの厳格なレート制限が適用されます。 過剰なリクエストは拒否され (行 16)、別のログ ファイルに記録されます (行 21)。このログ ファイルには、サブ
クレームをキャプチャするための$jwt_claim_sub
変数も含まれます (行 4)。
reject.logファイルのエントリの例:
time=1575289305.350 client=10.0.0.1 sub=adam uri=/ status=429 limit_req=REJECTEDtime=1575289305.395 client=10.0.0.1 sub=adam uri=/ status=429 limit_req=REJECTED
time=1575289305.402 client=10.0.0.1 sub=adam uri=/ status=429 limit_req=REJECTED
NGINX Plus は、リクエストのレート制限に加えて、 Limit Connections モジュールによるクライアント接続の制限もサポートしています。 クライアントが NGINX Plus に対して開くことができる個別の接続の数 (または HTTP/2 を使用する場合の同時リクエストの数) を定義できます。 クライアントは通常、リモート IP アドレス ( $remote_addr
または$binary_remote_addr
変数) によって識別されますが、リモート IP アドレスがあいまいな場合や複数のクライアントによって共有される可能性がある場合は、別の変数 (JWT 内のユーザー名の$jwt_claim_sub
など) を使用できます。
NGINX Plus R20 は、 NGINX Plus R19およびこのリリースで導入されたレート制限と同じ機能強化により、接続制限を拡張します。
limit_conn_dry_run
ディレクティブを使用したドライランモード/api/ version /http/limit_conns
でのリアルタイム監視$limit_conn_status
は、各リクエストの接続制限の決定 ( PASSED
、 REJECTED
、またはREJECTED_DRY_RUN
) をキャプチャし、 $limit_req_status
変数のアクセス ログでのレート制限アクティビティの記録の説明に従って使用できます。次の構成では、10 を超える同時接続を開くクライアントに低い帯域幅が適用されます。
NGINX Plus のインメモリ キー値ストアを使用すると、 NGINX Plus API を使用して、リクエストの属性に基づいてトラフィック管理を動的に構成できます。 サンプルの使用例には、 IP アドレスの動的なブラックリスト、動的な帯域幅の制限、認証トークンのキャッシュなどがあります。
NGINX Plus R20 では、指定されたプレフィックス (文字列の先頭の文字) とキーを照合するサポートが追加され、キー値ストアの新しいユースケース セットが可能になります。 たとえば、正確な URI ではなく URI プレフィックス (ベース パス) に対してキーを照合できるということは、場所
ディレクティブによって定義された静的マッピングを置き換えたり拡張したりして、各ベース パスをアップストリーム グループにマッピングする動的ルーティング テーブルを作成できることを意味します。
プレフィックス マッチングを有効にするには、 keyval_zone
ディレクティブに新しいtype=prefix
パラメータを含めます。 次の設定では、 keyval
ディレクティブはCache-Control
ディレクティブ ( max-age
やno-cache
など) を各 URI プレフィックスに関連付け、 add_header
ディレクティブは、NGINX Plus がリクエストをアップストリーム サーバーに転送するときにCache-Control
応答ヘッダーをその値に設定します。
NGINX Plus API を使用して、キー値ストア内の各ベースパス(この場合は、 /images/または/reports/で始まるパス)のCache-Control
応答ヘッダーの値を定義します。
$ curl -i -X POST --data '{"/images/":"max-age=3600", "/reports/":"no-cache"}' http://localhost:8080/api/6/http/keyvals/paths HTTP/1.1 201 作成済み サーバー: nginx/1.17.6 日付: 2019年12月2日月曜日 12:36:31 GMT コンテンツの長さ: 0 場所: http://localhost:8080/api/6/http/keyvals/paths/ 接続: keep-alive
キー値ストアに存在するベースパスを使用してリクエストを行うと、レスポンスには設定したCache-Control
ヘッダーが含まれます。
$ curl -I http://localhost/images/sample.jpg HTTP/1.1 200 OK サーバー: nginx/1.17.6 日付: 2019年12月2日月曜日 12:27:39 GMT コンテンツタイプ: image/jpeg コンテンツ長: 120847 接続: キープアライブ キャッシュ制御: max-age=3600
キー値ストアはNGINX Plus インスタンスのクラスター全体で同期できるため、各 API 呼び出しを 1 つのインスタンスに対してのみ行う必要があります。 これにより、クラスター構成の変更を自動化するプロセスが、構成ファイルの変更を調整するプロセスよりもはるかに簡単になります。
NGINX Plus を使用して複数のアップストリーム サーバー間で負荷分散を実行する場合、複数の IP アドレスに解決されるホスト名を指定して、アップストリーム グループのメンバーを定義できます。 これは、アップストリーム グループのメンバーが頻繁に変更される可能性がある動的環境または自動スケーリング環境で特に役立ちます。
これらの動的アップストリーム グループの構成を完了するには、ホスト名に関連付けられた IP アドレスを NGINX Plus が照会する DNS サーバーを指定するためのリゾルバ
ディレクティブも含めます。 以前のリリースでは、 resolver
ディレクティブは、ディレクティブを含むコンテキスト ( http
、 server
、またはlocation
) 内のproxy_pass
ディレクティブによって参照されるすべてのアップストリーム グループに適用されていました。 NGINX Plus R20では、アップストリーム グループごとに異なる DNS リゾルバを指定できるようになりました。
この新しい柔軟性は、DevOps 環境で特に役立ちます。これにより、アプリケーション チームは、集中化された共有サービスに依存するのではなく、DNS サーバーやサービス レジストリなどのアプリケーション配信インフラストラクチャをより多く所有できるようになります。
最上位レベルのhttp
コンテキスト、およびserver ブロック
とlocation
ブロックでグローバル リゾルバを定義することもできます。 アップストリーム
ブロックにリゾルバ
ディレクティブが含まれていない場合は、以前のリリースと同様に、アップストリーム グループを参照するproxy_pass
ディレクティブを含むコンテキストまたはブロックのリゾルバ
設定が継承されます。
次の例では、 Web サイトのアップストリーム グループはグローバル リゾルバを使用し、 mobile_app は独自のリゾルバを使用します。
リゾルバのアクティビティに関するエラーやその他のメトリックを収集するために、両方のリゾルバ
ディレクティブにstatus_zone
パラメータ ( NGINX Plus R19で導入) を含めていることに注意してください。
PROXY プロトコルは、レイヤー 4 プロキシが元のクライアント接続に関する情報を、クライアント要求を処理する次のプロキシまたはロード バランサに伝達できるメカニズムです。 これは、クライアントの IP アドレスを知る必要があるユースケースで特に重要です。たとえば、各クライアントによる接続の数を制限する場合 ( least_conn
ディレクティブを使用) や、実際のクライアントの IP アドレスをログに記録する場合などです。 以前のリリースと同様に、 $proxy_protocol_addr
変数がこの情報をキャプチャします。
アプリケーション環境に複数のレイヤー 4 プロキシが展開されている場合、クライアントが最初に接続したプロキシ サーバーの IP アドレスとポートを NGINX Plus が認識することも重要になることがあります。 PROXY プロトコル メタデータにはこの情報が含まれており、 NGINX Plus R20 ではそれをキャプチャするための変数が追加されています。
変数は HTTP モジュールと Stream (TCP/UDP) モジュールの両方で使用でき、PROXY プロトコルのバージョン 1 と 2 の両方をサポートします。 変数を使用する前に、 listen
ディレクティブにproxy_protocol
パラメータを追加して、NGINX Plus が PROXY プロトコルを処理できるように明示的に有効にする必要があることに注意してください。
NGINX Plus R18 P1 は、 8 月に発表されたHTTP/2 の 3 つのセキュリティ脆弱性に対処しました。 NGINX Plus R20には、HTTP/2 実装の全体的なセキュリティを向上させる追加の変更が含まれています。
worker_shutdown_timeout
ディレクティブの堅牢性が向上しました。proxy_request_buffering
ディレクティブの堅牢性が向上しましたNGINX Plus R18 (パッチ未適用) 以前で本番環境で HTTP/2 を使用している場合は、できるだけ早くNGINX Plus R20にアップグレードすることをお勧めします。
NGINX JavaScriptモジュール(njs)がバージョンに更新されました0.3.7より多くの JavaScript オブジェクトのサポートが追加されました。
Function()
コンストラクタObject.assign()
メソッド数値
メソッド: toFixed()
、 toPrecision()
、 toExponential()
Array.prototype.copyWithin()
メソッドconsole.time()
メソッドへのラベルパラメータnjs の詳細については、プロジェクトのホームページとブログ <.htmla> をご覧ください。
NGINX Plus を実行している場合は、できるだけ早くNGINX Plus R20にアップグレードすることを強くお勧めします。 また、多数の追加の修正と改善も行われ、サポート チケットを発行する必要があるときに NGINX がサポートしやすくなります。
アップグレードを進める前に、このブログ投稿に記載されている新機能と動作の変更をよく確認してください。
NGINX Plus をまだお試しいただいていない方は、セキュリティ、負荷分散、API ゲートウェイとして、または強化された監視および管理 API を備えた完全にサポートされた Web サーバーとして、ぜひお試しください。 30 日間の無料トライアルを今すぐ開始できます。 NGINX Plus がアプリケーションの配信と拡張にどのように役立つかを実際にご確認ください。
「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"