
# 通过ELB的全端口监听转发功能实现多端口转发
#### 应用场景
如果您的业务存在动态端口或同时监听多个端口的场景，配置固定端口的监听器将会使您的负载均衡配置更加繁琐。如果您希望可以更灵活地对大量端口进行监听，推荐您使用独享型ELB的全端口监听功能。全端口监听可以实现在一个监听器中对多个监听端口或端口段进行监听转发，简化了监听器配置，使您的运维更加便捷。
#### 前提条件
- 已创建独享型ELB实例，实例类型包含网络型，且ELB已绑定EIP。具体操作，请参见[购买独享型负载均衡器](https://support.huaweicloud.com/usermanual-elb/elb_lb_000006.html)和[绑定IPv4公网IP](https://support.huaweicloud.com/usermanual-elb/elb_ug_fz_0015.html)。

- 已创建ECS01和ECS02实例，并且在其中部署了应用服务。服务器ECS01和ECS02加入的安全组已经放行30000\~30005端口。
  单击查看本示例ECS01的部署命令
  - 登录ECS01，执行如下命令，新建脚本文件。
    ```
    vi ECS01_install.sh
    ```
    
  
  - 进入编辑模式，复制并粘贴以下命令。
    ```
    #!/bin/bash
    # 安装Nginx并自动配置多端口
    yum install -y nginx
    for PORT in {30000..30005}; do
      # 生成HTML文件
      echo "Hello World! This is ECS01, server port is $PORT." > /usr/share/nginx/html/index_$PORT.html
      # 生成Nginx配置
      printf "server { listen $PORT; location / { root /usr/share/nginx/html; index index_$PORT.html; } }\n" > /etc/nginx/conf.d/app_$PORT.conf
    done
    # 启动Nginx并测试
    nginx -t && systemctl restart nginx
    curl --parallel-max 11 $(for PORT in {30000..30005}; do echo "http://localhost:$PORT "; done)
    ```
    
  
  - 输入**:wq**，保存文件修改。
  
  - 执行以下命令 ，运行脚本文件。
    ```
    sudo sh ECS01_install.sh
    ```
    
  
  - 如果显示如下执行结果，表示30000到30005端口都可以正常访问
    ```
    Hello World! This is ECS01, server port is 30000.
    Hello World! This is ECS01, server port is 30001.
    Hello World! This is ECS01, server port is 30002.
    Hello World! This is ECS01, server port is 30003.
    Hello World! This is ECS01, server port is 30004.
    Hello World! This is ECS01, server port is 30005.
    ```
    
    
 
 #### 步骤一：创建后端服务器组并开启全端口转发
本实践方案使用支持全端口转发功能的后端服务器组，后端服务器组开启全端口转发后，组内添加后端服务器时无需指定后端端口，监听器将按照前端请求端口转发流量至后端服务器对应的端口。
1. 进入[后端服务器组列表页面](https://console.huaweicloud.com/vpc/?locale=zh-cn#/elb/elbPool/list)。
2. 在后端服务器列表页面，单击页面右上角"创建后端服务器组"按钮。
3. 配置后端分配策略，关键参数详情请参见[表1]，其余配置项保持默认值即可。
    表1配置后端分配策略参数说明 
   | 参数      | **示例**           | 说明                                                                                                                                                                                                                                           |
   |:---|:---|:---|
   | 名称      | **server_group** | 创建的后端服务器组的名称。                                                                                                                                                                                                                                |
   | 负载均衡类型  | **独享型**          | 可使用该后端服务器组的负载均衡实例类型。                                                                                                                                                                                                                         |
   | 所属负载均衡器 | **关联已有**         | 使用该后端服务器组的负载均衡实例。 单击"关联已有"后，选择您已创建完成的负载均衡实例。                                                                                                                                                                   |
   | 后端协议    | **TCP**          | 后端云服务器自身提供的网络服务的协议。 本实践方案选择TCP协议。                                                                                                                                                                               |
   | 全端口转发   | **开启**           | 开启全端口转发后，后端服务器组添加后端服务器时无需指定后端端口，监听器将按照前端请求端口转发流量至后端服务器对应的端口。 全端口转发功能开启后不支持关闭。                                                                                                                                      |
   | 分配策略类型  | **加权轮询算法**       | 负载均衡采用的算法，本实践方案保持默认的加权轮询算法。 加权轮询算法：根据后端服务器的权重，按顺序依次将请求分发给不同的服务器，权重大的后端服务器被分配的概率高。 更多关于分配策略的信息，请参见[配置流量分配策略分发流量](https://support.huaweicloud.com/usermanual-elb/elb_ug_jt_0003.html)。 |
      
   
4. 单击"下一步"，添加后端服务器并配置健康检查。
5. 单击"添加云服务器"，选择您已创建好的ECS01和ECS02实例，其余选项保持默认，完成云服务器的添加。
6. 开启健康检查，后端服务器组开启全端口转发，后端服务器无默认业务端口，需要配置健康检查端口。 本实践的配置实例端口为80，其余健康检查参数保持默认。
   
7. 单击"下一步"。
8. 确认配置无误后，单击"立即创建"。
 
#### 步骤二：创建TCP监听器并开启全端口监听
本实践方案以TCP监听器为例进行全端口监听转发。
1. 进入[弹性负载均衡列表页面](https://console.huaweicloud.com/vpc/?locale=zh-cn#/elb/list)。
2. 在目标弹性负载均衡实例的操作列，单击"添加监听器"。
3. 在添加监听器页面，协议类型选择"TCP"，并开启全端口监听，前端端口设置为30000\~30005端口。
   图1添加TCP监听并开启全端口监听   
   ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002288688669.png "点击放大") 
4. 单击"下一步：配置后端分配策略"，配置后端服务器组。 单击"使用已有"，并选择[步骤一：创建后端服务器组并开启全端口转发]中创建的后端服务器组。
   
5. 单击"下一步：确认配置"，确认完成后，完成TCP监听器的创建。
 
#### 步骤三：配置域名解析
通过为域名添加A类型记录集解析，将域名解析到ELB的公网地址，使得客户端可以通过公网域名访问ELB。
更多关于A类型记录集的配置指导，请参考[快速添加网站域名解析](https://support.huaweicloud.com/qs-dns/dns_qs_0002.html)。
1. 进入[云解析服务控制台](https://console.huaweicloud.com/dns/?#/dns/dashboard)。
2. 在左侧树状导航栏，选择"公网域名"。 进入域名列表页面。
   
3. 在待添加记录集的域名所在行，单击操作列的"管理解析"。
4. 单击"添加记录集"，进入"添加记录集"页面。
5. 设置记录集参数，如[表2]所示。
    表2A类型记录集参数说明 
   | 参数       | **示例**               | 说明                                                                                                                                                                                      |
   |:---|:---|:---|
   | 记录类型     | **A -- 将域名指向IPv4地址** | 记录集的类型，本实践为**A -- 将域名指向IPv4地址**。                                                                                                                                                        |
   | 主机记录     | **www**              | 您域名的前缀。                                                                                                                                                                                 |
   | 线路类型     | **全网默认**             | 解析的线路类型用于DNS服务器在解析域名时，根据访问者的来源，返回对应的服务器IP地址。 默认值为"全网默认"。 全网默认：默认线路类型，当未根据访问者来源设置解析线路时，系统会返回默认解析结果。 |
   | TTL(秒)   | **300**              | 解析记录在本地DNS服务器的缓存时间，以秒为单位。 本实践使用默认值300秒。                                                                                                         |
   | 记录值      | **192.168.12.2**     | 域名对应的IPv4地址，本实践为ELB绑定的弹性公网IP地址。                                                                                                                                                         |
   | 高级配置（可选） | **-**                | 您可以单击![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002284295457.png)，展开折叠的高级配置区域，设置记录集的别名和权重并添加标签和描述，本文保持默认设置。                                                   |
      
   
6. 单击"确定"。
7. 返回"解析记录"页面。 添加完成后，您可以在域名对应的记录集列表中查看已添加的记录集。当记录集的状态显示为"正常"时，表示记录集添加成功。
   
 
#### 步骤四：验证全端口监听
- 测试ELB可用性
  1. 以任意一台可以访问公网的Linux客户端为例。多次执行curl 域名 端口命令（端口为30000-30005之间任意端口），收到类似回复报文为**Hello World! This is ECS01, server port is 具体端口号.** ，则表示ELB可以将请求转发至后端服务器。
     图2Linux客户端请求访问到ECS01   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002261468502.png) 
  
  2. 通过浏览器访问域名加30000-30005之间的任意端口，例如http://域名:30000，可以看到类似下图的页面，表示客户端能够正常访问应用。
     图3浏览器请求访问到ECS01   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002261538102.png) 
   
- 模拟业务故障
  1. 停用ECS01服务。在ECS01中执行systemctl stop nginx.service停用应用。 等待几分钟后，客户端再次执行curl 域名 端口命令（端口为30000-30005之间任意端口），仍然收到下图回复报文Hello World! This is ...
     图4客户端请求访问到ECS02   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002269967686.png) 
  
  2. 通过浏览器访问域名加30000-30005之间的任意端口，例如http://域名:30000，可以看到类似下图，表示客户端能够正常访问应用。
     图5浏览器请求访问到ECS02   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002304612589.png "点击放大") 
  
  3. 启用ECS01服务，停用ECS02服务。在ECS01中执行systemctl start nginx.service重新启动应用，在ECS02中执行systemctl stop nginx.service停用应用。 等待几分钟后，在客户端中再次执行telnet 域名 端口命令（端口为30000-30005之间任意端口），仍然收到下图回复报文Hello World! This is ...
     图6Linux客户端请求访问到ECS01   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002304691473.png) 
  
  4. 通过浏览器访问域名加30000-30005之间的任意端口，例如http://域名:30000，可以看到类似下图，表示客户端能够正常访问应用。
     图7浏览器请求访问到ECS01   
     ![](https://support.huaweicloud.com/bestpractice-elb/zh-cn_image_0000002304620437.png "点击放大") 
  
  5. 如上测试结果表明，后端单台服务器故障不影响ELB可用性，并且30000-30005之间的端口均可以访问服务。
   
 
