【问题标题】:How to serve an AWS EC2 instance from S3 subdirectory如何从 S3 子目录提供 AWS EC2 实例
【发布时间】:2020-06-13 21:13:53
【问题描述】:

我有一个托管在 AWS S3 上的网站,通过 Cloudfront 提供服务。 www.mysite.com

我正在一个 EC2 实例上托管博客。

我希望通过www.mysite.com/blog 提供此博客

出于 SEO 的目的,我不希望它是 www.blog.mysite.com

是否可以仅使用 S3 和 Canfront 来实现?

我玩过 S3 重定向和 Lambda@edge,但是关于这些的文档不是很好。在 Lambda@edge 的情况下,如果可以的话,我想避免进一步的复杂性。 S3 重定向工作,但用户不再在 mysite 域下。

S3 重定向示例

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>blog/</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <HostName>${EC2_Public_DNS}</HostName>
    </Redirect>
  </RoutingRule>
</RoutingRules>

我读过的其他文章涉及使用 apache 或 nginx 服务器处理重定向。我宁愿不必添加其中之一。

【问题讨论】:

  • 为什么不使用负载均衡器?

标签: amazon-s3 amazon-ec2 amazon-cloudfront


【解决方案1】:

由于重定向是浏览器的指令,告诉它在别处寻找所请求的资源,CloudFront isn't designed to follow redirects itself -- 它将重定向返回给浏览器。

您想要的是新的 CloudFront 缓存行为和新的 CloudFront 源服务器声明,在处理您的站点的现有 CloudFront 分配中配置。

在 CloudFront 中,添加一个新的 Origin,将 Origin 域名设置为指向 EC2 实例(或实例前面的负载均衡器,如果有的话)的主机名。您会注意到一个名为“Origin Path”的字段,您可能想将其设置为“/blog/”或类似的内容,但这是不正确的。将“原点路径”留空。

然后添加一个与路径模式/blog/* 匹配的新缓存行为并将其指向新的原点。

简而言之,这就是您要寻找的东西,但还有其他几个因素需要适当的设置和配置。

您的源服务器上需要一个 TLS 证书,除非您将源协议策略设置为仅 HTTP,在这种情况下,您在 CloudFront 和 EC2 之间运行未加密的流量。 CloudFront 有 specific requirements 用于在您的源服务器上正确配置 TLS,大多数与 TLS 相关的错误配置将导致 502 Bad Gateway error 尽管该错误代码当然可能有其他原因。

您的博客软件可能需要查询字符串参数和/或 cookie,默认情况下,CloudFront 会从所有请求中剥离(因为它们会干扰缓存)。这是Cache Behavior settings 中的两个通常需要自定义,因为默认值基于典型静态内容的适当设置。

您还需要将博客软件配置为期望传入请求包含路径前缀“/blog/”,因为 CloudFront 不会删除路径组件。将一个或多个元素剥离的原始服务器路径呈现给原始服务器的唯一方法是使用 Lambda@Edge 重写路径 -- as I explained here

如果您现在在精神上反对将路径设置为“/blog/”而不是“/blog”,要记住的问题是该路径需要正确锚定——HTTP 语义假定目录级别以“/”结尾" 而文件和其他资源没有,因此如果您尝试将博客放在不以 / 结尾的路径上,您可能会遇到困难......但为了不应该的用户的利益预计会键入尾随 /,您仍然需要在 S3 中配置重定向——但只是为了将 /blog 的请求发送回 /blog/

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyEquals>blog</KeyEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyWith>blog/</ReplaceKeyWith>
      <HostName>${main_site_hostname}</HostName>
      <Protocol>https</Protocol>
    </Redirect>
  </RoutingRule>
</RoutingRules>

在测试时,您可能还想设置您的Error Caching Minimum TTL to 0,这样您就不会修复问题并在接下来的 5 分钟内继续看到返回的缓存错误,即使错误已通过您所做的更改得到解决。 CloudFront 这样做是为了帮助避免可能已经遇到问题的源服务器过载(正如它返回错误的事实所证明的那样),但它让一些用户措手不及。

【讨论】:

    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多