我怎样才能防止 Apache 崩溃?

我怎样才能防止 Apache 崩溃?

我有一对服务器,托管一个 Magento 电子商务网站,流量适中(谷歌分析报告显示每天页面浏览量为 60k,我认为服务器本身报告的页面浏览量约为 80k)。数据库服务器运行平稳快速,除了偶尔出现故障外,但 Apache 服务器时常崩溃。

我已经将 magento 设置为使用推荐的 PHP 缓存 (APC),并将其自己的缓存文件保存在 1.5 GB 的 tmpfs 中(此 tmpfs 经常会变得非常满,并且我有一个脚本在 tmpfs 超过 80% 满时运行以清除缓存文件)。我从 amazon cloudfront 提供大多数图像。我最近将 nginx 设置为 apache 的反向代理(nginx 还提供静态文件)。我已尽我所能配置了 apache - keepalives 和 hostnamelookups 已关闭,并且 prefork 配置如下:

<IfModule prefork.c>
    StartServers      50
    MinSpareServers   50
    MaxSpareServers  100
    ServerLimit  512
    MaxClients   256
    MaxRequestsPerChild 400
</IfModule>

我没有关闭 .htaccess 文件,并且访问日志记录已打开。我知道有些模块可以关闭。我不确定这三个更改会产生什么影响(如果有的话)。

Apache 服务器是具有 6 GB RAM 的 VPS。截至撰写本文时,服务器报告为load average: 17.77, 18.27, 49.76,但大约有 2 GB 的 RAM 可用。当情况非常糟糕时,负载会达到 120+ 并保持在该水平 - 重新启动 Apache 会使网站恢复正常运行,负载也会降低。

vmstat我认为(当服务器报告上述负载时)显示 CPU 空闲值在 0 到 70 左右之间波动。iostat显示 iowait 值在 0 到 0.2% 之间。

我有点不知所措。据我所知,问题是由于运行的代码和用户数量导致 CPU 过载。但我的经验不足,无法确定这就是问题所在。如果这就是问题所在,我认为解决方案是改进代码或使用负载平衡器将网站托管拆分到两个 VPS 上。

所以,我想我的问题是:

  1. 我还能做什么来发现服务器上的问题或瓶颈?
  2. 我可以对服务器配置进行一些明显的更改来改善这种情况吗?
  3. 当负载超过一定水平时,设置一个自动化系统来重新启动 apache 是一个好主意吗?
  4. 从以上情况来看,网站规模超出服务器能力范围的可能性有多大?

编辑:

我发现了一些奇怪的事情 - /var/spool/mail/root 很大……38 GB。这听起来……不健康。这可能是问题所在吗?

答案1

正如您所注意到的,Magento 和 Zend Framework 非常耗 CPU。避免 CPU 负载的最佳方法是简单地只渲染一次任何内容,直到它发生变化。目录的大部分内容不会经常更改,而且通常只有页面上的购物车块或“最受欢迎商品”块是唯一的动态部分。

我建议放一个在 Apache 之前缓存。这为您提供了高性能页面缓存,可以大大减轻 LAMP 堆栈的负担。最近,由于 Varnish,我们成功完成了一个非常公开的网站发布,我对它的速度和低 CPU 负载印象深刻。Varnish 是免费的,并且足够灵活,可以缓存整个页面,或者只缓存相对静态的部分并动态包含购物车。

但是,Varnish 在默认的 Magento 安装中不会缓存太多内容,因为有大量的每个用户的动态内容、cookie 等。Magento 模块(例如“由 Varnish 提供支持的 PageCache' 修改 Magento 以使其与 Varnish 配合良好。它还提供了与 Magento 设置相匹配的 Varnish 配置文件。这两者结合在一起构成了一个非常高效的设置。它是一个商业模块,但比更强大的服务器便宜得多。

您卸载到 CDN 或 Nginx 的部分并不是您的真正问题,尽管它确实有帮助。即使 Apache 也可以处理相当多的静态请求。您需要缓存需要反复生成的内容,即您的动态部分。

答案2

我通常将 MaxRequestsPerChild 设置为数千 - 通常接近 10,000。

您说您有“推荐的 PHP 缓存” - 但您安装了 APC 吗?最后,您看到有多少用户同时访问网站。如果您有 Apache 扩展统计信息,您将能够看到有多少 Apache 进程实际上处于正在运行状态。

每秒 800 个 APC 文件命中,另外还有 200 个用户缓存,这已经很多了。如果是双核或四核,我希望它能跟上。如果数据库真的能跟上,那么获得一台更大的机器 - 以及更多的 CPU,可能是最好的选择,至少现在是这样。

答案3

对于双核 VPS 来说,您的平均负载太高了。8 应该是最大值。

我在 Magento 中使用 mod_pagespeed 和 event MPM 取得了很大成功。我建议切换到使用 event MPM,并安装 mod_pagespeed。

有关 Event MPM 的更多信息:Apache 事件 MPM 文档

和 mod_pagespeed:Google 代码:mod_pagespeed

如果在进行上述更改后仍然遇到负载问题,您可能需要考虑切换到其他更好的 VPS 计划。

答案4

我运行了类似的设置,但使用的是 nginx/php-fpm/apc(opcode 和 fast_backend/memcached(slow_backend))。我发现 php 是最大的资源问题,可能是因为 magento 要么非常大,要么就是编码很糟糕。仔细看看到底是什么在消耗资源,可能是像我的情况一样是 php 吗?

除了 Martijn Heemels 写的内容外,还有一个开源 varnish 模块你可以尝试一下。查看http://moprea.ro/2011/may/6/magento-performance-optimization-varnish-cache-3/https://github.com/madalinoprea/magneto-varnish
我只在测试环境中测试过它,到目前为止一切顺利。


您是否将会话保存在数据库中,或者保存在磁盘上(如果是,则保存在 tmpfs 上)?

相关内容