Apache服务器完全冻结,直到重新启动

我的服务器每隔几天就会这样做。 真是太吸引人了,我上床睡觉后似乎总是这么做,所以当我醒来的时候,我的服务器在过去的6-7个小时里一直处于closures的状态。

当我第一次注意到这一点时,我添加了一个cronjob,每15分钟尝试重新启动一次服务器,但我想这并没有解决。 一旦我注意到服务器closures,我可以这个命令:

/etc/init.d/apache2 restart * Restarting web server apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName ... waiting ...........................................................apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName httpd (pid 17597) already running 

…这是奇怪的,因为重新启动应该重新启动服务器,即使它已经运行,是否正确? 我最终不得不“停止”,然后“开始”重新开始工作。

然后,我查看了原木,发现了一些非常奇怪的东西。 似乎在服务器崩溃的时候,日志中的条目乱七八糟。 它看起来有点像这样:

 xx.xxx.xxx.x - - [21/Apr/2010:06:32:05 -0400] "GET / blah" xx.xxx.xxx.x - - [21/Apr/2010:06:51:25 -0400] "GET / blah" x.xx.xxx.xxx - - [21/Apr/2010:06:38:23 -0400] "GET / blah" xxx.xx.xx.xx - - [21/Apr/2010:06:31:56 -0400] "GET / blah" xxx.xx.xx.xx - - [21/Apr/2010:06:51:49 -0400] "GET / blah" xx.xx.xxx.xx - - [21/Apr/2010:06:33:20 -0400] "GET / blah" 

我不认为这个问题是记忆,因为这个:

在崩溃之前告诉我,内存使用情况良好。

我正在与工人MPM运行Apache,这里是设置:

 <IfModule mpm_worker_module> StartServers 1 MaxClients 100 MinSpareThreads 5 MaxSpareThreads 10 ThreadsPerChild 10 MaxRequestsPerChild 3000 </IfModule> 

这个Apache服务器正在运行一堆东西,但大部分的stream量来自我主持的django项目,它使用mod_wsgi。 还有一个简单的机器论坛,运行在mod_fcgid。 这些设置如下:

 <IfModule mod_fcgid.c> MaxRequestsPerProcess 500 MaxProcessCount 3 AddHandler fcgid-script .php .fcgi AddHandler cgi-script .cgi .pl FCGIWrapper "/usr/bin/php-cgi" .php </IfModule> 

任何人都知道我可以检查的其他东西吗? 我刚刚调整了我能想到的每一个设置,但这些冻结仍然发生。

编辑:我有这台机器上运行的Postgres和MySQL服务器,但他们都工作在这个冻结期间,因为我的备份脚本在5小时的时间内运行,它工作得很好。

编辑2:我正在运行Ubuntu服务器9.10。 当服务器closures时,所有请求都不会返回。 页面挂起。 没有错误信息或任何东西。

你不会说如何使用mod_wsgi并configuration它。 我build议阅读“ http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_API ”。 您可能正在使用Python的C扩展模块,它不能正确实现完整的线程。 如果你使用mod_wsgi的守护进程模式,那么应该检测到这样的死锁,并且一段时间后至less强制重启进程。 因此,如果您使用的是不鼓励使用的embedded式模式,那么请使用守护程序模式作为开始。

总的来说,如果您认为这个问题与mod_wsgi有关,那么应该在mod_wsgi邮件列表中讨论这类问题。 在StackOverflow / ServerFault / SuperUser上debugging这样的东西真的很难。

那么,看起来有什么东西导致你的Web服务器得到一个度量的请求 – 如果你看看你的Apache 错误日志,你可能会看到,你正在达到你的MaxClients限制(这就是为什么你的网站跌倒)。

find并消除请求风暴的来源,你的问题就会消失(如果幸运的话,这些都来自一个来源,你可以在防火墙上阻止它们)。

另外,你也可以使MaxClients达到一些疯狂的价值,但是这可能会让你的系统的其他部分崩溃。

我猜想这是模块之一,也可能是模块之间的一些交互。 我的第一个嫌疑人将是mod_wsgi ,特别是因为你正在使用MPM工人。 根据开发人员的说法,它应该是安全的,但是它仍然会为每个进程创build一个python解释器,python解释器并不是线程友好的。 试试把你的django应用程序切换到fastcgi。 或者尝试用MPM prefork运行apache。

然后,您可以尝试从mod_fcgid切换到mod_fastcgi ,和/或尝试禁用您可能启用的其他模块。

当问题发生时,你可以发布你在error_log中有什么(可以在/ var / log / httpd / error_log中find)吗?
另外,我想同时看到来自/ var / log / messages的部分。
并且,发布df -h(磁盘使用情况)的输出。

你的问题可能是任何数量的事情,但是很明显,你并不是第一个需要做的就是安装Monit或者类似的软件。 Monit是一个在服务器上运行的守护进程,只要操作系统正在运行,就会定期检查您定义的应用程序是否正在运行。 你可以告诉它检查Apache是​​否可用,以及它是否重新启动Apache。 你也可以告诉它重启apache,这取决于像高负载或全RAM的系统variables。 一旦你build立起来了,至less知道你的网站在这种情况下不会停止,Monit会在你采取行动的时候给你发电子邮件,这样你就可以很容易地logging出现问题的时间和日志比较等等

http://mmonit.com/monit/