NGINX Open Sourceと当社のアプリケーションデリバリープラットフォームであるNGINX Plusに、注目の新機能であるUDPロードバランシングが加わったことをお知らせします。この新機能は、既存のTCPおよびHTTP機能を基盤としており、さらに幅広いインターネットアプリケーションやデバイスに対して、NGINXを強力で使いやすく、一貫性のあるフロントエンドとして利用できるようにします。また、世界で最も利用の多いアプリケーションの半数以上を支えるロードバランシング機能を、モノのインターネット(IoT)を構築する新たなユーザー層にも提供できることを大変うれしく思います。
UDPロードバランシングをサポートする理由
ほとんどのインターネットアプリケーションは、ネットワーク通信にHTTPを使用しています。SOAPやRESTなどの高度なプロトコルはHTTPを基盤としており、TLSによるセキュリティ、Gzipによる圧縮、HTTP/2によるパフォーマンス向上など、多彩な拡張機能を活用できます。
一方、多くのアプリケーションでは、目的に応じて複数のプロトコルを使用する必要があります。また、インターネットの主要なプロトコルの多くは、HTTPよりも前から存在しています。そのため、ロードバランシングとリバースプロキシの包括的なソリューションには、TCPベースとUDPベースの両方を含む幅広いプロトコルへの対応が必要です。
UDPは、DNS(ドメイン名をアドレスに解決するために使用)、syslog(軽量なログ記録に使用)、RADIUS(認証に使用)など、トランザクション型ではない軽量プロトコルで一般的に使用されます。これらのプロトコルには厳格な信頼性要件はありません。UDPメッセージ(データグラム)が破棄された場合でも、クライアントはタイムアウト後にそのメッセージを安全に再送できます。しかし、これらのプロトコルが提供するサービスは、インターネットサービスの正常な動作に不可欠です。また、UDPは帯域幅要件が低いため、新しいIoTアプリケーションで有力な選択肢の1つになりつつあります。
1年前、NGINXはTCPロードバランシングを導入しました。これは、ユーザーコミュニティと法人のお客さまに向けたものでした。このたび、UDPロードバランシングを追加し、ロードバランシング機能を拡張できることをうれしく思います。NGINXとNGINX Plusにより、信頼性、拡張性、パフォーマンスに優れたUDPベースのサービスを提供できるようになりました。
UDPロードバランシングの仕組み
NGINXは、管理者が定義した1つ以上のアドレス(IPアドレスとポート)で、UDPネットワークトラフィック(DNS、syslog、RADIUSなどのプロトコル)を待ち受けます。これらのアドレスは、クライアントが目的のサービスへのリクエストの送信先を把握できるように公開されます。
HTTPおよびTCPロードバランシングと同様に、UDPロードバランシングの設定では、アップストリームグループ(UDPベースのサービスを提供するオリジンサーバーの集合)と、サーバー間でトラフィックをロードバランシングする際に使用するアルゴリズム(ラウンドロビン、最小接続数、送信元IPアドレスに基づくハッシュなど)を定義します。また、UDPポートごとに仮想サーバーを定義し、関連するサービスを提供するアップストリームグループを指定するproxy_passディレクティブを設定します。
# Load balance UDP‑based DNS traffic across two serversstream {
upstream dns_upstreams {
server 192.168.136.130:53;
server 192.168.136.131:53;
}
server {
listen 53 udp;
proxy_pass dns_upstreams;
proxy_timeout 1s;
proxy_responses 1;
error_log logs/dns.log;
}
}NGINXは、ポートでUDPデータグラム(ここではポート53へのDNSクエリ)を受信すると、設定されたロードバランシングアルゴリズム(ここではデフォルトのラウンドロビン)を使用して、アップストリームグループ内で処理を行うサーバーを選択します。必要に応じて、NGINXはサーバーからの応答を待ち、その応答と、タイムアウト期間内に受信した後続のパケットをクライアントに転送します。
サーバーがリクエストに応答しない場合、NGINXはそのサーバーを「failed」としてマークし、データグラムの送信を一時的に停止します。NGINXは数秒ごとに少量の実トラフィックを送信し、サーバーが復旧したかどうかを確認します。
NGINX Plus R9には、UDPサービス向けのアプリケーションヘルスチェック(「非同期」または「合成」ヘルスチェックとも呼ばれます)が搭載される予定です。これは、HTTPおよびTCPトラフィック向けのヘルスチェックと同様のものです。NGINX Plusからアップストリームサーバーに特別なUDPリクエストを送信するよう設定し、サーバーが正常と見なされるために返す必要があるレスポンスの種類を定義できるようになります。
UDPロードバランシングでサポートされるその他の機能には、Webサーバー形式のアクセスログへのトランザクションの記録、IPアドレスベースのアクセス制御リスト、各種レート制限機能があります。
NGINX Plus R9では、Statusモジュールが提供するライブアクティビティ監視統計にUDPメトリクスが追加されます。また、現在HTTPサーバーとTCPサーバーで可能なように、HTTPベースのAPIとDNSを使用して、UDPアップストリームグループを動的に再構成できるようになります。
UDPロードバランシングのユースケース
UDPロードバランシングは、高可用性と水平スケーリングという2つの主要なユースケースに対応します。UDPは設計上、データのエンドツーエンド配信を保証しないため、クライアントソフトウェア側でネットワークレベルのエラーや再送に対処する必要があります。UDPベースのプロトコルでは通常、2台のサーバーを指定します。クライアントが優先サーバーに接続できない場合、所定のタイムアウト時間が経過するまで待ってから、もう一方のサーバーへの接続を試行する必要があります。そのため、UDPトランザクションに長時間の遅延が生じる可能性があります。
UDPサーバーの前段に、高可用性と信頼性を備えたロードバランサーとしてNGINXまたはNGINX Plusを導入することで、このような遅延を解消または軽減できます。クライアントはNGINXまたはNGINX PlusロードバランサーにUDPリクエストを送信します。ロードバランサーはUDPサーバーの健全性と可用性を監視し、障害が発生しているサーバーや過負荷状態のサーバーにはリクエストを送信しません。そのため、クライアントでは接続やリクエストの失敗が発生せず、リクエストの再試行に伴うタイムアウトも生じません。
NGINXまたはNGINX Plusをロードバランサーとして使用することで、大量のトラフィックを処理できるようにUDPアプリケーションをスケールすることも可能です。一般的なUDP環境では、クライアントが認識しているUDPサーバーは多くても2台ですが、高い需要に対応するためにスケールアップするには、さらに多くのUDPサーバーが必要です。この場合、クライアントは既知の1台または2台のNGINXまたはNGINX PlusインスタンスにUDPリクエストを送信します。これらのインスタンスは、負荷の処理に実際に必要となる多数のUDPサーバーにリクエストを分散します。
NGINXおよびNGINX PlusによるUDPロードバランシングは、データを送信し、必要に応じて1つ以上の応答を受信するあらゆるUDPベースのアプリケーションに適しています。NGINXは、IoT環境で使用されるような独自のUDPベースのプロトコルもロードバランシングできます。
はじめに
各リリースでUDPロードバランシングが利用可能になる具体的な時期は、次のとおりです。
- 現在 — UDPロードバランシング用コードの初版を、オープンソースの「NGINXソフトウェアリポジトリ」にコミットしました。早期導入を検討している方や、この実装をテストしたい方は、ソースをクローンし、UDPロードバランシング機能を備えたNGINXバイナリをビルドできます。ご意見やご感想は「nginxメーリングリスト」までお寄せください。
- 2016年3月28日の週 – UDPロードバランシングを搭載したNGINX version 1.9.13がリリースされます(同バージョンをベースとするビルド済みバイナリにも搭載されます)。
- 2016年4月 – NGINX Plus Release 9(R9)には、UDPロードバランシングが搭載される予定です。商用アプリケーションデリバリープラットフォームであるNGINX Plusでは、オープンソース版のUDPロードバランシング機能に、信頼性と拡張性に優れたUDPベースのサービスを構築、監視するための機能が追加されます。
NGINXとNGINX Plusは、幅広いインターネットプロトコルに対応する包括的な負荷分散およびアプリケーションデリバリープラットフォームを提供します。HTTPベースのアプリケーション、より低レイヤーのTCPアプリケーション、UDPベースのプロトコルのいずれを配信する場合でも、NGINXとNGINX Plusなら、単一の軽量なアプリケーションで高可用性、信頼性、拡張性、パフォーマンスを実現できます。新しいUDP負荷分散機能と、それによってまったく新しい多様なデバイスに高性能な負荷分散と安定したアプリケーションデリバリーをもたらせる可能性に、大きな期待を寄せています。
Release 9でUDPロードバランシングがリリースされる前に、NGINX Plusをお試しになりませんか?今すぐ30日間の無料トライアルを開始するか、ユースケースについてご相談ください。
著者について

関連するブログ記事
チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。
AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。
JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。
F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。
NGINX PlusによるAWS Auto Scalingグループの負荷分散
新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります