![Apache 服务器完全冻结,直到重新启动](https://linux22.com/image/511687/Apache%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%8C%E5%85%A8%E5%86%BB%E7%BB%93%EF%BC%8C%E7%9B%B4%E5%88%B0%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8.png)
我的服务器每隔几天就会出现这种情况。糟糕的是,它似乎总是在我睡觉后出现这种情况,所以当我醒来时,我发现我的服务器已经停机 6 或 7 个小时了。
当我第一次注意到这个问题时,我添加了一个 cronjob,尝试每 15 分钟重启一次服务器,但我想这并没有解决问题。一旦我注意到服务器已关闭,我就可以执行以下命令:
/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"
我不认为问题出在内存上,因为:
告诉我崩溃之前,内存使用情况正常。
我正在使用 worker mpm 运行 apache,下面是其设置:
<IfModule mpm_worker_module>
StartServers 1
MaxClients 100
MinSpareThreads 5
MaxSpareThreads 10
ThreadsPerChild 10
MaxRequestsPerChild 3000
</IfModule>
这个 apache 服务器正在运行很多东西,但大部分流量来自我托管的一个使用 mod_wsgi 的 django 项目。还有一个使用 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 Server 9.10。当服务器关闭时,所有请求都不会返回。页面挂起。没有错误消息或任何东西。
答案1
你没有说明如何使用 mod_wsgi 并对其进行配置。我建议你先阅读“http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_API'。您可能正在使用 Python 的 C 扩展模块,该模块未正确实现完整线程。但是,如果您使用 mod_wsgi 的守护进程模式,则应检测到此类死锁,并且至少在一段时间后强制重新启动进程。因此,如果您使用的是嵌入式模式(不鼓励使用),则请使用守护进程模式作为开始。
总的来说,如果您认为此类问题与 mod_wsgi 有关,则应在 mod_wsgi 邮件列表中进行讨论。在 StackOverflow/ServerFault/SuperUser 上调试此类问题确实很困难。
答案2
嗯,看来某物导致你的网络服务器收到大量的请求——如果你查看你的 apache错误日志中你可能会发现你已经达到了MaxClients
限制(这就是你的网站崩溃的原因)。
找到并消除请求风暴的源头,你的问题就会消失(如果你很幸运,它都来自一个来源,你可以在防火墙处阻止它们)。
或者,您可以将其MaxClients
提高到某个疯狂的值,但这可能会扰乱系统的其余部分。
答案3
我猜想它是模块之一,或者可能是模块之间的某种交互。我的第一个怀疑是mod_wsgi
,特别是因为你将它与 MPM 工作器一起使用。根据开发人员的说法,它应该是安全的,但它仍然为每个进程创建一个 python 解释器,而 python 解释器并不完全是线程友好的。尝试将您的 django 应用程序切换到 fastcgi。或者尝试使用 MPM prefork 运行 apache。
然后,您可以尝试从 切换mod_fcgid
到mod_fastcgi
,和/或尝试禁用您可能已启用的其他模块。
答案4
您的问题可能有很多种,但既然您还没有遇到,那么您需要做的第一件事就是安装 Monit 或类似的软件。Monit 是一个在您的服务器上运行的守护进程,只要操作系统正在运行,它就会定期检查您定义的应用程序是否正在运行。您可以告诉它检查 Apache 是否可用,如果不可用,则重新启动 Apache。您还可以告诉它根据系统变量(如高负载或满内存)重新启动 Apache。一旦设置完成,您至少可以知道当这种情况发生时您的网站不会关闭,并且 Monit 会在采取行动时向您发送电子邮件,因此您可以轻松记录问题发生的时间,以便与日志等进行比较。