すべてのプロダクト
Search
ドキュメントセンター

Server Load Balancer:NLBのマルチポートリスニングと転送を有効にする

最終更新日:Dec 06, 2024

多数のポートまたは動的に割り当てられたポートを使用するシナリオでは、リスナーを1つずつ構成すると、構成管理が非常に複雑になります。 さらに、構成エラーは、セキュリティリスクをもたらす可能性がある。 Network Load Balancer (NLB) は、マルチポートリスニング機能をサポートしています。これにより、NLBは、リスナーの複数のポートを使用して、ポート範囲ごとにリッスンし、ネットワークトラフィックを転送できます。 マルチポートリスニングは、構成管理を簡素化し、セキュリティリスクを軽減します。

マルチポートリスニングとは何ですか?

マルチポートリスニングにより、NLBはポート範囲でリッスンし、そのポート範囲に宛てられたネットワークトラフィックを転送できます。 リスニングは特定のポートに限定されなくなりました。

NLBインスタンスのマルチポートリスニングを有効にすると、NLBインスタンスは指定されたポート範囲内のすべてのポートをリッスンし、バックエンドサーバー上の同じポートにリクエストを直接自動的に転送します。

マルチポートリスニングを使用すると、複数のポートのネットワークトラフィックを柔軟に管理でき、構成管理が大幅に簡素化されます。 マルチポートリスニングは、多数のポートまたは動的に割り当てられたポートを使用するシナリオに最適です。

主な機能

  1. ポート範囲によるリスニング: マルチポートリスニングでは、1000〜2000など、連続するポート番号を含むポート範囲を指定できます。 NLBは、指定されたポート範囲に該当するすべてのポートをリッスンします。

  2. 簡単な設定: マルチポートリスニングにより、リスナーを1つずつ設定する必要がなくなります。 マルチポートリスニングは、リスナーとバックエンドサーバー間で同じままの多数のポートを使用するシナリオに最適です。 マルチポートリスニングを使用すると、サービスポートが頻繁に変更またはスケールアウトされた場合でも、ネットワークトラフィックを柔軟に管理できます。 ポートを1つずつ追加または変更する必要はありません。

適用シナリオ

マルチポートリスニングは、次のような多数のポートまたは動的に割り当てられたポートを使用するシナリオに最適です。

  • オンラインシングルプレイヤーロールプレイングゲーム (RPG) 、プレイヤー対環境 (PvE) ゲーム、シミュレーションゲーム (SLG) などのオンラインゲーム。 前述のシナリオでは、さまざまなシナリオでゲームデータを処理するために多数のポートが使用されます。 ポートは、異なるゲームシナリオまたはゲームルームに割り当てられます。

  • ビデオ会議やオンライン教育を含むリアルタイムコミュニケーション。 前述のシナリオでは、リアルタイムのオーディオおよびビデオデータとシグナリングデータを処理するために多数のポートが使用されます。

サンプルシナリオ

ある会社が、中国 (杭州) リージョンに仮想プライベートクラウド (VPC) を作成しました。 NLBインスタンスがVPCにデプロイされています。 ECS01およびECS02という名前の2つのElastic Compute Service (ECS) インスタンスがNLBインスタンスのサーバーグループに追加されます。 アクセス可能なアプリケーションがECSインスタンスにデプロイされます。

同社は、NLBインスタンスのマルチポートリスニングを有効にして、8090 8080のポートでリッスンすることを望んでいます。 ポートは、異なるサービスに割り当てられる。

image

制限事項

NLBインスタンスのマルチポートリスニングを有効にするには、マルチポートリスニングが有効になっているサーバーグループにNLBインスタンスを関連付ける必要があります。 リスナーまたはサーバーグループのマルチポートリスニングのステータスを変更することはできません。 マルチポートリスニングを有効にするには、サーバーグループとリスナーを作成し、マルチポートリスニングを有効にする必要があります。

前提条件

  • VPCが中国 (杭州) リージョンに作成されます。 vSwitchは2つのゾーンのそれぞれに作成されます。 詳細については、「VPC の作成と管理」をご参照ください。

  • 各vSwitchにECSインスタンスが作成されます。 8090 8080のポートを使用するアプリケーションは、ECSインスタンスにデプロイされます。

    テストアプリケーションを展開するためのサンプルコード

    この例では、CentOS 7.9とNGINX 1.20.1が使用されます。 次のサンプルスクリプトは、ポート8080を使用するテストアプリケーションをポート8090にデプロイする方法を示しています。

    1. ECS01にログインします。

      1. vi ECS01_server_install.shコマンドを実行し、Iキーを押してエディターを開きます。

      2. 次のコマンドをコピーして貼り付けます。

        #!/bin/bash
        
        # Install NGINX
        yum install -y nginx
        
        # Specify a directory for the NGINX server block
        NGINX_CONF_DIR=/etc/nginx/conf.d
        
        # Specify a directory for the index.html file
        HTML_DIR=/usr/share/nginx/html
        
        # Recursively create and configure HTML files
        for PORT in $(seq 8080 8090); do
          CONF_FILE=${NGINX_CONF_DIR}/app_${PORT}.conf
          HTML_FILE=${HTML_DIR}/index_app${PORT}.html
          
          # Create HTML content
          echo "Hello World! This is ECS01, server port is ${PORT}." > ${HTML_FILE}
          
          # Add NGINX server block configurations
          cat > ${CONF_FILE} << EOF
        server {
            listen ${PORT};
            server_name localhost;
        
            location / {
                root ${HTML_DIR};
                index index_app${PORT}.html;
            }
        }
        EOF
        
        done
        
        # Test whether the NGINX configuration file is correct
        nginx -t && systemctl start nginx
        
        echo "Nginx has been configured to listen on ports 8080 to 8090."
        
        # Repeatedly run the curl command to access ports 8080 to 8090 of localhost
        for PORT in $(seq 8080 8090); do
          echo "Accessing http://localhost:${PORT}"
          curl http://localhost:${PORT}
        done
        

      3. Escキーを押し、:wqと入力して変更を保存します。

      4. sudo sh ECS01_server_install.shコマンドを実行して、スクリプトを実行します。

      5. 次のレスポンスは、8090 8080のポートにアクセスできることを示しています。

        ...
        Nginx has been configured to listen on ports 8080 to 8090.
        Accessing http://localhost:8080
        Hello World! This is ECS01, server port is 8080.
        Accessing http://localhost:8081
        Hello World! This is ECS01, server port is 8081.
        Accessing http://localhost:8082
        Hello World! This is ECS01, server port is 8082.
        Accessing http://localhost:8083
        Hello World! This is ECS01, server port is 8083.
        Accessing http://localhost:8084
        Hello World! This is ECS01, server port is 8084.
        Accessing http://localhost:8085
        Hello World! This is ECS01, server port is 8085.
        Accessing http://localhost:8086
        Hello World! This is ECS01, server port is 8086.
        Accessing http://localhost:8087
        Hello World! This is ECS01, server port is 8087.
        Accessing http://localhost:8088
        Hello World! This is ECS01, server port is 8088.
        Accessing http://localhost:8089
        Hello World! This is ECS01, server port is 8089.
        Accessing http://localhost:8090
        Hello World! This is ECS01, server port is 8090.

        curlコマンドを使用してポートにアクセスできない場合は、ポートが占有されているか、コマンドが正しくないかを確認してください。

    2. ECS02にログインします。

      1. vi ECS02_server_install.shコマンドを実行し、Iキーを押してエディターを開きます。

      2. 次のコマンドをコピーして貼り付けます。

        #!/bin/bash
        
        # Install NGINX
        yum install -y nginx
        
        # Specify a directory for the NGINX server block
        NGINX_CONF_DIR=/etc/nginx/conf.d
        
        # Specify a directory for the index.html file
        HTML_DIR=/usr/share/nginx/html
        
        # Recursively create and configure HTML files
        for PORT in $(seq 8080 8090); do
          CONF_FILE=${NGINX_CONF_DIR}/app_${PORT}.conf
          HTML_FILE=${HTML_DIR}/index_app${PORT}.html
          
          # Create HTML content
          echo "Hello World! This is ECS02, server port is ${PORT}." > ${HTML_FILE}
          
          # Add NGINX server block configurations
          cat > ${CONF_FILE} << EOF
        server {
            listen ${PORT};
            server_name localhost;
        
            location / {
                root ${HTML_DIR};
                index index_app${PORT}.html;
            }
        }
        EOF
        
        done
        
        # Test whether the NGINX configuration file is correct
        nginx -t && systemctl start nginx
        
        echo "Nginx has been configured to listen on ports 8080 to 8090."
        
        # Repeatedly run the curl command to access ports 8080 to 8090 of localhost
        for PORT in $(seq 8080 8090); do
          echo "Accessing http://localhost:${PORT}"
          curl http://localhost:${PORT}
        done
        

      3. Escキーを押し、:wqと入力して変更を保存します。

      4. sudo sh ECS02_server_install.shコマンドを実行して、スクリプトを実行します。

      5. 次のレスポンスは、8090 8080のポートにアクセスできることを示しています。

        ...
        Nginx has been configured to listen on ports 8080 to 8090.
        Accessing http://localhost:8080
        Hello World! This is ECS02, server port is 8080.
        Accessing http://localhost:8081
        Hello World! This is ECS02, server port is 8081.
        Accessing http://localhost:8082
        Hello World! This is ECS02, server port is 8082.
        Accessing http://localhost:8083
        Hello World! This is ECS02, server port is 8083.
        Accessing http://localhost:8084
        Hello World! This is ECS02, server port is 8084.
        Accessing http://localhost:8085
        Hello World! This is ECS02, server port is 8085.
        Accessing http://localhost:8086
        Hello World! This is ECS02, server port is 8086.
        Accessing http://localhost:8087
        Hello World! This is ECS02, server port is 8087.
        Accessing http://localhost:8088
        Hello World! This is ECS02, server port is 8088.
        Accessing http://localhost:8089
        Hello World! This is ECS02, server port is 8089.
        Accessing http://localhost:8090
        Hello World! This is ECS02, server port is 8090.

        curlコマンドを使用してポートにアクセスできない場合は、ポートが占有されているか、コマンドが正しくないかを確認してください。

  • ECS01とECS02のセキュリティグループは、8090 8080のポートへのリクエストを許可します。

  • インターネット接続のNLBインスタンスが作成され、VPCで実行中です。 詳細については、「NLBインスタンスの作成と管理」をご参照ください。

  • ドメイン名が登録され、ドメイン名のためのインターネット・コンテンツ・プロバイダ (ICP) 番号が取得される。 詳細については、「ジェネリックドメイン名の登録」および「ICP登録プロセス」をご参照ください。

手順1: マルチポートリスニングをサポートするサーバーグループの作成

  1. NLBコンソールにログインします。

  2. 上部のナビゲーションバーで、NLBインスタンスがデプロイされているリージョンを選択します。

  3. 左側のナビゲーションウィンドウで、[NLB] > [サーバーグループ] を選択します。

  4. [サーバーグループ] ページで、[サーバーグループの作成] をクリックします。

  5. サーバーグループを設定します。 次の表に、いくつかのパラメーターを示します。 他のパラメータはデフォルト値を使用する。 詳細については、「サーバーグループの作成と管理」をご参照ください。

    パラメーター

    説明

    サーバーグループタイプ

    作成するサーバーグループのタイプを選択します。

    サーバーグループ名

    サーバーグループの名前を入力します。

    VPC

    ドロップダウンリストからNLBインスタンスのVPCを選択します。 サーバーグループに追加できるのは、NLBインスタンスのVPC内のサーバーのみです。

    マルチポート転送

    マルチポート転送をオンにします。

    マルチポート転送機能を有効にすると、サーバーグループにサーバーを追加するときにポートを指定する必要はありません。 NLBは、要求されたポートに基づいて、要求をバックエンドサーバーに直接転送します。

    重要

    リスナーに対してマルチポート転送を有効にした場合、マルチポート転送が有効になっているサーバーグループにのみリスナーを関連付けることができます。

    ヘルスチェックの設定

    ヘルスチェックをオンにします。

    ヘルスチェックポート

    マルチポート転送を有効にするには、ヘルスチェックポートを指定する必要があります。

    ヘルスチェックは、ポートをプローブしてバックエンドサーバーのヘルスステータスを確認します。 ポートが有効な応答を返さない場合、バックエンドサーバーは異常であると宣言されます。

    この例では、ヘルスチェックポートはポート8080に設定されています。

  1. 設定が完了したら、[作成] をクリックします。 サーバーグループの作成後、表示されるメッセージの [バックエンドサーバーの追加] をクリックします。

  2. バックエンドサーバーとしてECS01とECS02を選択します。 他のパラメータはデフォルト値を使用する。 マルチポートリスニングが有効な場合は、サーバーポートを指定する必要はありません。 [OK] をクリックします。

手順2: マルチポートリスニングをサポートするリスナーの作成

説明

この例では、TCPリスナーが作成されます。

  1. NLBコンソールにログインします。

  2. 上部のナビゲーションバーで、NLBインスタンスがデプロイされているリージョンを選択します。

  3. [インスタンス] ページで、管理するNLBインスタンスを見つけ、[操作] 列の [リスナーの作成] をクリックします。

  4. リスナーを設定します。 次の表に、いくつかのパラメーターを示します。 他のパラメータはデフォルト値を使用する。 詳細については、「TCPリスナーの追加」をご参照ください。 設定が完了したら、[送信] をクリックします。

    リスナーを設定します。

    パラメーター

    説明

    マルチポートリスニング /転送

    マルチポートのリスニングと転送をオンにします。

    リスナーのポート範囲

    リッスンするポート範囲の最初と最後のポートを指定します。 この例では、ポート範囲はポート8080で始まり、ポート8090で終わります。

    NLBは、指定されたポート範囲に該当するすべてのポートをリッスンし、そのポート宛てのリクエストをバックエンドサーバーポートに直接転送します。

    重要

    マルチポートリスニングをサポートするリスナーを作成した後、リスナーのポート範囲を変更することはできません。

    リスナーをサーバーグループに関連付ける:

    パラメーター

    説明

    サーバーグループ

    ECS01とECS02を含み、マルチポートリスニングをサポートするサーバーグループを選択します。

    重要

    サーバーグループのマルチポート転送が有効になっていることを確認します。 それ以外の場合、サーバーグループはリスナーに関連付けられません。

ステップ3: DNSレコードを追加する

実際のビジネスシナリオでは、CNAMEレコードを使用してカスタムドメイン名をNLBインスタンスのドメイン名にマップすることを推奨します。

  1. 左側のナビゲーションウィンドウで、NLB > インスタンスを選択します。

  2. インスタンスページで、管理するNLBインスタンスのドメイン名をコピーします。

  3. CNAMEレコードを作成するには、次の手順を実行します。

    説明

    ドメイン名がAlibaba Cloudドメインを使用して登録されていない場合、DNSレコードを設定する前にドメイン名をAlibaba Cloud DNSに追加する必要があります。 詳細については、「ドメイン名の管理」をご参照ください。 ドメイン名がAlibaba Cloudドメインを使用して登録されている場合は、この手順をスキップします。

    1. Alibaba Cloud DNSコンソールにログインします。

    2. 権威DNS解決ページで、ドメイン名を見つけて、アクション列のDNS設定をクリックします。

    3. ドメイン名の詳細ページのDNS設定タブをクリックし、DNSレコードの追加をクリックします。

    4. [DNSレコードの追加] パネルでパラメーターを設定し、[OK] をクリックします。 下表にパラメーターを示します。

      パラメーター

      説明

      レコードタイプ

      ドロップダウンリストから [CNAME] を選択します。

      ホスト名

      ドメイン名のプレフィックス。 この例では、@ を入力します。

      説明

      ドメイン名がルートドメイン名の場合は、@ と入力します。

      DNSリクエストソース

      [デフォルト] を選択します。

      レコード値

      NLBインスタンスのドメイン名であるCNAMEを入力します。

      TTL

      DNSサーバーにキャッシュされるCNAMEレコードの有効期限 (TTL) 値を指定します。 この例では、デフォルト値が使用されます。

ステップ4: マルチポートリスニングのテスト

  1. NLBインスタンスの可用性をテストします。

    1. この例では、Linuxクライアントが使用されています。 CentOSを使用し、telnetがインストールされていない場合は、yum install -y telnetコマンドを実行してtelnetをインストールします。

    2. telnet domain name portコマンドを複数回実行します。 ポート番号は8080に8090する必要があります。 を含む応答パケットを受信した場合接続先...NLBインスタンスはバックエンドサーバーにリクエストを転送できます。

      Trying *.*.*.*...
      Connected to www.example.com.
      Escape character is '^]'

      http:// domain name:8080など、ブラウザから8090するドメイン名と8080に分類されるポートにアクセスします。 次の図に示すように応答を受信すると、クライアントはアプリケーションにアクセスできます。

      image

  2. 障害をシミュレートします。

    1. ECS01でアプリケーションを停止します。 ECS01でsystemctl stop nginx.serviceコマンドを実行し、アプリケーションを停止します。

    2. 数分待ってから、クライアントでtelnet domain name portコマンドを再度実行します。 ポート番号は8080に8090する必要があります。 を含む応答パケットを引き続き受信できます。接続先....

      Trying *.*.*.*...
      Connected to www.example.com.
      Escape character is '^]'

      http:// domain name:8080など、ブラウザから8090するドメイン名と8080に分類されるポートにアクセスします。 次の図に示すように応答を受信すると、クライアントはアプリケーションにアクセスできます。

      image

    3. ECS01でアプリケーションを起動し、ECS02でアプリケーションを停止します。 ECS01でsystemctl start nginx.serviceコマンドを実行してアプリケーションを再起動し、ECS02でsystemctl stop nginx.serviceコマンドを実行してアプリケーションを停止します。

    4. 数分待ってから、クライアントでtelnet domain name portコマンドを再度実行します。 ポート番号は8080に8090する必要があります。 を含む応答パケットを引き続き受信できます。接続先....

      Trying *.*.*.*...
      Connected to www.example.com.
      Escape character is '^]'

      http:// domain name:8080など、ブラウザから8090するドメイン名と8080に分類されるポートにアクセスします。 次の図に示すように応答を受信すると、クライアントはアプリケーションにアクセスできます。

      image

  3. 上記のテストでは、単一のサーバーによって引き起こされた単一障害点 (SPOF) がNLBインスタンスの可用性を損なうことはなく、バックエンドサーバー上のアプリケーションは、8080から8090に該当する任意のポートを介してアクセスできることが示されています。