假设我有 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 将从服务中删除不可用的负载均衡器终端节点,并将流量引导至另一个区域的备用负载均衡器。