NGINX.COM
Web Server Load Balancing with NGINX Plus

NGINX Plus Release 30 (R30)をリリースいたしました。NGINX Plusは、NGINXオープンソースをベースにした、唯一のオールインワン・ソフトウェアWebサーバー、ロードバランサー、リバースプロキシ、コンテンツキャッシュ、およびAPIゲートウェイです。

NGINX Plus R30の新機能は以下の通りです。

  • QUIC+HTTP/3のネイティブサポート – NGINX PlusがHTTP/3を正式にサポートしました。この実装では、サードパーティのライブラリに依存することなく、QUICプロトコル上でHTTP/3のサポートを提供するために必要なOpenSSL TLS機能の提供が可能です。NGINXチームによって開発されたOpenSSL互換レイヤーを使用して、OpenSSLによってサポートされていないQUIC TLSインターフェースの課題を回避します。
  • ワーカーごとのコネクション状況の監視 – ワーカーごとのコネクション状況の監視機能がサポートされました。これにより、ワーカープロセスの数を調整し、ワーカー間でコネクションを効果的に分散して最適なパフォーマンスを実現することで、NGINXのパフォーマンスを微調整できるようになりました。
  • 診断パッケージ – NGINX 診断パッケージは、問題のトラブルシューティングに必要なすべてのデータを単一の圧縮ファイルに収集します。これにより、NGINX PlusユーザーとF5サポート間のコミュニケーションが改善され、効率性が向上し、問題解決までの所要時間が短縮されます。

そしてこのリリースの注目は、NGINXオープンソースから継承された新機能とバグ修正、およびNGINX JavaScriptモジュールの更新です。

重要な動作の変更

: NGINX Plus R29以外のリリースからアップグレードする場合は、現在のバージョンと今回のリリースの間にあるすべてのリリースについて、以前のアナウンスブログの「動作における重要な変更点」のセクションを必ず確認してください。

listen … http2ディレクティブの廃止

listen … http2ディレクティブはNGINX 1.25.1で非推奨となりました。nginx -tを使用して NGINX の設定を確認すると、その旨の警告が表示されます。

nginx -t
nginx: [warn] the "listen ... http2" directive is deprecated, use the "http2" directive instead in etc/nginx/nginx.conf :15
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

このディレクティブを使用しているすべてのユーザーは、NGINXをアップグレードし、サーバーごとにHTTP/2を有効にするhttp2ディレクティブを使用することを強くお勧めします。

こちらを

listen 443 ssl http2;

下記に変更してください。

listen 443 ssl;
http2 on;

Amazon Linux 2 における GeoIP2 モジュールの利用不可

NGINX Plus の以前のバージョンでは、GeoIP2モジュールのビルドに Amazon Linux 2 EPELリポジトリの”libmaxminddb”ライブラリを使用していました。EPELリポジトリはこのライブラリを提供しなくなり、Amazon Linux 2ディストリビューションからもネイティブにアクセスできなくなりました。そのため、このモジュールをAmazon Linux 2用にビルドする実行可能な方法がないため、NGINX Plus R30では利用できなくなりました。

MQTT ディレクティブの変更点

MQTT メッセージを構築するためのバッファサイズを指定するためのmqtt_rewrite_buffer_sizeディレクティブは、mqtt_buffersディレクティブに代わりました。新しいディレクティブでは、各バッファのサイズを指定するとともに、 コネクションごとに割り当てられるバッファの数を指定することができます。

API バージョンの更新

NGINX Plus APIのバージョン番号が8から9に更新され、「ワーカーごとのコネクション状況の監視」で説明されているワーカーごとのメトリクスが追加されました。以前のバージョン番号でも動作しますが、出力にはそれ以降のAPIバージョンで追加されたメトリクスは含まれません。

プラットフォーム対応の変更

新たに以下のプラットフォームがサポートされます:

  • Debian 12
  • Alpine 3.18

以下プラットフォームはサポート対象外となります。

  • 2023年5月1日にサポート終了 (EOL) となったAlpine 3.14
  • Ubuntu 18.04 (2023年4月26日にサポート終了)

以下プラットフォームはNGINX Plus R31でサポート対象外となる予定です。

  • Alpine 3.15(2023年11月にサポート終了予定)

新機能の詳細

QUIC+HTTP/3のネイティブサポート

HTTP/3 over QUICは、多くの企業のお客様から待ち望まれていた機能であり、NGINX Plus R30で正式に導入することになりました。これは新しい技術の実装であり、今後のリリースでも引き続き注力していきます。NGINX Plusをご利用のお客様には、まずテスト環境などでお試しいただき、どのようなフィードバックでもご共有ください。

NGINX Plusは、セキュアな通信と暗号化機能をOpenSSLに依存しており、オペレーティングシステムに同梱されているSSL/TLSライブラリを利用しています。しかし、QUICのTLSインターフェイスは、このリリースの時点ではOpenSSLによってサポートされていないため、HTTP/3で必要とされる不足しているTLS機能を提供するためにサードパーティのライブラリが必要です。

この懸念に対処するため、NGINXチームはOpenSSL互換レイヤーを開発し、quictls、BoringSSL、LibreSSLのようなサードパーティのTLSライブラリをビルドして出荷する必要性を排除しました。これにより、カスタムTLS実装の負担や、サードパーティライブラリのスケジュールやロードマップに依存することなく、NGINXでエンドツーエンドのQUIC+HTTP/3エクスペリエンスを管理することができます。今後のリリースでは、0-RTTのサポートなど、より多くの機能とオプションでOpenSSL互換レイヤーを強化する予定です。

QUIC+HTTP/3の設定例を下記に示します。

http {
        log_format quic '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" "$http3"';
        access_log logs/access.log quic;
        server {             # for better compatibility it's recommended             # to use the same port for quic and https             listen 8443 quic reuseport;             listen 8443 ssl;
            ssl_certificate     certs/example.com.crt;             ssl_certificate_key certs/example.com.key;
            location / {                 # required for browsers to direct them into quic port                 add_header Alt-Svc 'h3=":8443"; ma=86400';             }         }     }

NGINX Plus R29で導入されたテスト段階でのHTTP/3サポートとは異なり、NGINX Plus R30のQUIC+HTTP/3サポートは単一のバイナリで利用できます。この改善により、環境への機能導入が容易になります。

注:NGINX Plus R30では、スタンドアロンQUICバイナリのサポートとアップデートを終了し、今年後半にはダウンロードオプションとして削除する予定です。

ワーカーごとのコネクション状況の監視

NGINX Plusのユーザーは、worker_connectionsディレクティブを適切に調整するために、ワーカープロセスごとのコネクションの合計を監視できるようになりました。この改善により、ワーカー間でどのようにコネクションが分散されているかをよりよく把握できるようになりました。ワーカーごとのコネクションを調整できるようになったことで、NGINXのデプロイメントをより適切に評価できるようになりました。

ワーカーごとのコネクションメトリクスは REST API で利用できます。ワーカーごとの接続メトリクスを取得するには、…/api/9/workersエンドポイントを使用します。

ワーカーごとのコネクションメトリクスを取得するには、.../api/9/workers/<worker id>エンドポイントを使います。worker idは0から始まるインデックスです。

レスポンスの例を下記に示します。

{     {         "id": 0,         "pid": 2346,         "connections": {             "accepted": 1,             "dropped": 0,             "active": 1,             "idle": 0         },         "http": {             "requests": {                 "total": 15,                 "current": 1             }         }     },     {         "id": 1,         "pid": 1234,         "connections": {             "accepted": 3,             "dropped": 0,             "active": 1,             "idle": 0         },         "http": {             "requests": {                 "total": 15,                 "current": 1             }         }     },
    ...
}

以下に示すように、NGINX Plusのライブアクティビティ監視ダッシュボードでは、ワーカーごとのコネクションメトリクスを確認できます。demo.nginx.comでこの機能のライブデモにアクセスしてみてください。

NGINX Plus Live Activity Monitoring Dashboard showing the information below about NGINX Plus connections and requests

ダッシュボードには、NGINX Plusのコネクションとリクエストに関する以下の情報が表示されます。

コネクション数:

  • ワーカーごとの、確立したコネクション数
  • ワーカーごとの、アクティブなコネクション数
  • ワーカーごとの、アイドルコネクション数
  • ワーカーごとの、ドロップされたコネクション数

リクエスト数

  • ワーカーごとの、現在のリクエスト数
  • ワーカーごとの、総リクエスト数
  • ワーカーごとの、リクエスト数/秒

診断パッケージ

問題解決のための所要時間を短縮するために、診断パッケージは NGINX 環境の問題のトラブルシューティングに必要なデータの収集プロセスを合理化します。また、診断パッケージは、問題のトラブルシューティングに必要な情報を手動で要求および収集することに関連する不一致や遅延を回避し、NGINX Plusのお客様とF5サポート間のやり取りをより効率的にします

診断パッケージは以下の情報を収集します。

  • NGINX情報 – NGINX Plusのバージョン、設定、プロセス情報、サードパーティモジュール、ログ、API統計およびエンドポイント
  • システム情報 – ホストコマンド(ps, lsof, vmstatなど)
  • サービス情報systemdなど
  • NGINXエージェント – ログおよび設定(存在する場合)
  • NGINX App Protect – ログおよび構成(存在する場合)
  • サポートパッケージログlog – 収集されたすべてのファイルのリストを含むログ

診断パッケージを追加する目的は、パッケージ内のスクリプトがどのようなコマンドを実行し、どのようなデータが収集されるかをユーザーに透過的に示すことです。NGINX Plus診断パッケージのページを参照してください(リンクは近日公開予定です。)

注: 診断パッケージの利用可能性は、現在のNGINX Plus R30リリースの一部として発表されていますが、診断パッケージは実際にはリリースに依存しません。今後、トラブルシューティングのデータ収集プロセスを改善する目的で、お客様およびF5サポートからのフィードバックに基づいて更新する予定です。

NGINX Plus R30のその他の機能強化

MQTTの最適化

メッセージ・キューイング・テレメトリ・トランスポート(MQTT)フィルター・モジュールのメモリ消費量の改善により、スループットが4~5倍向上しました。

ディレクティブmqtt_rewrite_buffer_sizeが削除されました。その代わりに、新しいディレクティブmqtt_buffers <num> <size>が導入され、モジュールが接続ごとに割り当てるバッファの数と、それぞれのバッファのサイズが指定できるようになりました。デフォルトのバッファ数は100で、各バッファのデフォルトのサイズは1024バイトです。

DNS リロードの最適化

NGINX Plusは、リロード時に動的に解決されたアップストリームホストのDNS名の有効期限を保持するようになり、設定のリロード時に再解決の必要性がなくなりました。この更新前は、すべてのアップストリームに対して DNS 名前解決がトリガされました。この更新により、NGINXはすべてのアップストリームのDNS名前解決と有効期限を保持し、リロード時に新規または変更されたアップストリームに対してのみDNS名前解決をトリガします。

この最適化は、多数のアップストリームホストを含むNGINX環境で最も効果を発揮します。NGINXの構成に100以上のアップストリームホストがある場合、最適化が最も顕著になります。

NGINXオープンソースから継承された変更点

NGINX Plus R30はNGINXオープンソース1.25.1をベースとしており、NGINX Plus R29のリリース以降(NGINX 1.25.0および1.25.1)に行われた機能変更、機能、バグ修正を継承しています。

変更点

  • HTTP/2サーバープッシュのサポートが削除されました。HTTP/2 server_push は最小限の採用しかなく、非常に限られたユースケースでしか使用できませんでした。(IETF 102 reference documentation によると、セッションのわずか 0.04% で使用されていました。RFC 913 によると、「効果的に使用することは困難」でした)。HTTP/2サーバープッシュは、Chromeバージョン106で無効になりました。この変更に伴いhttp2_pushhttp2_push_preloadhttp2_max_concurrent_pushesディレクティブは廃止されました。
  • 非推奨のsslディレクティブはサポートされなくなりました。sslディレクティブは NGINX 1.15.0 で非推奨となり、 listen ディレクティブのsslパラメータで置き換えられました。非推奨の ssl ディレクティブは削除されました。
  • 前述のとおり、listen … http2ディレクティブは非推奨です。代わりにhttp2ディレクティブを使うことを推奨します。
    • OpenSSL v1.0.2h 以降の SSL 接続では、サーバー名識別 (SNI) で選択された仮想サーバーで HTTP/2 プロトコルが有効になっていれば、 アプリケーション層プロトコルネゴシエーション (ALPN) コールバックで自動的に選択されます。
    • 古いバージョンの OpenSSL の場合、HTTP/2 プロトコルはデフォルトの仮想サーバー構成に基づいて有効になります。
    • プレーン TCP 接続の場合、デフォルトの仮想サーバーで HTTP/2 が有効になっていれば、HTTP/2 は HTTP/2 preface によって自動検出されるようになりました。preface が一致しない場合は、HTTP/0.9-1.1 が想定されます。
  • 同じリスニングソケットでのHTTP/2 over Cleartext TCP (h2c)とHTTP/1.1をサポートしました。既存の実装では、ユーザーが h2c リスニングソケット (例: listen port_num http2) を設定した場合、HTTP/2 コネクションしか作成できません。h2リスニングソケットはHTTP/1.1とHTTP/2の両方をサポートし、ALPNによるプロトコルのネゴシエーションを行います。しかし、既存の実装では、HTTP/1.1クライアントはソケット上で失敗し、HTTP Upgradeをプロトコルのネゴシエーションの手段として使うことができません。この変更により、HTTP/2 を使用する場合、プレーン TCP ソケット上で HTTP/1.1 と HTTP/2 を同時にサポートすることができます。
  • いくつかの$sent_http_*で起こりうるバッファオーバーランの回避が有効になりました。マルチヘッダの $sent_http_ 変数を評価するロジックに欠陥があり、特定の要素がクリアされてもリンクリストに残っていると、バッファオーバーランの可能性がありました。この問題は、サードパーティモジュールを使用してマルチヘッダ値を上書きした場合に発生しました。今回の更新では、洗練された境界チェックが導入され、これらの変数のより安全な処理と評価が保証されるようになりました。

特徴

  • HTTP/3のフルサポートが追加されました。NGINX 1.25.0メインラインバージョンでHTTP/3のサポートが導入され、このサポートはNGINX Plus R30にマージされました。NGINX Plus R30の実装は、NGINX Plus R29で提供された実験的なパッケージと比較して、以下の変更があります。
    • quic_mtuディレクティブの削除
    • http3 parameter of listenの削除
    • stream モジュールから QUIC サポートを削除
    • HTTP/3 サーバープッシュの削除
    • OpenSSL 3.2+ での OpenSSL 互換レイヤーのビルドを修正

バグ修正

  • 正規表現 (regex) の学習リストの割り当てに失敗した場合のsegfaultを修正。

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

NGINX JavaScript モジュールへの変更

NGINX Plus R30には、NGINX JavaScript(njs)モジュールバージョン0.8.0からの変更が組み込まれています。

機能

  • グローバルNGINXプロパティを導入:
    ngx.buildngx.conf_file_pathngx.error_log_pathngx.prefixngx.versionngx.version_numberngx.worker_id
  • httpstream用にjs_shared_dict_zoneディレクティブを導入し、ワーカープロセス間で共有される辞書を宣言できるようにした。
  • ES13 準拠の Array メソッドを追加しました: Array.from()、Array.prototype.toSorted()、Array.prototype.toSpliced()、Array.prototype.toReversed()。
  • ES13準拠のTypedArrayメソッドを追加しました: %TypedArray%.prototype.toSorted()、%TypedArray%.prototype.toSpliced()、%TypedArray%.prototype.toReversed()。
  • WebCrypto APIにCryptoKeyプロパティを追加しました。これらのプロパティが追加されました: algorithm、extractable、type、usages。

変更点

  • 0.7.10で導入されたFetch APIにおいて、禁止されているヘッダの特別な扱いを削除しました。
  • バージョン 0.5.0で非推奨となったr.requestBody()を http モジュールから削除しました。代わりにr.requestBufferまたはr.requestTextプロパティを使用する必要があります。
  • バージョン 0.5.0で非推奨となったr.responseBody()を http モジュールから削除しました。代わりにr.responseBufferまたはr.responseTextプロパティを使用する必要があります。
  • httpモジュールでフィルタリング中にr.internalRedirect()で例外がスローされます。
  • ネイティブ・メソッドはretval引数で提供されます。この変更は、コードの修正を必要とするnjsのC拡張との互換性を破壊します。
  • 非準拠の非推奨 String メソッドが削除されました。以下のメソッドが削除されました:String.bytesFrom(), String.prototype.fromBytes(), String.prototype.fromUTF8(), String.prototype.toBytes(), String.prototype.toUTF8(), String.prototype.toString(encoding)
  • GNU readlineによるビルドのサポートを削除しました。

バグ修正

  • httpモジュールでフィルタリングを行う際のr.statusセッターを修正しました。
  • httpモジュールでLocationヘッダの設定を修正しました。
  • сrypto.getRandomValues()のretvalを修正しました。
  • 関数式による計算プロパティ名の評価を修正しました。
  • 配列で宣言された関数式の暗黙的な名前を修正しました。
  • for-inループの解析を修正しました。
  • ISO-8601フォーマットと UTC 時間オフセットを使用するDate.parse()を修正しました。

すべての機能、変更、およびバグ修正の包括的なリストについては、njs Changes logを参照してください。

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

NGINX Plusを実行している場合は、できるだけ早くNGINX Plus R30にアップグレードすることを強くお勧めします。素晴らしい新機能に加え、いくつかの修正や改善も追加されます。また、最新版であることは、サポートチケットを発行する必要がある場合にNGINXがお客様をサポートするのに役立ちます。

NGINX Plusをまだお試しでない方は、ぜひチェックしてみてください。セキュリティ、ロードバランシング、APIゲートウェイのユースケースとして、または強化されたモニタリングと管理APIを備えた完全にサポートされたWebサーバーとして使用できます。30日間の無料トライアルをご利用ください。

Hero image
モダン・アプリケーションやAPIを保護するセキュリティ

今日のアプリケーションを取り巻く状況は劇的に変化し、最新のアプリケーションはコンテナの中で実行され、API を通じて通信し、自動化されたCI/CD パイプラインでデプロイされるマイクロサービスが主流となりつつあります。そんなモダンアプリケーションやAPIを保護するためのアプリケーションセキュリティについて解説します。



著者について

Prabhat Dixit

Principal Product Manager

About F5 NGINX

F5 NGINXについて
F5, Inc.は、人気のオープンソースプロジェクト「NGINX」を支援しています。NGINXはモダンアプリケーションを開発・構築するためのテクノロジースイートを提供しています。NGINXとF5製品との併用で、コードからユーザーまでの広範なアプリケーション領域をサポートし、マルチクラウドアプリケーションサービスとしてNetOpsとDevOps間の課題を解決します。

詳しくはnginx.co.jpをご覧ください。Twitterで@nginxをフォローして会話に参加することもできます。