我为托管的网页运行 Amazon AWS 设置。它使用单个 EC2 实例,并且通过 HTTP 运行良好。但最近我还需要提供 HTTPS。这就是我完全困惑的地方。EC2 实例在 Linux 上运行 Apache、PHP 和 MySQL
我有点(抽象地)了解 HTTPS 在非 AWS 世界中的工作方式。(我从未这样做过。)但我认为这不是使用 AWS 的最佳方式,这似乎涉及在证书管理器中设置某些内容,然后将弹性负载均衡器连接到它。我有点不知所措。
我在证书管理器中成功创建了证书。我设置了一个带有“目标”组的 ELB,该组似乎是正确的,并将其连接到证书。当我尝试在主机前面添加 https:// 时,它说服务器拒绝连接。当我进入 ELB 本身并访问它为 ELB 提供的 URL 时,我收到错误 503 服务暂时可用。
我想我可能只是没有正确理解这一点,这里的 AWS/HTTPS 帖子似乎都假设您知道自己想要完成什么。有人能为我说明一下这些东西(证书、ELB、EC2 实例和 Apache)是如何链接在一起的吗?谢谢。
答案1
首先,不要觉得你必须走 Amazon 证书管理器 (ACM)/负载均衡器路线。这是一个很好的解决方案,但它是为负载均衡器后面有几台服务器而不是单个独立实例的情况而设计的。
另一个可能更便宜的选择是在您的网站前使用带有 ACM 证书的 Cloudfront,或者在实例本身上使用 Lets Encrypt。
话虽如此,你问的是 LB,所以我们开始吧:
如果您不熟悉 AWS 中的负载均衡器,您首先必须了解有两种类型:ELB 和 ALB。
ELB(Elastic Load Balancer)是老式的“经典风格”负载均衡器,它基本上通过均衡器中继连接,而不执行任何花哨的逻辑。你把它放在任意数量的实例前面,然后你就可以转到池中的随机服务器。
ALB(应用程序负载均衡器)稍微复杂一些,因为它们可以执行一些应用程序逻辑路由。使用 ALB 时,您可以定义目标组以及路由规则,这意味着您可以根据请求路径将流量发送到不同的实例集。ALB 的使用方式与 ELB 类似,AWS 似乎正在推动它们的使用。
无论您使用哪种类型的 LB,您仍然会在实例前面放置一个平衡器,它将流量中继到源机器。
当谈论 AWS LB 时,HTTPS/SSL 使事情变得有点复杂,因为它们的配置方式略有不同。
如果您使用的是 ELB,AWS 界面中的侦听器选项卡可让您配置端口映射。在这里,您可以将“人们请求的内容”映射到“它来自哪里”。在这种情况下,您可能需要 80 -> 80 和 443 -> 80。因为您想侦听 http 和 https,但只连接到服务器上的 http,因为它没有 https。对于更高级和更安全的配置,您可以在服务器上安装自签名证书以加密端到端连接,然后使用 443 -> 443。
如果您使用 ALB,侦听器选项卡将再次将“人们请求的内容”映射到“请求来自哪里”,但它不只是映射端口,而是映射到“目标组”。在大多数情况下,效果与 ELB 相同,您将端口 80 和 443 都传输到单个目标组。
ALB 接口基本上将 ELB 接口的一部分拉到自己的页面上,但 ELB 和 ALB 都试图在这里实现相同的功能,定义实例/目标和健康检查。除非您有有效的目标和健康检查,否则您将收到 503 错误。
使用 ELB,您可以定义要查看哪些“实例”。实例选项卡将显示“状态”,这基本上就是 ELB 是否会将流量路由到它。这应该是“InService”,至少在一个实例上,否则您会得到 503。如果您得到任何其他状态,请尝试等待几分钟让它稳定下来,如果它没有更新为 InService,则您的实例有问题,或者您没有配置有效的健康检查。
使用 ALB,目标的定义方式相同。主要区别在于,除了要连接哪些实例之外,您还要定义要连接到实例的端口。配置此端口的最常见方法是指向端口 80 上的实例,因为大多数 Web 服务器都运行在该端口上,但与 ELB 情况一样,为了增强安全性,您可能希望在实例上使用自签名证书的 HTTPS,以使所有内容都端到端加密。
与 ELB 类似,这里最重要的信息是目标状态,在本例中,您希望看到“健康”。如果您没有看到这个,请等待一段时间,或调查您的健康检查。
ALB 和 ELB 都依赖健康检查来了解是否应该将流量路由到您的实例。这通常比较简单。大多数人会将健康检查配置为指向一个相当简单的页面、您网站上的某些内容或您网站根目录,因为 AWS 每分钟会多次访问它,所以这些页面加载速度非常快。如果实例通过了健康检查,它才会获得转发的流量。默认是访问网站的根目录。调整这些选项以最好地匹配您的网站非常重要。我经常将健康线程保持设置为最小值,以使我的服务器尽快处理流量,并将轮询间隔缩短到更快的水平。
答案2
如果你运行单个ec2
实例,恕我直言,没有必要使用ELB
。如果你想使用,请ELB
按照以下操作指导。
如果您想要直接连接到您的ec2
实例而无需在 Apache 上ELB
进行设置,如下所示:https
LoadModule ssl_module modules/mod_ssl.so
Listen 443
<VirtualHost *:443>
ServerName www.example.com
SSLEngine on
SSLCertificateFile "/path/to/www.example.com.cert"
SSLCertificateKeyFile "/path/to/www.example.com.key"
</VirtualHost>
看看文档了解详细说明。
最有可能的是,您在 ELB 端错误地配置了 https,或者您尝试使用实例的 IP 而不是 ELB 的 IP 通过 https 连接到您的实例。