我在 VPS 上安装了 Magento,这让我很头疼。
这款 VPS 的配置还算合理 - 2GB 内存和 50GB 存储空间。它运行单个域,安装单个 Magento - 除此之外什么都没有。
大约 5 个月前,我们开始遇到问题。每隔一段时间(大约每 2 或 3 周一次),VPS 就会崩溃 - 所有进程都停止了,重新启动容器的唯一方法是通过 Virtuozzo。
但现在每周要发生 2 到 3 次。我的 VPS 主机确认我已超出 2GB 内存限制,此时所有 VPS 进程都会被终止,以防止它导致整个节点瘫痪。
我根本没有对它进行任何配置更改 - 我曾在其上运行过 New Relic 一小段时间,但已将其删除,以防它导致问题。我在日志中看不到任何表明存在问题的内容,并且在崩溃发生时我们没有运行任何 CRON 作业。
该网站的流量稳定,但不是很大(平均每天访问量通常少于 100 次)
我应该对 Apache 或 PHP 配置做些什么特别的帮助吗?我不是经验丰富的 Apache 管理员,但知道足够多的知识来解决大多数问题...
除此之外,还有其他可能有帮助的想法吗?我不能让这个网站瘫痪这么多。
答案1
设置 MAXCLIENTS 时要注意的另一个有用的东西是 ApacheBuddy。
看https://github.com/gusmaskowitz/apachebuddy.pl
这基本上会查看统计数据和配置文件,并为您提供有关 MAXCLIENTS 设置应该是多少的指导。说实话,我永远无法承受他们建议的那么低,但这可能是“正确”的答案。
使用/安装:
获得https://raw.github.com/gusmaskowitz/apachebuddy.pl/master/apachebuddy.pl
perl apachebuddy.pl
有用的选项包括 -p(例如,如果您正在运行 varnish,则表示端口)和 -P(大写的“P”),同时考虑 PHP 内存设置。
答案2
我现在能想到的有以下几件事:
1) 检查您正在运行 prefork MPM 而不是 worker MPM 2) 编辑 apache2.conf(在 Debian 上位于 /etc/apache2/apache2.conf 下:
确保存在以下配置(对我们来说似乎最好:)
Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 2000
</IfModule>
3)考虑使用 Varnish 作为缓存机制,以减少 Apache 负载 4)安装 APC/Memcache
答案3
您可能希望尝试将 apache-mpm-worker 与 php5-fpm 结合使用。当我从标准 prefork/mod_php 组合切换时,我注意到了巨大的差异。
其他一些建议:
运行以下命令检查 mysql 配置调优入门指南脚本。这将提供一个良好的基础,以确保您的 mysql 配置正确,并且您不会浪费内存。
您是否利用了 Magento 的编译和缓存组件?
由于您只有 2GB 的可用 RAM,请确保您的 Apache MaxClients 处于合理水平。从较低的数字(例如 25)开始,然后监控您的 RAM 使用情况,看看是否可以增加一些。
对于流量相当大的 Magento 服务器来说,2GB 的内存不算多。您是否考虑过增加 RAM 或购买第二台服务器用于专用 mysql,以释放 RAM 供 Apache 使用?
您是否已经使用日志分析器(例如 webalizer、awstats 等)或甚至只是 Apache 的扩展状态模块验证过,在内存使用过多时 Apache 是问题所在?
答案4
通常,在 apache 配置文件中设置什么只是简单的数学运算。您有 2 GB 的 RAM,其中大概 1.5 GB 可供 apache 使用。
所以大约是 1,500 兆。请确保 magento 的 .htaccess 文件是健全的。
php_value 内存限制 128M php_value 最大执行时间 120
(说实话,我们将其设置为 512m,因为许多用户看到的都是空白页。请阅读 var/log/exception.log 以查看是否是这种情况)
在这种情况下,您只能支持 12 个 MaxClients!老实说,我认为 magento 默认内存限制现在是 256。这意味着 maxclients 为 6!我还建议使用较少的 MaxRequestsPerChild。也许低至 100。我会看到一些进程变得越来越大。根据我的经验,Apache 子进程在被销毁之前不会释放内存。这就是此设置的作用。在 100 个请求后重新生成子进程。
我在使用 Apache 时遇到过很多问题。我们有 7 GB 的服务器,它们就像您描述的那样崩溃了。不过我们的流量比您的大得多。
我刚刚看到你也在这个盒子上运行了 mysql。不太好。你可能想研究一下使用 php-fastcgi 运行 nginx。我让它运行得很好,而且它占用的内存少得多。我们唯一的问题是我们有一个使用 ioncube 的扩展,我们需要它,但我无法与它合作。(我还使用 xcache 而不是 apc 作为我们的操作码缓存,因为我听说 apc 不会在 cgi 进程之间共享内存)
我还使用 nginx 作为反向代理来提供所有静态内容。这可能也适用于你。这要好得多,我们使用了很长时间,直到我们决定实施 varnish。
至少你需要为 magento 实现某种缓存解决方案。