
# 使用Nginx实现公网访问DCS
#### 方案概述
当前，华为云DCS的Redis 4.0及以上版本不支持绑定弹性IP，无法直接通过公网访问。可以通过ELB实现公网访问，具体请参考[开启Redis公网访问并获取公网访问地址](https://support.huaweicloud.com/usermanual-dcs/dcs_03_0011.html)。
本章节主要介绍通过**跳板机** 访问VPC内Redis 4.0/5.0/6.0单机、主备、读写分离、Proxy集群实例的操作，**Cluster集群实例暂不支持使用该方案进行公网访问**。
[图1]中安装了Nginx代理工具的ECS就是一台跳板机，它与DCS Redis实例在相同VPC，可通过子网IP访问Redis实例；为ECS绑定弹性IP后，公网可以访问ECS；Nginx支持监听多个端口，并将请求内容转发到不同的后端Redis实例。
图1通过Nginx访问VPC内DCS Redis   
![](https://support.huaweicloud.com/bestpractice-dcs/zh-cn_image_0245102971.png "点击放大")
![](https://support.huaweicloud.com/bestpractice-dcs/public_sys-resources/note_3.0-zh-cn.png)
不建议在生产环境中使用公网访问的方式，对于因公网网络性能造成的客户端访问异常不计入SLA。
#### 购买一台ECS
1. 确认Redis实例所在的虚拟私有云。 
   如下图所示，已购买了一个虚拟私有云在"vpc-demo"内的主备实例。
   图2Redis缓存实例信息   
   ![](https://support.huaweicloud.com/bestpractice-dcs/zh-cn_image_0254645094.png "点击放大")
   
   
2. 购买一台同在"vpc-demo"的ECS，并为其绑定一个弹性公网IP，按需选择带宽。 
   图3ECS信息   
   ![](https://support.huaweicloud.com/bestpractice-dcs/zh-cn_image_0245116251.png "点击放大")
   
   
 
#### 安装Nginx
购买ECS后，需要在ECS上安装Nginx，本文以ECS操作系统为Centos7.x为例进行安装，不同操作系统命令稍有不同。
1. 执行以下命令，添加Nginx到yum源。 
   ```
   sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
   ```
   
   
2. 添加完之后，执行以下命令，查看是否已经添加成功。 
   ```
   yum search nginx
   ```
   
   
3. 添加成功之后，执行以下命令，安装Nginx。 
   ```
   sudo yum install -y nginx
   ```
   
   
4. 执行以下命令安装stream模块。 
   ```
   yum install nginx-mod-stream --skip-broken
   ```
   
   
5. 启动Nginx并设置为开机自动运行。 
   ```
   sudo systemctl start nginx.service
   sudo systemctl enable nginx.service
   ```
   
   
6. 在本地浏览器中输入服务器地址（ECS公网IP地址），查看安装是否成功。 
   如果出现下面页面，则表示安装成功。
   ![](https://support.huaweicloud.com/bestpractice-dcs/zh-cn_image_0245105425.png "点击放大")
   
   
 
 #### 配置Nginx
Nginx安装后，需要配置请求转发规则，告诉Nginx哪个端口收到的请求，应该转发到后端哪个Redis实例。
1. 打开并修改配置文件。 
   ```
   cd /etc/nginx
   vi nginx.conf
   ```
   配置示例如下，如果有多个redis实例需要公网连接，可以配置多个server，在proxy_pass中配置Redis实例连接地址。
   ```
   stream {
       server {
           listen 8080;
           proxy_pass 192.168.0.5:6379;
       }
       server {
           listen 8081;
           proxy_pass 192.168.0.6:6379;
       }
   }
   ```
   ![](https://support.huaweicloud.com/bestpractice-dcs/public_sys-resources/note_3.0-zh-cn.png)
   proxy_pass参数配置值为同一vpc下的Redis实例的IP地址，具体可从缓存实例详情页面的"连接信息"区域获取。
   图4Nginx配置信息的输入位置   
   ![](https://support.huaweicloud.com/bestpractice-dcs/zh-cn_image_0267127015.png "点击放大")
   
   
2. 重启Nginx服务。 
   ```
   service nginx restart
   ```
   
   
3. 验证启动是否成功。 
   ```
   netstat -an|grep 808
   ```
   图5启动Nginx及验证   
   ![](https://support.huaweicloud.com/bestpractice-dcs/zh-cn_image_0245110151.png "点击放大")
   8080和8081两个端口都在监听状态，Nginx启动成功。
   
   
 
#### （可选）长连接场景
如果用户公网访问时需要使用长连接，那么需要在如上[配置Nginx]中增加以下配置：
- Nginx到后端server的超时时间
  ```
  stream {
      server {
          listen 8080;
          proxy_pass 192.168.0.5:6379;
          proxy_socket_keepalive on;
          proxy_timeout 60m;
          proxy_connect_timeout 60s;
      }
      server {
          listen 8081;
          proxy_pass 192.168.0.6:6379;
          proxy_socket_keepalive on;
          proxy_timeout 60m;
          proxy_connect_timeout 60s;
      }
  }
  ```
  proxy_timeout 默认值是10m（10分钟），可以根据用户需要设为60m或其他值。[Nginx官网 proxy_timeout说明](https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#)。
  
- 客户端到Nginx的超时时间
  ```
  http {
      keepalive_timeout 3600s;
  }
  ```
  keepalive_timeout 默认值是75s，可以根据用户需要设为3600s或其他值。[Nginx官网 keepalive_timeout 说明](https://nginx.org/en/docs/http/ngx_http_core_module.html#http)。
  
 
#### 通过Nginx访问Redis
1. 登录ECS控制台，确认跳板机的安全组规则是否放开，如果没有，则需要为安全组放开8080和8081两个端口。 
   1. 单击ECS实例名称，进入ECS详情页面。
   
   2. 选择"安全组"页签，单击"配置规则"，可进入安全组配置页面。
   
   
   图6进入ECS安全组   
   ![](https://support.huaweicloud.com/bestpractice-dcs/zh-cn_image_0000001275281529.png "点击放大")
   图7添加安全组入方向规则   
   ![](https://support.huaweicloud.com/bestpractice-dcs/zh-cn_image_0000001275484437.png "点击放大")
   
   
2. 在公网环境中打开Redis命令行界面，输入如下命令，登录与查询都正常。 
   ![](https://support.huaweicloud.com/bestpractice-dcs/public_sys-resources/note_3.0-zh-cn.png)
   公网环境已参考[Redis-cli连接](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713004.html)中相关步骤，安装Redis-cli客户端。
   ```
   ./redis-cli -h {myeip} -p {port} -a {mypassword}
   ```
   其中，命令中的***{myeip}*** 为主机连接地址，需要填写**ECS的弹性IP** ，端口需要填写**ECS上Nginx的监听端口**。
   如下图所示，设置的2个监听端口分别为8080和8081，对应后端2个Redis实例。
   图8通过Nginx代理连接第一个Redis实例   
   ![](https://support.huaweicloud.com/bestpractice-dcs/zh-cn_image_0245112317.png "点击放大")
   图9通过Nginx代理连接第二个Redis实例   
   ![](https://support.huaweicloud.com/bestpractice-dcs/zh-cn_image_0245112233.png "点击放大")
   
   
 
