我的 wordpress 博客在遵循 apache prefork 设置的情况下运行了几个月(~4000 DAU),没有任何问题:
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 5
MaxSpareServers 10
ServerLimit 50
MaxClients 100
MaxRequestsPerChild 3000
</IfModule>
本月,我的日活跃用户数为 5000,虽然不是高峰,但一直在稳步增长。过去 3 天,Apache 开始消耗所有内存(1GB Ram - VPS),服务器没有响应。我尝试更改了很多设置,但它仍然会随机崩溃。
这是我最近的设置:
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 3
MaxSpareServers 6
ServerLimit 100
MaxClients 50
MaxRequestsPerChild 3000
</IfModule>
我正在使用 wordpress supercache 插件和 google sitemap 插件。有人能给我一些提示,告诉我如何阻止 apache crush 吗?提前谢谢大家!
Apache Version - 2
PHP Version - 5.2
MySQL DB - 5
Wordpress - 2.9
答案1
如果 supercache 正在运行,并且您的访问者没有启用 cookies,则应通过 mod_rewrite 向他们提供静态文件(前提是 mod_rewrite 规则正确到位)。如果您受到搜索引擎机器人或登录用户的攻击,则该网站将被实时查看。
我怀疑该问题可能与 mysql 在构建侧边栏时花费太长时间响应查询有关。
发生这种情况时,您可以这样做:
mysqladmin -u root -ppassword processlist > /var/tmp/mysql.processlist
ps aux > /var/tmp/processlist
uptime > /var/tmp/uptime
free > /var/tmp/free
iostat 5 5 > /var/tmp/iostat
vmstat 5 5 > /var/tmp/vmstat
我怀疑第一个会显示十几个锁定的查询。如果您正在运行日历小部件,这将是第一个要删除的东西。
答案2
您需要做的第一件事是将 MaxClients 编辑为 100。MaxClients 和 ServerLimit 实际上是同义词,应始终设置为相同值。如果它们不同,则将使用最低值。
服务器限制 100 最大客户端数 100
假设您的服务器可以处理 100 个客户端,那么这可能会有所帮助。Apache 经常崩溃,因为您使用的设置不允许它使用所有可用的 CPU 和 RAM,这会导致请求排队,最终导致系统崩溃,即使如果设置不同,这些请求可以得到快速处理。您应该调查此站点上其他回复中的所有其他 MPM 相关设置,并了解和调整您的 Keepalive 和 Keepalivetimeout 设置以确保它们达到最佳状态。
我还建议设置 mod_status 和 /server-status/(相同的东西),这样当服务器没有响应时,您可以检查服务器有多少个进程以及它们处于什么状态。您还应该在出现问题时使用 top/htop 监视服务器,以查看 RAM 和 CPU 创建的模式。
答案3
你只有 1GB 的 RAM。看看单个 httpd 进程使用了多少内存,然后用你的 1GB 除以这个值(为操作系统等留出一点空间)。由于 Wordpress 是一个php程序,很可能每个工作者的内存使用量明显高于 20GB,这是您在原始配置中支持 50 个工作者的极限。(50 * 20GB = 你的 RAM 就用完了。)
您目前正在运行多少个工作线程,它们的内存使用情况是多少?