云端和 EC2

Cloudfront and EC2

如何在 EC2 实例前设置 Cloudfront? 我感兴趣的是让用户访问 Cloudfront url 而不是 EC2 来源。

因此,用户不会点击 ec2-52-64-xxx-xxx.ap-southeast-2.compute.amazonaws.com,而是点击 d111111abcdef8.cloudfront.net.

我的目的是通过减少 EC2 实例上的流量和 CPU 负载来节省托管费用,同时为海外用户提供更快的加载时间。

我是否可以将我的 DNS 指向 Cloudfront url 而不是 EC2 来源?

Would I just point my DNS to the Cloudfront url instead of the EC2 origin?

差不多。

从技术上讲,您不会将 DNS 指向 URL,而是将其指向主机名或 IP 地址,CloudFront 的做法略有不同。

首先,虽然...在 CloudFront 分发设置中,您需要在 "alternate domain names" 框中配置 CloudFront 应该希望看到浏览器发送的任何主机名。

对于来源,输入 ec2-...-compute.amazonaws.com 主机名。

此时,在 10-15 分钟后,访问 CloudFront-assigned URL 应该会将您带到您的服务器。

接下来...如果您的 DNS 托管在 Route 53 中,那么您将转到托管区域并为这些主机名创建新的 "A" 记录,将 "Alias" 设置为 "Yes," 这应该会导致目标框中填充 CloudFront 分配,然后您将 select 并保存记录。

如果您的 DNS 不是由 Route 53 托管的,您将改为在 DNS 中创建 CNAME 记录,指向分配给 CloudFront 分配的主机名,例如jozxyqkexample.cloudfront.net。这里的问题是,您不能使用域的 apex/root 执行此操作,因为 CNAME 在那里无效...所以 www.example.com 可以,但是 example.com不会。这是 DNS 的限制,唯一的解决方法是为您的 DNS 使用 Route 53,因为它与 CloudFront 内部集成(因此 "Alias" 记录,上面提到的,它使用内部查找而不是外部引用,例如别名记录)。

您可能还想将 CloudFront 配置为将 Host header 转发回原始服务器;否则当请求到达时,在 HTTP 请求中呈现给您的服务器的主机名将不是您的域名,而是您配置为原始主机的主机名。

请确保,当您通过 CloudFront 连接时,服务器不会将您重定向回 EC2 主机名或 IP(浏览器中的地址栏会发生变化,如果发生变化,您需要修复如果发生这种情况,您的 Web 服务器的配置)。

使用以下步骤将 ec2-52-64-xxx-xxx.ap-southeast-2.compute.amazonaws.com 路由到 d111111abcdef8.cloudfront.net.

按照以下步骤操作:

  1. 登录您的 aws 控制台并搜索 CloudFront

  2. 转到 CloudFront:创建分发(请select Web 分发

  3. Origin Settings 下:Select Origin Domain Name(您可以分配实例的 Public DNS,例如 ec2-52-64-xxx-xxx.ap-southeast-2.compute.amazonaws.com
  4. 默认缓存行为设置下:Select查看器协议策略:将 HTTP 重定向到 HTTPS
  5. 在对象缓存下:选择自定义(保留最小 TTL、最大 TTL 和默认 TTL 中的默认设置)
  6. 转发 Cookies:全部
  7. 查询字符串转发和缓存:全部
  8. 分发设置: Select 价格 Class:(使用所有边缘位置(最佳性能))。
  9. 备用域名 (CNAME)s:添加您的域 URL 名称(如果有的话)
  10. SSL 证书:在 SSL 下,您可以选择默认证书或您的自定义证书,这取决于您的要求。(选择默认值。)

注意:对于自定义 SSL 证书(证书应位于 us-east-1 区域)。

  1. 可能需要 10 到 15 分钟

IP in Origin 会报错:com.amazonaws.services.cloudfront.model.InvalidArgumentException: 参数origin name 不能是IP 地址。 (服务:AmazonCloudFront;状态代码:400;错误代码:InvalidArgument;

即使 AWS 文档说您可以使用 IP。

Public DNS (IPv4) 作为来源给出“504 错误请求无法满足”
当 Origin 是 S3 并且 S3 的权限有限时,我就遇到过这种情况。但是EC2没有权限控制。它是 public.

把这个答案留给同样遇到错误的人

502 ERROR The request could not be satisfied. CloudFront wasn't able to connect to the origin. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner. If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.

如果您 100% 确定您的源已打开 443 端口并且源上的证书有效,您可以在不创建 Route 53 记录的情况下测试您的 Cloudfront 分布。

假设您在 EC2 上拥有“mywebiste.com”,即 运行,您的 Cloudfront DistributionID 是 a1b2c3d4e5。

试试这个:

curl https://a1b2c3d4e5.cloudfront.net -H 'host: mywebiste.com' -I

这就是关于 host header 的全部内容。它必须与您的原始 SSL 证书相匹配。