我被委托为我的客户制作一个 groupon 克隆网站。该网站使用 PHP 和 MYSQL 编写,我计划将其托管在 Amazon EC2 服务器上。我的客户警告我,他将向大约 10,000 名客户发送电子邮件,因此我的网站需要能够处理这些电子邮件带来的点击量激增。我有两个问题:
1) 我应该选择哪个 Amazon 服务器实例?目前我使用的是小型实例,不知道是否应该将其升级到大型实例,以便在电子邮件大爆发的一周内使用?
2) LAMP 服务器需要设置哪些配置。例如,Amazon 服务器、Apache、PHP 或 MySQL 是否有我应该调整的最大连接数限制?
谢谢
答案1
如果您的服务器没有详细的使用情况和负载模式,那么实际上不可能给出明确的答案,但以下一些想法可能会对您有用:
很可能不是每个人都会在同一时刻打开电子邮件 - 因此您可以推测这 10,000 次点击将在一段时间内分散。此外,我推测所有电子邮件都是一次性发送的,以便为人们提供平等的机会来获得您提供的任何服务。
对于架构方面:我推荐使用 Amazon 的 Linux 作为操作系统 - 它相当精简,内存占用低,存储库中包含相当新的软件包,并且性能良好。对于 RAM 低于 3GB 的实例,建议使用 32 位操作系统。
对于高负载服务器,我建议使用 nginx 而不是 Apache,它具有 FastCGI(使用 php-fpm)。这应该允许您处理比 Apache 更多的并发连接,同时资源使用率更低。如果您的内容高度动态,请务必设置操作码缓存(例如 APC)。
缓存任何可以缓存的内容 - 尤其是当所有访问者都会看到相同内容时(例如优惠券/广告)。Varnish 是一个不错的选择(尽管如果您使用 nginx,它确实能够进行一些缓存,但它不提供 Varnish 的选项)。根据内容的性质,您甚至可以考虑生成静态副本并通过 S3/Cloudfront 提供它。
如果可能的话,您可能需要考虑将数据库放在单独的服务器上,这样当需求超出预期时,您就可以使用自动扩展来扩展您的网络服务器。您可能还想使用现货实例来补充您的主服务器。
您可能会发现将部分内容(例如图像)卸载到 Cloudfront 是有益的 - 具体取决于您的设置的瓶颈,这可以大大减少服务器的网络和磁盘使用量(请记住,小型实例具有“中等” I/O)。如果您有磁盘瓶颈,您可以考虑在 RAID 中设置多个 EBS 卷以提高性能。
另外,请记住,在 EC2 上从小实例垂直扩展到大实例相当容易(尽管典型的方法确实有几分钟的停机时间,但这可能是可以避免的)。
正如 @uesp 所建议的,您肯定希望对服务器进行负载测试。如果您有许多不同的页面需要访问,您可以设置一个 URL 列表并让 siege 随机访问这些页面 - 这将提供一些实际的性能指标。
答案2
不幸的是,没有一个答案,因为这取决于您的应用程序(您提供什么服务)和确切的流量(每个客户只加载一个页面还是 100 个页面,5 分钟或 24 小时内加载 10k 个页面)。例如,连接到大型未优化数据库的复杂未优化 Ruby 应用程序将需要大量资源,而简单的静态 HTML/图像可以通过在低端服务器上运行的单个 lighttpd 服务器来提供。
如果您已经在服务器上设置了应用程序,那么您可以/应该使用 ab(ApacheBench)、siege 或任何其他类似程序对您的系统进行基准测试。要获得性能的粗略上限,请在本地服务器上运行它以消除网络性能。根据您的应用,您可能需要特定的测试设置,例如设置 cookie/会话信息以正确衡量性能。如果适用,您可能还想测试应用程序的不同部分(静态/动态、慢速/快速、登录/退出等...)。
测试后,您应该大致了解可以处理的流量,然后根据这个数字决定是否需要更大的系统。测试还应显示您是否需要调整任何应用程序/服务器参数(如连接限制),并帮助衡量参数调整的有效性。
但最终,这总是成本和性能之间的权衡,您必须决定您需要多少性能以及您愿意支付多少费用。