基于Windows的ECS实例实现OSS反向代理

阿里云OSS的存储空间(Bucket)访问地址会随机变换,您可以通过在ECS实例上配置OSS的反向代理,实现通过固定IP地址访问OSS的存储空间。

背景信息

阿里云OSS通过Restful API方式对外提供服务。最终用户通过OSS默认域名或者绑定的自定义域名方式访问,但是在某些场景下,用户需要通过固定的IP地址访问OSS:

  • 某些企业由于安全机制,需要在出口防火墙配置策略,以限制内部员工和业务系统只能访问指定的公网IP,但是OSSBucket访问IP会随机变换,导致需要经常修改防火墙策略。

  • 金融云环境下,因金融云网络架构限制,金融云内网类型的Bucket只能在金融云内部访问,不支持在互联网上直接访问金融云内网类型Bucket。

针对以上问题,您可以通过在ECS实例上搭建反向代理的方式访问OSS。

操作步骤

  1. 创建一个ECS实例。

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

    如何创建ECS实例,请参见选购ECS实例

  2. 连接ECS实例。

    如何连接ECS实例,请参见 连接ECS实例

  3. 下载Nginx并解压。

    本文以Nginx-1.19.2版本为例。

  4. 修改配置文件nginx.conf

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

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

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

    2. 修改配置文件内容。

      worker_processes  1;
      events {
          worker_connections  1024;
      }
      
      http {
          include       mime.types;
          default_type  application/octet-stream;
      
          keepalive_timeout  65;
          server {
              listen       80;
              server_name  47.**.**.43;
      
              error_page   500 502 503 504  /50x.html;
              location = /50x.html {
                  root   html;
              }
      
             location / {
                  proxy_pass  http://bucketname.oss-cn-hangzhou-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

      跳转的域名。

      • ECS实例与Bucket在同一地域时:填写目标Bucket的内网访问域名。关于内网访问域名的更多信息,请参见通过内网访问OSS

      • ECS实例与Bucket不在同一地域时:填写目标Bucket的外网访问域名。关于外网访问域名的更多信息,请参见通过外网访问OSS

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

      proxy_set_header Host

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

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

      • 遇到签名错误问题。

      • 如果您的域名已解析到ECS实例的外网上,且您的用户需要通过浏览器预览Bucket中的图片或网页文件。您可以将您的域名绑定到ECS实例代理的Bucket上,不配置CNAME。在该情况下,proxy_pass项可直接配置Bucket的内网或外网访问地址。如何绑定自定义域名,请参见绑定自定义域名

      说明

      该选项针对自定义域名请求到代理服务器的场景。如果您使用IP地址直接请求访问代理服务器, 您需要在nginx.conf文件中注释proxy_set_header Host $host

      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是否缓存从后端服务器接收到的数据。设置为off意味着Nginx将立即转发数据给客户端,而不会进行缓存,这可以降低延迟,但也可能增加带宽消耗。

      proxy_request_buffering

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

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

  6. 开放ECS实例的TCP 80端口。

    Nginx默认使用80端口,您需在ECS的安全组配置中,允许用户访问TCP 80端口。

    如何配置,请参见添加安全组规则

  7. 测试使用ECS外网地址加文件访问路径访问OSS资源。

    本文跳转的域名以OSS默认域名为例。使用本地浏览器访问时,OSS资源默认会被下载。如果您需要实现访问OSS资源时预览,您在配置proxy_pass时需要使用自定义域名。

    说明

    如果访问的文件读写权限为私有,文件URL中还需要包含签名信息。详情请参见签名版本1

相关文档