如何修复Apache不稳定性?

时间:2008-11-23 21:28:31

标签: php apache2 debian

我在Debian上配置了一个简单的LAMP堆栈,我遇到了Apache Web服务器的一些问题。

每隔3-4小时,Web服务器就会进入死锁,并且所有请求都会阻塞数据库。服务器正在为每个请求创建一个新子节点。进程数量增长很快。几秒钟后,Monit注意到了一些错误并重新启动了Apache服务器。

我怀疑这个问题是由PHP处理数据库连接池的方式生成的,因为服务器仍然能够回答静态内容请求。你有过这种行为吗?我该怎么做?

更新:问题已解决。使用APC进行操作码缓存和用户数据似乎是一个坏主意。我现在使用Memcache存储用户数据,仅使用APC代码。我仍然不时会遇到一些分段错误,但服务器大部分时间都是稳定的。

4 个答案:

答案 0 :(得分:3)

我怀疑问题是:

  • 一个困难的长期运行的数据库查询,它阻止了进一步的请求。如果你使用只有表级锁定的MySQL MyISAM引擎并且读者可以轻松阻止编写器,反之亦然,这是相当容易的,所以一个棘手的查询,例如用户表,几乎可以阻止整个服务器数据库等待I / O.您通常可以使用“SHOW PROCESSLIST”或为您执行此操作的工具来诊断它。
  • 对于prefork服务器上可用的RAM设置MaxClients太高了 - 几乎每个人都这样做。如果您正在使用“胖”prefork Apache(例如使用进程内PHP),那么请不要将MaxClients设置为高于你有足够的RAM。这可能比100或150的典型值低很多。

这两件事情合谋导致你所看到的问题。它们都需要修复,因为它们可能会导致问题。

这完全基于猜测和经验。

答案 1 :(得分:1)

你为什么不看看日志? /var/log/apache2/*是一个很好的起点。在服务器死之前请求什么?从那以后,你可以推断出出了什么问题。由于php脚本默认在30秒后终止,因此错误需要非常大,才能产生类似的效果。

答案 2 :(得分:1)

检查/etc/apache2/apache2.conf中的超时设置,当Timeout设置为高并且系统被一堆断开的连接命中时,我遇到了类似的问题。

答案 3 :(得分:0)

mysql-slow日志对于查找导致问题的慢查询也很有用。