ELB、nginx 和多个 HTTPS 应用程序

ELB、nginx 和多个 HTTPS 应用程序

假设我有 3 个不同的应用程序,它们都使用 HTTPS。并非所有应用程序都具有高流量,因此我将这 3 个应用程序都运行在同一个由 3 个 EC2 实例组成的“池”上。

domain1.com/domain2.com/domain3.com 均具有指向 Amazon ELB 的 A 记录,它将 :443 和 :80 转发到所有三台服务器上的 nginx:80(因此,是的,ELB 执行 SSL 终止)。由于 ELB 正在执行 SSL 终止,因此我有三个不同的 ELB,而不仅仅是一个.所以基本上:

              domain1.com  domain2.com  domain3.com
                  |             |            |
                  |             |            |
                  V             V            V
                 ELB1          ELB2        ELB3
                  \             |             /
                   \            |            /
                    \           |           /
                     \          |          /
                      \         |         /
                       \        |        /
                        \_______|_______/
                                |
                                |
                                V
                   ---------------------------
                   nginx      nginx      nginx
                     |          |          |
                     V          V          V
                  php-fpm    php-fpm    php-fpm

这三个实例都运行 nginx 和 php-fpm。这样,当负载过高时,我们只需从同一机器映像启动另一个实例,它就会加入池中。实例本身的配置使 nginx 仅连接到在本地主机上运行的 php-fpm。

我不知道这是否是解决这种情况的正确方法。

  • 我是否应该将 SSL 终止移至 nginx,以便不需要 n 个 ELB 作为 HTTPS 证书?这会如何影响 CPU 利用率?
  • 我是否应该使用一台连接到多个 php-fpm 后端的 nginx 机器?然后我需要考虑扩展两个不同的角色,而不仅仅是一个。
  • 例如,如果我想在其他区域启动实例,这该如何改变?

我希望这个问题对于 SF 来说不是不合适的。

答案1

你可以运行如下命令:

          domain1.com  domain2.com  domain3.com
              \             |             /
               \            |            /
                \           |           /
                 \          |          /
                  \         |         /
                   \        |        /
                    \_______|_______/
                            |
ngix (static pages from local storage, 3 IP addresses, SSL termination)
                            |
                            |
                       ELB (optional)
                            |
                            |
                 -----------------------
                 |          |          |
                 V          V          V
                php        php        php
  • 这会稍微便宜一点,因为 1 个 EC2 预留小实例 + 1 个 ELB 比 3 个 ELB 便宜。

  • 如果您可以放弃 ELB 并只使用普通的 DNS 循环,那么成本可能会更低(但您会失去一些 ELB 功能,例如自动故障转移)。

  • 提供静态页面的延迟不会受到 php 服务实例上的负载的影响。

  • PHP 服务不会与静态页面操作系统缓存争夺 RAM。

  • 您甚至可以使用 apache mod_php 而不是 php-fpm,因为您不需要在进程之间分离用户 - 这样应该会更快一些。

  • 添加更多页面来提供服务会更便宜(添加一个 IP 而不是一个 ELB)。

但它也有一些缺点:

  • 您将会遇到一个以上的单点故障(ngix 服务器)。

  • 更复杂的设置。

答案2

我是否应该将 SSL 终止移至 nginx,以便不需要 n 个 ELB 作为 HTTPS 证书?这会如何影响 CPU 利用率?

如果你能确保所有访问者都使用支持 SNI 的浏览器,那么你可以使用 1 个 ELB(或者在主动-备用场景中为 2 个)(请参阅本文档有关 SNI 的问题,例如 Windows XP、Android 2.x 等),否则每个 ssl 证书都需要 1 个公共 IP。

我不知道是否可以为每个 EC2 实例订购和使用多个 IP;如果可以,您可以简单地将这些 IP 路由到单个 ssl-offloader/loadbalancer 上,从而避免 SNI 问题。

我是否应该使用一台连接到多个 php-fpm 后端的 nginx 机器?然后我需要考虑扩展两个不同的角色,而不仅仅是一个。

你可以,但这实际上取决于你使用 nginx 的目的;如果它只是转储 proxy_pass,那么集中化可能没问题,你可以通过减少一些层来简化你的设置。但这只有在实际查看你的实时设置时才能回答。

答案3

我是否应该将 SSL 终止移至 nginx,以便不需要 n 个 ELB 作为 HTTPS 证书?这会如何影响 CPU 利用率?

ELB 是一笔额外的费用(大约每月 20 美元,外加数据),因此您应该考虑到这一点。您正在使用哪些功能?如果您只是在 SSL 终止之后,您可能只需将其卸载到您的 Web/应用服务器上即可。

如果您从负载平衡和扩展功能中受益(以及零维护),那么您可能会认为这是一项值得的投资。

对于 100 个站点来说,每个域 1 个 ELB 可能成本很高,但对于只有 3 个站点来说,不必担心维护开销可能是一件好事。

我是否应该使用一台连接到多个 php-fpm 后端的 nginx 机器?然后我需要考虑扩展两个不同的角色,而不仅仅是一个。

您建议用这个来代替 ELB 还是作为 ELB 的补充?将 Web 服务器和应用服务器分开是有好处的,因为可以方便地独立扩展。这当然会增加另一项维护开销,对于 3 个站点(通常不会承受重负载)来说,这可能不值得。除非您知道自己会需要它,否则我不建议您急于采用这条路。

例如,如果我想在其他区域启动实例,这该如何改变?

这是在故障转移场景中使用 ELB 和 Route53 的多个区域中 EC2 的一个示例。

http://aws.amazon.com/elasticloadbalancing/

使用 Route 53 DNS 故障转移,您可以在多个 AWS 区域运行应用程序,并指定备用负载均衡器以跨区域进行故障转移。如果您的应用程序无响应,Route 53 将从服务中删除不可用的负载均衡器终端节点,并将流量引导至另一个区域的备用负载均衡器。

相关内容