首页 > 解决方案 > 运行 python 项目的 EC2 实例上的 HTTPS

问题描述

我在运行 python 项目的 EC2 实例上解析 HTTPS 时遇到了相当大的困难。请求刚刚超时 (ERR_CONNECTION_TIMED_OUT)。但是,HTTP 运行正常。我采取的步骤如下。

  1. 我在 ACM 中为以下域创建了证书:*.mywebsite.com 和 mywebsite.com

在此处输入图像描述

  1. 我将 Route 53 设置如下:

在此处输入图像描述

A 记录的路由策略很简单。

  1. 我已经进入我的 EC2 实例的负载均衡器的侦听器,并将端口从 80 (HTTP)更改为 443 (HTTPS) 并添加了我的证书。

注意:“转发到”是在端口 80 (HTTP) 上运行的目标组。我读过这是正确的。

在此处输入图像描述

  1. 然后我进入了我的安全组的入站规则,并添加了 HTTPS

在此处输入图像描述

在这一点上,我有以下问题:

a) 鉴于这是一个 python/Django 项目,是否可以通过 aws 网站为 EC2 启用 HTTPS,或者我是否需要添加配置文件并部署到我的实例?

b) 我需要创建一个在 HTTPS 上运行的目标组吗?

c) 我的负载平衡是否需要端口 80 和端口 443 或仅端口 443 的侦听器?

d) 在我的安全组上,我是否需要端口 80 才能访问 0.0.0.0/0 和 ::0/?

e) A 记录应该是负载均衡器的 DNS 名称还是我的环境的 CNAME?

谢谢你的帮助!一旦我们在这里得到答案,我将写一个指南并将其发布在 youtube 上。

标签: pythondjangoamazon-web-servicesamazon-ec2

解决方案


让我先简要介绍一下在这种情况下请求是如何流动的。

正如您正确猜测的那样,负载均衡器,具体来说就是应用程序负载均衡器可以处理 SSL 流量。这也意味着从负载均衡器到源服务器,在这种情况下提到的目标组,只有 http 流量会流动,而不是 https。所以您不必担心在服务器上处理证书。然后,来自源服务器的响应再次包装在 SSL 隧道中,并由 ALB 发送回客户端。

这意味着您的最终用户至少应该能够连接到负载均衡器端口 443 以及端口 80(可以重定向到 443)。

这意味着您的负载均衡器的安全组应该将端口 443(以及可选的 80)向世界或您的用户开放。

在源服务器和 ALB 之间,流量在您的应用程序运行的端口中流动,这是服务器的安全组应该允许访问 ALB 的端口。

换句话说,服务器 (EC2) 安全组应该允许 ALB 在应用程序运行的任何端口上。

注意:这不一定是 80 或 443,也可以是 8080,只要您的目标组知道它并在该端口上转发请求即可。

现在回答你的问题:

a) 鉴于这是一个 python/Django 项目,是否可以通过 aws 网站为 EC2 启用 HTTPS,或者我是否需要添加配置文件并部署到我的实例?
你不必这样做。正如我所提到的,加密/解密可以卸载到 ALB。在此处的文档中阅读有关它的更多信息。

b) 我需要创建一个在 HTTPS 上运行的目标组吗?
这建立在上一个问题的基础上,不,您不必这样做。应用服务器/EC2 实例不应该关心这个。

c) 我的负载平衡是否需要端口 80 和端口 443 或仅端口 443 的侦听器?
这取决于您的用例。基本的必要条件是只有 443。如果您想让用户仍然登陆 http 站点,然后被重定向到更安全的 https 版本,您可以再次使用 ALB。更多关于它的信息

d) 在我的安全组上,我是否需要端口 80 才能访问 0.0.0.0/0 和 ::0/?
对于 ALB,可以,但对于 EC2 实例则不行。请记住,Ec2 从不直接与用户通信,只与 ALB 通信。这样您就可以更严格地控​​制 EC2 上的流量。

e) A 记录应该是负载均衡器的 DNS 名称还是我的环境的 CNAME?
使用别名记录。它们更容易管理,AWS 将负责映射。更多关于这里的信息。


推荐阅读