CloudFront如何在S3的现有分发服务网站上设置反向代理

时间:2018-12-29 04:17:00

标签: amazon-web-services nginx reverse-proxy amazon-cloudfront http-redirect

我有一个S3存储桶,该存储桶托管一个网站并随CloudFront一起交付

现在,我已将发行版附加到我的根目录根域,例如-www.xyz.com

因此,以前我们使用Nginx从同一域(www.xyz.com)上的Web服务器根提供静态前端,并且还设置了反向代理(www.xyz.com/api/**)来路由流量到同一台计算机上的上游后端服务器。

现在,我想将网站移至S3,但仍要在同一台计算机上运行后端API,为此,我必须更改DNS记录并将其指向CloudFront发行版。

但是,使用www.xyz.com/api作为后端服务的现有和以前部署并正在运行的服务将会中断 因此,我想将此路径模式上的所有请求转发到http:/// api,以使现有应用程序不会中断。

有没有办法可以做到这一点?即-

来自CloudFront分发的子路径的转发请求 从S3向外部应用程序服务器提供静态前端?

---更新--- --- Nginx conf重定向请求---

location /api/ {
                proxy_pass http://localhost:4040/api/;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
                proxy_http_version 1.1;
        }

这是在服务器指令中,该指令当前将根域和前端公开给世界,但是现在我想将前端迁移到S3,因此仅出于兼容性目的保留此位置块/ api,直到我在所有客户端上更新配置为止。

如果是这样,请建议如何完成此工作,或者从我这方面您需要什么信息来帮助完成此工作?

谢谢

2 个答案:

答案 0 :(得分:1)

在DNS中创建api.example.com,指向您的API。

在CloudFront中创建第二个Origin,指向api.example.com。将“原始路径”留为空白,因为它没有达到您的预期。

使用/api*的路径模式在CloudFront中创建新的缓存行为。将其指向新创建的原点。

CloudFront会将对/api*的所有请求发送到api.example.com,并将其他所有请求发送到默认的“缓存行为起源”,即存储桶。

答案 1 :(得分:0)

我不确定这是否行得通,但这是我想到的第一件事。

  1. 注册其他域api.xyz.com,并将其指向您的旧计算机。

  2. 使用以下nginx server配置块:

    server {
        server_name api.xyz.com;
        ...
        location / {
            proxy_pass http://localhost:4040;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_http_version 1.1;
        }
    }
    
  3. 使用以下Amazon S3 redirection rules将所有请求从www.xyz.com/api/...重定向到api.xyz.com/...

    <RoutingRules>
      <RoutingRule>
        <Condition>
          <KeyPrefixEquals>api/</KeyPrefixEquals>
        </Condition>
        <Redirect>
          <HostName>api.xyz.com</HostName>
          <ReplaceKeyPrefixWith></ReplaceKeyPrefixWith>
        </Redirect>
      </RoutingRule>
    </RoutingRules>
    

您也可以查看AWS Lambda Edge。我不熟悉它,因此无法确定它是否可以用于这种情况。