
# 通过Nginx反向代理访问OBS
#### 应用场景
一般情况下，用户会通过OBS提供的桶访问域名（例如https://*bucketname*.obs.cn-north-4.myhuaweicloud.com）或者绑定的自定义域名来访问OBS。
但在某些场景下，用户需要通过固定的IP地址访问OBS，例如：某些企业出于安全考虑，对于可访问的外部地址需要设置黑白名单，而这个时候对于OBS的访问则需要一个固定的IP地址。同样出于安全考虑，华为云OBS桶访问域名通过DNS解析的IP地址是会发生变化的，所以用户无法获取某个桶长期有效的固定IP地址。
此时，可以通过在ECS上搭建Nginx反向代理服务器，来实现通过固定IP地址访问OBS。
#### 方案架构
本实践将Nginx部署在ECS上，搭建Nginx反向代理服务器。用户对代理无感知，只需要将请求发送到反向代理服务器，然后由反向代理服务器向OBS获取数据，再返回给用户。反向代理服务器和OBS对外看做一个整体，仅暴露代理服务器的IP地址，隐藏了OBS真实的域名或IP地址。
图1通过Nginx反向代理访问OBS原理   
![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0273872842.png "点击放大")
 #### 约束与限制
- 已明确OBS桶所在区域和桶的访问域名，如华北-北京四区域的桶：nginx-obs.obs.cn-north-4.myhuaweicloud.com。[查看方法](https://support.huaweicloud.com/usermanual-obs/obs_03_0312.html)
- 已在同区域购买Linux操作系统的ECS，本文以CentOS系统为例。[购买ECS方法](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)
- ECS已绑定EIP，EIP用于从公网下载必要的Nginx安装包。
 
#### 实施步骤
1. **在ECS上安装Nginx**
   
   此处以CentOS 7.6版本的操作系统为例。
   1. 登录用于搭建Nginx反向代理服务器的ECS。
   
   2. 使用wget命令，下载对应当前操作系统版本的Nginx安装包。
      ```
      wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
      ```
      
   
   3. 执行以下命令，建立Nginx的yum仓库。
      ```
      rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm
      ```
      
   
   4. 执行以下命令，安装Nginx。
      ```
      yum -y install nginx
      ```
      
   
   5. 执行以下命令，启动Nginx并设置开机启动。
      ```
      systemctl start nginx
      systemctl enable nginx
      ```
      
   
   6. 在任意终端使用浏览器访问"http://*ECS弹性公网IP地址* "，显示如下图所示，说明Nginx安装成功。
      图2Nginx安装成功   
      ![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0273792190.png "点击放大") 
    
   
   
2. **修改Nginx配置文件，反向代理OBS桶**
   
   1. 执行以下命令，打开"default.conf"配置文件。
      ```
      vim /etc/nginx/conf.d/default.conf
      ```
      
   
   2. 按"i"键进入编辑模式，修改"default.conf"配置文件。
      ```
      server {
            listen       80;
            server_name  **.**.**.**;  #此处填写ECS弹性公网IP地址
            proxy_buffering off;  #关闭代理缓冲区（内存）
            location / {
                 proxy_pass  https://nginx-obs.obs.cn-north-4.myhuaweicloud.com;  #此处填写OBS桶访问域名，以http://或https://开头
                 index  index.html index.htm ;  #指定网站初始页。如果包括多个文件，Nginx会根据文件的枚举顺序来检查。
                 proxy_set_header Host $proxy_host;
                 #当您使用ELB七层监听器时，建议设置X-Forwarded-For参数为空
                 #proxy_set_header X-Forwarded-For "";
              }
      }
      ```
      表1配置文件参数说明 
      | 参数              | 说明                                                                                                                                                                                                                                                                                                                                                                             |
      |:---|:---|
      | server_name     | 提供反向代理服务的IP地址，即需要暴露给终端用户访问的固定IP地址。 此处填写搭建Nginx反向代理服务的ECS弹性公网IP地址，即当前登录的ECS弹性公网IP地址。                                                                                                                                                                                                                                                                |
      | proxy_pass      | 被代理服务器的地址。 此处填写[前提条件]获取的OBS桶的访问域名，注意需要以http://或https://开头，例如： https://nginx-obs.obs.cn-north-4.myhuaweicloud.com 注意： 当使用API、SDK、obsutil调用时，此处填写区域域名，例如： obs.cn-north-4.myhuaweicloud.com |
      | proxy_buffering | 设置是否开启代理缓冲区，取值为on（开启）或者off（关闭）。 如果取值为on，Nginx会把后端返回的内容先放到缓冲区，然后再返回给客户端。 如果取值为off，Nginx会立即把从后端收到的响应内容传送给客户端。 默认值：on 示例：proxy_buffering off                                                                                                                |
         
      
   
   3. 按"Esc"，输入":wq"保存并退出。
   
   4. 执行以下命令，测试Nginx配置文件状态。
      ```
      nginx -t
      ```
      
   
   5. 执行以下命令，重启Nginx服务使配置生效。
      ```
      systemctl stop nginx
      systemctl start nginx
      ```
      
   
   
   
   
3. **(可选)配置OBS桶策略，允许Nginx代理服务器的IP地址访问OBS**
   
   如果您的OBS桶为公共读，或者访问私有桶内对象时在[URL中携带签名](https://support.huaweicloud.com/api-obs/obs_04_0011.html)，则可跳过此步骤。
   如果您的OBS桶为私有桶，且不希望使用携带签名的URL访问桶内资源，则建议配置以下桶策略：仅允许Nginx代理服务器的IP地址访问OBS桶。
   1. 在OBS管理控制台左侧导航栏选择"对象存储"。
   
   2. 在桶列表单击待操作的桶，进入对象页面。
   
   3. 在左侧导航栏，单击"权限控制 \> 桶策略"。
   
   4. 单击"创建"。
   
   5. 根据使用习惯，策略配置方式以可视化视图为例。单击"可视化视图"。
   
   6. 配置如下参数。
      表2桶策略参数配置 
      | 参数       | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
      |:---|:---|
      | 策略名称     | 输入自定义的桶策略名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
      | 效力       | 选择"允许"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
      | 被授权用户    | 选择"所有账号"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
      | 授权资源     | - 方式一： - 资源范围：整个桶（包括桶内对象）    - 方式二： - 资源范围：当前桶、指定对象  - 指定对象 - 资源路径：\*                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
      | 授权操作     | - 选择"自定义配置"  - 选择动作：Get\*和List\*                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
      | 授权条件（可选） | - 键：SourceIp  - 标签键：为空（默认）  - 限定词：default  - 条件运算符：IpAddress（不勾选"如果存在"）  - 值： - 如果ECS使用公网DNS，取值为： ***ECS的弹性公网IP地址***   - 如果ECS使用华为云内网DNS，取值为： **100.64.0.0/10,214.0.0.0/7,*ECS的私有IP地址*** 说明： 取值需要同时配置三个IP地址（IP地址段），请单击"增加"按钮。 其中，100网段和214网段为ECS内网访问OBS的网段。      |
         
      
   
   7. 单击右下角的"创建"，完成桶策略创建。
   
   8. 权限配置信息可以在桶策略列表查看。
      图3查看桶策略列表权限配置信息   
      ![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000002205440480.png "点击放大") 
   
   
   
   
4. **验证反向代理配置**
   
   在任意终端使用ECS弹性公网IP地址+对象名访问OBS资源，如果能正常访问，则说明配置成功。
   例如访问http://*ECS弹性公网IP地址*/ocean.jpg
   图4使用固定IP地址访问OBS资源   
   ![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0273876194.png "点击放大")
   
   
 
