使用ECS实例反向代理OSS

更新时间:
一键部署
我的部署

由于Bucket的访问域名通过DNS解析,相关的IP地址可能会发生变化,导致用户无法获得长期有效的固定IP地址,但在某些安全需求下,用户需要通过固定IP地址访问OSS资源。为了解决该问题,可以在ECS上搭建Nginx反向代理服务器,用户只需通过访问服务器公网IP80端口,即可访问Bucket中的文件,从而实现通过固定IP访问OSS资源的需求。

方案优势

通过在ECS实例上搭建反向代理服务器Nginx,您可以将OSS Bucket的访问请求通过代理服务器的固定IP转发至OSS内网Endpoint,从而实现以下目标:

  • 固定IP访问:解决OSS默认域名IP动态变化的问题,满足企业防火墙白名单、第三方系统调用等需固定IP的场景。

  • 安全增强:隐藏OSS Bucket名称及地域信息,仅暴露ECS域名或IP,降低直接暴露OSS的风险。

  • 成本优化:通过ECSOSS同地域内网通信,减少公网流量费用。

操作步骤

Ubuntu

说明

以对应Bucket相同地域的Ubuntu 18.04 64位系统的ECS实例为例。

步骤一:安装Nginx

  1. 创建一个ECS实例并连接。如何创建和使用ECS实例,请参见控制台自定义购买并使用ECS实例

  2. 开放ECS实例的TCP 80端口。Nginx默认使用80端口,您需在ECS的安全组配置中,允许用户访问TCP 80端口。如何配置,请参见添加安全组规则

  3. 执行以下命令更新apt源。

    sudo apt-get update
  4. 执行以下命令安装Nginx。

    sudo apt-get install nginx

步骤二:配置Nginx

  1. 执行以下命令打开Nginx配置文件nginx.conf

    sudo vi /etc/nginx/nginx.conf
  2. 参考以下说明修改nginx.conf文件中的HTTP模块。

    重要
    • 本文仅提供演示环境。考虑到您的数据安全,强烈建议您在实际使用环境中配置HTTPS模块。如何配置,请参见NginxTengine服务器配置SSL证书

    • 以下配置方式只能代理访问一个Bucket。

    server {
            listen 80;
            server_name 47.**.**.73; 
    
            location / {
                proxy_pass http://bucketname.oss-cn-beijing-internal.aliyuncs.com;            
                proxy_http_version 1.1;
         }  
    }

    参数

    说明

    server_name

    对外提供反向代理服务的IP,即ECS实例的外网地址。

    proxy_pass

    被代理服务器的地址。此处填写Bucket的访问域名。

    • ECS实例与Bucket在同一地域时:填写目标Bucket的内网访问域名,如http://bucketname.oss-cn-beijing-internal.aliyuncs.com

    • ECS实例与Bucket不在同一地域时:填写目标Bucket的外网访问域名,如http://bucketname.oss-cn-beijing.aliyuncs.com

    关于访问域名的更多信息,请参见访问域名(Endpoint)

  3. 按“Esc”,输入“:wq”保存并退出。

  4. 执行以下命令,测试Nginx配置文件状态。

    nginx -t
  5. 执行以下命令,重启Nginx服务使配置生效。

    systemctl restart nginx

CentOS

您可以点击一键部署通过ROS快速搭建基于CentOSECS实例实现OSS反向代理,无需手动执行以下操作步骤。

说明

以和Bucket相同地域的CentOS 7.6 64位系统的ECS实例为例。

步骤一:安装Nginx

  1. 创建一个ECS实例并连接。如何创建和使用ECS实例,请参见控制台自定义购买并使用ECS实例

  2. 开放ECS实例的TCP 80端口。Nginx默认使用80端口,您需在ECS的安全组配置中,允许用户访问TCP 80端口。如何配置,请参见添加安全组规则

  3. 执行以下命令安装Nginx。

    sudo yum install -y nginx

步骤二:配置Nginx

  1. 执行以下命令打开Nginx配置文件nginx.conf

    sudo vi /etc/nginx/nginx.conf
  2. 参考以下说明修改nginx.conf文件中的HTTP模块。

    重要
    • 本文仅提供演示环境。考虑到您的数据安全,强烈建议您在实际使用环境中配置HTTPS模块。如何配置,请参见NginxTengine服务器配置SSL证书

    • 以下配置方式只能代理访问一个Bucket。

    server {
            listen 80;
            server_name 47.**.**.73; 
    
            location / {
                proxy_pass http://bucketname.oss-cn-beijing-internal.aliyuncs.com;            
                proxy_http_version 1.1;
         }  
    }

    参数

    说明

    server_name

    对外提供反向代理服务的IP,即ECS实例的外网地址。

    proxy_pass

    被代理服务器的地址。此处填写Bucket的访问域名。

    • ECS实例与Bucket在同一地域时:填写目标Bucket的内网访问域名,如http://bucketname.oss-cn-beijing-internal.aliyuncs.com

    • ECS实例与Bucket不在同一地域时:填写目标Bucket的外网访问域名,如http://bucketname.oss-cn-beijing.aliyuncs.com

    关于访问域名的更多信息,请参见访问域名(Endpoint)

  3. 按“Esc”,输入“:wq”保存并退出。

  4. 执行以下命令,测试Nginx配置文件状态。

    nginx -t
  5. 执行以下命令,重启Nginx服务使配置生效。

    systemctl restart nginx

Windows

说明

以和Bucket相同地域的Windows Server 2019数据中心版64位中文版系统的ECS实例为例。

步骤一:安装Nginx

  1. 创建一个ECS实例并连接,如何创建和使用ECS实例,请参见控制台自定义购买并使用ECS实例

  2. 开放ECS实例的TCP 80端口。Nginx默认使用80端口,您需在ECS的安全组配置中,允许用户访问TCP 80端口。如何配置,请参见添加安全组规则

  3. 下载Nginx并解压。本文以Nginx-1.19.2版本为例。

步骤二:配置Nginx

重要
  • 本文仅提供演示环境。考虑到您的数据安全,强烈建议您在实际使用环境中配置HTTPS模块。如何配置,请参见NginxTengine服务器配置SSL证书

  • 以下配置方式只能代理访问一个Bucket。

  1. 进入conf文件夹,使用记事本打开nginx.conf配置文件。

  2. 修改配置文件内容。

    server {
            listen 80;
            server_name 47.**.**.73; 
    
            location / {
                proxy_pass http://bucketname.oss-cn-beijing-internal.aliyuncs.com;            
                proxy_http_version 1.1;
         }  
    }

    参数

    说明

    server_name

    对外提供反向代理服务的IP,即ECS实例的外网地址。

    proxy_pass

    被代理服务器的地址。此处填写Bucket的访问域名。

    • ECS实例与Bucket在同一地域时:填写目标Bucket的内网访问域名,如http://bucketname.oss-cn-beijing-internal.aliyuncs.com

    • ECS实例与Bucket不在同一地域时:填写目标Bucket的外网访问域名,如http://bucketname.oss-cn-beijing.aliyuncs.com

    关于访问域名的更多信息,请参见访问域名(Endpoint)

  3. 返回Nginx主程序文件夹,双击nginx.exe启动Nginx。

结果验证

使用ECS公网IP地址结合文件访问路径,测试访问OSS资源。在任意终端中,使用ECS公网IP地址 + 对象名访问OSS中的公共读文件。如果能够正常访问,则说明配置成功。例如:访问 http://ECS公网IP地址/demo.png得到如下结果:

说明

如果您需要访问的文件读写权限为私有读写,则需要在访问文件的URL中包含签名信息,详情请参见签名版本4(推荐)

常用配置参数说明

对于不同场景,您可以参考以下代码按您的业务场景修改nginx.conf文件中的HTTP模块。

server {
        listen 80;
        server_name 47.**.**.73; 

        location / {
            proxy_pass http://bucketname.oss-cn-beijing-internal.aliyuncs.com;            
            proxy_http_version 1.1;
            proxy_set_header Host $http_host;
            proxy_connect_timeout 15s;
            proxy_read_timeout 15s;
            proxy_send_timeout 15s;
            proxy_set_header Connection "";
            proxy_buffering off;
            proxy_request_buffering off;
     }  
}

参数

是否必选

说明

server_name

对外提供反向代理服务的IP,即ECS实例的外网地址。

proxy_pass

被代理服务器的地址。此处填写Bucket的访问域名。

  • ECS实例与Bucket在同一地域时:填写目标Bucket的内网访问域名,如http://bucketname.oss-cn-beijing-internal.aliyuncs.com

  • ECS实例与Bucket不在同一地域时:填写目标Bucket的外网访问域名,如http://bucketname.oss-cn-beijing.aliyuncs.com

关于访问域名的更多信息,请参见访问域名(Endpoint)

proxy_set_header Host

添加此项时,Nginx会在向OSS请求的时候,将$host替换为ECS的访问地址。

遇到以下情况时,您需要添加此项。

  • 遇到签名错误问题。

  • 如果您的域名已解析到ECS实例的外网,且您的用户需要通过浏览器预览Bucket中的图片或网页文件。您可以将您的域名绑定到ECS实例代理的Bucket上,而无需配置CNAME。

proxy_connect_timeout

设置与OSS的连接超时时间。此超时配置决定了 Nginx 在建立与后端服务器的连接时,最长等待的时间。如果超时,Nginx 将返回错误响应。

proxy_read_timeout

控制 Nginx 从后端服务器读取响应数据的超时时间。如果在此时间内未能从后端服务器读取到数据,Nginx 将返回错误响应。这对于处理可能响应时间较长的请求非常重要。

proxy_send_timeout

设置 Nginx 向后端服务器发送请求数据的超时时间。此参数确保 Nginx 在等待请求数据发送到后端服务器期间保持连接,直到超时或连接显式关闭。

proxy_set_header Connection

设置代理请求头中的 Connection 字段为空字符串,表示在代理请求时,Nginx 不会添加 Connection 头部。这样可以避免 HTTP/1.1 持久连接问题,确保与后端服务器的连接处理正确。

proxy_buffering

控制Nginx是否缓存从后端服务器接收到的数据。

如果取值为on,Nginx会把后端返回的内容先放到缓冲区,然后再返回给客户端。

如果取值为off,Nginx会立即把从后端收到的响应内容传送给客户端,而不会进行缓存,这可以降低延迟,但也可能增加带宽消耗。

proxy_request_buffering

决定 Nginx 是否在将请求体转发给后端服务器之前等待整个请求体完全接收。设置为off表示Nginx将开始接收数据后立即转发,无需等待整个请求体接收完成,这有利于实时性要求较高的应用场景。

示例:通过浏览器预览Bucket中的图片或网页文件

OSS的安全设置,当使用默认域名通过浏览器访问OSS中的图片或网页文件时,会直接下载。所以,如果您的用户需通过浏览器预览Bucket中的图片或网页文件,需为Bucket绑定自定义域名,并在proxy_pass中填写已绑定的域名。如何绑定自定义域名,请参见绑定自定义域名至Bucket默认域名

server {
        listen 80;
        server_name 47.**.**.73; 

        location / {
            proxy_pass http://static.example.com;
            proxy_http_version 1.1;
     }  
}