如何防止 Apache 摔倒?

Dav*_*ild 8 php performance nginx magento apache-2.2

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

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

<IfModule prefork.c>
    StartServers      50
    MinSpareServers   50
    MaxSpareServers  100
    ServerLimit  512
    MaxClients   256
    MaxRequestsPerChild 400
</IfModule>
Run Code Online (Sandbox Code Playgroud)

我没有关闭 .htaccess 文件,并且访问日志是打开的。我知道有些模块我可以关闭。我不确定这三个变化中的任何一个会产生什么影响,如果有的话。

apache 服务器是一个 VPS,有 6 gig 的 RAM。截至撰写本文时,服务器正在报告load average: 17.77, 18.27, 49.76,但大约有 2 gig 的可用 RAM。当它变得非常糟糕时,负载会增加到 120+ 并保持在那里 - 重新启动 apache 会使站点重新启动并重新降低负载。

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

我有点卡住了。我所知道的一点点告诉我,问题是由于正在运行的代码和用户数量的组合导致 CPU 过载。但我没有足够的经验来确定这就是问题所在。如果这是问题所在,我认为解决方案是改进代码或使用负载平衡器将站点托管在两个 VPS 上。

所以,我想我的问题是:

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

编辑:

我发现了一些奇怪的东西 - /var/spool/mail/root 很大...... 38 gig。这听起来……不健康。这可能是问题吗?

Mar*_*els 3

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

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

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

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