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

CloudFront how to setup reverse proxy on an existing distribution serving website from S3

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

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

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

现在,我想将网站移动到 S3,但仍然 运行 后端 API 在同一台机器上,为此我将不得不更改我的 DNS 记录并将它们指向CloudFront 分布。

但是,使用 www.xyz.com/api 作为后端服务的现有和以前部署的 运行ning 服务将会中断 所以,我想将此路径模式上的所有请求转发到 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 出于兼容性目的,直到我更新所有客户端上的配置。

如果是这样,请建议如何做到这一点,或者您需要我提供哪些信息来帮助完成这项工作?

谢谢,

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

  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。我不熟悉所以不知道它是否可以用于这种情况。

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

在 CloudFront 中创建第二个 Origin,指向 api.example.com。将 "Origin Path" 留空,因为它不会执行您可能假设的操作。

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

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