NGINX Plus R30リリースのお知らせ

NGINX | 2023年8月15日

NGINX Plus Release 30(R30)の提供開始をお知らせします。NGINX Open SourceをベースとするNGINX Plusは、Webサーバー、ロードバランサー、リバースプロキシ、コンテンツキャッシュ、APIゲートウェイの機能を1つに統合した唯一のソフトウェアです。

NGINX Plus R30の新機能および強化された機能は次のとおりです。

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

今回のリリースでは、NGINX Open Sourceから継承した新機能とバグ修正に加え、NGINX JavaScriptモジュールも更新されています。

動作に関する重要な変更

注記:NGINX Plus R29以外のリリースからアップグレードする場合は、現在のバージョンからこのバージョンまでの各リリースについて、動作に関する重要な変更のセクションを過去のリリース告知ブログで必ず確認してください。

Deprecation of listen … http2ディレクティブの非推奨化

The 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では、Amazon Linux 2のEPELリポジトリにある「libmaxminddb」ライブラリを使用して、GeoIP2モジュールをビルドしていました。現在、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
  • 2023 年 4 月 26 日にEOLを迎えたUbuntu 18.04

非推奨となり、NGINX Plus R31で削除予定の旧バージョンのオペレーティングシステム:

  • 2023年11月にEOLを迎えるAlpine 3.15

新機能の詳細

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

QUIC上のHTTP/3は、多くのエンタープライズのお客さまから要望が寄せられ、待望されていた機能です。このたび、NGINX Plus R30で正式に導入できることをうれしく思います。これは新しいテクノロジーおよび実装であり、今後のリリースでも引き続き重点的に取り組んでいきます。NGINX Plusユーザーの皆さまには、まず非本番環境でお試しいただき、有益なフィードバックをお寄せいただくことを推奨します。

NGINX Plusは、安全な通信と暗号化機能をOpenSSLに依存しており、オペレーティングシステムに付属するSSL/TLSライブラリを使用します。ただし、このリリースの時点ではQUICのTLSインターフェースがOpenSSLでサポートされていないため、HTTP/3に必要なTLS機能を補うにはサードパーティ製ライブラリが必要です。

この問題に対処するため、NGINXチームはOpenSSL Compatibility Layerを開発し、quictls、BoringSSL、LibreSSLなどのサードパーティ製TLSライブラリをビルドして配布する必要をなくしました。これにより、カスタムTLS実装の負担やサードパーティ製ライブラリのスケジュールおよびロードマップへの依存を伴わずに、NGINXでエンドツーエンドのQUIC+HTTP/3エクスペリエンスを管理しやすくなります。今後のリリースでは、0-RTTのサポートなど、OpenSSL Compatibility Layerの機能とオプションをさらに拡充する予定です。

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 R30のQUIC+HTTP/3サポートは、単一のバイナリとして提供されます。これは、nginx quic用に別のバイナリが用意されていた、NGINX Plus R29で導入された試験的な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 Live Activity Monitoring Dashboardで確認できます。この機能のライブデモはdemo.nginx.comでご覧いただけます。

NGINX Plusの接続とリクエストに関する以下の情報を表示するNGINX Plus Live Activity Monitoring Dashboard

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

接続:

  • ワーカーあたりの受け入れ済み接続数
  • ワーカーあたりのアクティブ接続数
  • ワーカーあたりのアイドル接続数
  • ワーカーあたりの切断された接続数

リクエスト:

  • ワーカーあたりの現在のリクエスト数
  • ワーカーあたりの総リクエスト数
  • ワーカーあたりのリクエスト数/秒

診断パッケージ

問題解決までの時間を短縮するため、診断パッケージは、NGINX環境の問題のトラブルシューティングに必要なデータの収集プロセスを効率化します。また、トラブルシューティングに必要な情報を手作業で依頼・収集する際に生じる認識の相違や遅延の回避にも役立ち、NGINX Plusのお客さまとF5サポートとのやり取りをより効率化します。

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

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

診断パッケージの追加により、パッケージ内のスクリプトが実行するコマンドと収集されるデータをユーザーが明確に把握できるようにすることを目指しています。詳しくは、NGINX Plus Diagnostic Packageページをご覧ください。

注:診断パッケージの提供開始は、今回のNGINX Plus R30リリースの一環として発表されますが、実際には特定のリリースに依存するものではありません。今後は、トラブルシューティング用データの収集プロセスを改善するため、お客さまおよびF5 Supportからのフィードバックに基づいて更新する予定です。

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

MQTTの最適化

Message Queuing Telemetry Transport(MQTT)フィルターモジュールのメモリ消費量が改善され、スループットが4~5倍に向上しました。

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

DNSリロードの最適化

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

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

NGINX Open Sourceから継承された変更

NGINX Plus R30はNGINX Open Source 1.25.1をベースとしており、NGINX Plus R29のリリース以降にNGINX 1.25.0および1.25.1で行われた機能変更、機能追加、バグ修正を継承しています。

変更点

  • HTTP/2サーバープッシュのサポートは削除されました。HTTP/2の「server_push」はほとんど普及せず、使用できるユースケースも非常に限られていました。(IETF 102のリファレンスドキュメントによると、使用されたセッションはわずか0.04%でした。RFC 913でも「効果的に使用することは困難」とされています。)HTTP/2サーバープッシュは、Chromeバージョン106で無効化されました。この変更に伴い、「http2_push」、「http2_push_preload」、「http2_max_concurrent_pushes」の各ディレクティブは廃止されました。
  • 非推奨の「ssl」ディレクティブはサポートされなくなりました。「ssl」ディレクティブはNGINX 1.15.0で非推奨となり、listenディレクティブの「ssl」パラメーターに置き換えられました。非推奨のsslディレクティブは削除されました。
  • 前述のとおり、listen … http2ディレクティブは非推奨です。代わりにhttp2ディレクティブを使用することを推奨します。
    • OpenSSL v1.0.2h以降を使用するSSL接続では、Server Name Indication(SNI)によって選択された仮想サーバーでHTTP/2プロトコルが有効になっている場合、Application-Layer Protocol Negotiation(ALPN)コールバックによってHTTP/2プロトコルが自動的に選択されます。
    • 古いバージョンのOpenSSLでは、デフォルトの仮想サーバー構成に基づいてHTTP/2プロトコルが有効になります。
    • プレーンTCP接続では、デフォルトの仮想サーバーでHTTP/2が有効になっている場合、HTTP/2プリフェイスに基づいてHTTP/2が自動検出されるようになりました。プリフェイスが一致しない場合は、HTTP/0.9-1.1と見なされます。
  • 同じリスニングソケットで、平文TCP上のHTTP/2(h2c)とHTTP/1.1をサポートするようになりました。従来の実装では、ユーザーがh2cリスニングソケット(例:listen port_num http2)を設定した場合、HTTP/2接続しか作成できません。h2リスニングソケットは、ALPNによるプロトコルネゴシエーションを使用してHTTP/1.1とHTTP/2の両方をサポートします。しかし、従来の実装では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ディレクティブ
    • 削除:listenのhttp3パラメーターディレクティブ
    • streamモジュールからQUICサポートを削除
    • HTTP/3サーバープッシュを削除
    • OpenSSL 3.2以降でOpenSSL Compatibility Layerをビルドできない問題を修正

バグ修正

  • 正規表現(regex)のスタディリストの割り当てに失敗した場合に発生する「segfault」を修正しました。

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

NGINX JavaScript Moduleの変更点

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

機能

  • グローバルNGINXプロパティとして以下を導入しました:
    ngx.build, ngx.conf_file_path, ngx.error_log_path, ngx.prefix, ngx.version, ngx.version_number、およびngx.worker_id。
  • Introduced the js_shared_dict_zoneディレクティブをhttpおよびstream向けに導入しました。これにより、ワーカープロセス間で共有するディクショナリを宣言できます。
  • ES13準拠のArrayメソッドを追加しました:Array.from(), Array.prototype.toSorted(), Array.prototype.toSpliced(), Array.prototype.toReversed()。
  • ES13準拠のTypedArrayメソッドを追加しました:%TypedArray%.prototype.toSorted(), %TypedArray%.prototype.toSpliced(), %TypedArray%.prototype.toReversed()。
  • Added CryptoKey properties in WebCrypto APIにCryptoKeyプロパティを追加しました。追加されたプロパティは、algorithm, extractable, type, usagesです。

変更点

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

バグ修正

  • 修正:r.statusのセッター(httpモジュールでのフィルタリング時)
  • Fixed setting of Locationヘッダーがhttpモジュールで正しく設定されない問題を修正しました。
  • 戻り値を修正しました:сrypto.getRandomValues()。
  • 関数式を含む計算されたプロパティ名の評価を修正しました。
  • 配列内で宣言された関数式の暗黙的な名前を修正しました。
  • for-inループの解析を修正しました。
  • ISO-8601形式およびUTCタイムオフセットを使用した「Date.parse()」の問題を修正しました。

すべての機能、変更、バグ修正の包括的な一覧については、njsの「Changes」ログを参照してください。

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

NGINX Plusをご利用の場合は、できるだけ早くNGINX Plus R30へアップグレードすることを強く推奨します。優れた新機能に加えて、複数の修正や改善も適用されます。また、最新の状態に保つことで、サポートチケットを起票する必要が生じた際に、NGINXによるサポートを受けやすくなります。

NGINX Plusをまだお試しでない場合は、ぜひご利用ください。セキュリティ、負荷分散、APIゲートウェイのユースケースに加え、強化された監視・管理APIを備え、充実したサポートを受けられるWebサーバーとしても利用できます。今すぐ30日間の無料トライアルを開始してください。


共有
タグ: F5 NGINX, 2023, News

関連するブログ記事

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
NGINX | 2024/01/18

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する

OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
NGINX | 2023/05/31

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正

Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
NGINX | 2023/02/09

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法

Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINX | 2022/05/24

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング

NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
NGINX | 2018/08/17

SELinuxでNGINXおよびNGINX Plusを使用する

Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。

NGINX PlusによるAWS Auto Scalingグループの負荷分散
NGINX | 2017/03/06

NGINX PlusによるAWS Auto Scalingグループの負荷分散

新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります