当我在谷歌上搜索如何在 nginx 文件中设置 ssl/tls 配置时,我注意到如果我输入 https://example.com 我收到绿色连接安全消息。我以为它不会像我设置 route53 和 cloudfront 之前那样工作。我必须提到我的整个网站都是通过 cloudfront 提供服务的,而不是通过 S3 bucket 提供服务。
我的 /etc/nginx/conf.d 如下所示。我准备添加 443 部分,但似乎不需要。为什么不再需要它;是因为客户端改为使用 .cloudfront.net 域连接吗?如果我不需要更改任何其他内容,那么唯一缺少的就是弄清楚如何始终首选 https,以便用户不会看到连接不安全的消息。
#
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:3000;
}
}
#
答案1
在这种情况下,您可以将 EC2 实例配置为侦听端口 80。事实上,将 TLS 添加到 nginx 配置只会减慢您的网站提供内容的速度,因为当它根据请求将内容提供给 CloudFront 边缘位置时,流量将被加密。但是,除非您将 EC2 实例锁定为仅可从 AWS CloudFront 访问或仅向 AWS CloudFront 提供内容,否则您可能会因将内容提供给 CloudFront CDN 而遭受中间人攻击。
我发现这个 Reddit 线程提供了一些关于如何锁定 EC2 实例以便只能从 CloudFront 访问的建议:https://www.reddit.com/r/aws/comments/82nolm/restricting_access_to_my_origin_webserver_so_only/
你提到 https://example.com 已经为您服务。我不得不假设这意味着您已添加自定义示例.com作为备用域名到您的 CloudFront 分配,然后配置了 ACM 颁发的证书为您的域。然后,您已将 CNAME 添加到您的example.com
唯一 CloudFront 终端节点名称,例如e8anx24185c3y.cloudfront.net
。
CloudFront 将您的所有内容缓存在边缘站点。当您的最终用户请求内容时,https://example.com
它会从物理上最接近他们的边缘站点返回。除非最近的边缘站点没有所请求内容的本地缓存,否则它实际上在该请求期间根本不与您的服务器通信。但是,由于 CloudFront 尚未拥有内容,因此不会将最终用户重定向到您的 EC2 实例。相反,CloudFront 会将响应从您的 EC2 实例下载到边缘站点,然后通过客户和 CloudFront 边缘站点之间发起的 TLS 连接继续将该内容返回给最终用户。
要回答您的最后一个问题,您可以在 CloudFront 分发配置中强制将连接http://example.com
升级到https://example.com
。此设置在行为上配置。浏览到您的 CloudFront 分发,然后单击顶部的行为选项卡。从那里,选择您的默认行为(或从您的 EC2 提供内容的任何行为),然后单击编辑. 对于Viewer Protocol Policy
,选择将 HTTP 重定向到 HTTPS,然后点击是的,编辑保存您的更改。