Apache2运行正常一段时间,然后停止提供内容,重启时出错

时间:2014-02-18 09:47:31

标签: php linux sockets apache2 debian

我的系统

  • Apache2在Debian 7 Wheezy上运行
  • 这是一个具有一个IPv4地址和多个虚拟主机的物理服务器。
  • Webapps:Polaric,Redmine,phpMyAdmin等
  • PHP-info here:http://tracking1.sfrkh.net/phpinfo/(问题解决后将被删除)

问题描述

当我的服务器启动时,一切正常。 Apache2开始提供内容,我的网站正在按预期工作。

'一段时间'(几天到几周)之后,我再也无法访问我的任何网站了。 Apache2停止向我的浏览器提供内容。

这是我几个月来的一个反复出现的问题。我第一次体验它,是在安装和配置所有内容后的几天。

解决问题1

如果我重新启动,一切都恢复正常。在“一段时间”之后问题再次出现。

解决问题2

首先,当我尝试启动或重启apache2时:

# apache2ctl start 
- OR -
# /etc/init.d/apache2 start
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
Action 'start' failed.
The Apache error log may have more information.

然后我用netstat检查监听套接字:

# netstat -ltnp | grep ':80'
tcp  0  0 0.0.0.0:8081    0.0.0.0:*       LISTEN      16100/jsvc.exec
tcp6 0  0 :::80           :::*            LISTEN      14794/apache2

然后我尝试停止apache2:

# apache2ctl stop
httpd (pid 9124?) not running

- 或 -

# /etc/init.d/apache2 stop
Stopping web server: apache2.

然后我再次运行netstat命令,得到与上面完全相同的结果。甚至PID也没有改变。

当我从netstat中删除PID并再次启动apache2时:

# kill -9 14794
# apache2ctl start

..然后一切都恢复正常。

Netstat在一切恢复正常后:

# netstat -ltnp | grep ':80'
tcp  0  0 0.0.0.0:8081    0.0.0.0:*       LISTEN      16100/jsvc.exec
tcp6 0  0 :::80           :::*            LISTEN      16434/apache2

Netstat存在问题,netstat在一切正常后,对我来说似乎没有什么不同。只有PID发生了变化。

“一段时间后”问题再次出现。

问题

我不知道从哪里开始。尝试搜索谷歌,这些论坛,其他论坛,但找不到适合我的解决方案。正如您所看到的,我让服务器重新启动并运行,但问题一再出现。

有什么可能导致这种情况的想法?

注意

我希望我转向正确的论坛。谷歌是我的朋友,大多数关于类似主题的有用建议都来自这个论坛:)

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

The Apache error log may have more information.

这看起来像是要开始的地方。

看起来这里有两个问题:1)apache在一段时间后失败,以及2)当发生这种情况时你无法重启Apache。

问题2首先。一种可能性是你有两个Apache安装正在运行,一个正在抓住另一个端口。

或者,Apache正在死亡,重新启动,但没有正确写入其PID文件,所以当你要求它重新启动时,它无法正常自杀。

或者,它正在编写PID文件,但是apache2ctl(或者你正在运行它的用户)对它们没有读取权限(不太可能)。

无论哪种方式,PID文件看起来都是错误的,因为它正在寻找PID 9124,但是Apache正在运行PID 14794.并且鉴于“无法打开日志”,这看起来像是权限。尝试将Apache重新启动为具有对日志和pidfiles的读/写访问权限的人,例如sudo apachectl graceful,或者将其作为apache用户执行。

如果可以,那么作为一种解决方法,你可以尝试通过root或apache的cron定期运行apache2ctl graceful - 但这是一个讨厌的,讨厌的kludge。

为了得到更糟糕的东西,这样的事情会让它确定它已经死了并重新启动:     apache2ctl graceful || (pkill apache2&& apachectl start)

真正要做的事情是,找到它失败的原因 - 问题1。

我敢打赌,这是PID文件的权限问题:也就是说,在httpd.conf中,你已经要求在一定数量的连接后重新启动连接处理程序( MaxRequestsPerChild设置),但是当它们重新启动时,它们无法写入pid文件来更新它们。这可能导致这种情况。不过,很多其他事情也会如此。

不幸的是,调试会检查PID文件夹和上面所有文件夹的文件权限; apache运行的进程ID和用户(ps -ef | grep -Pi "apache|http"); pid文件的内容;您正在运行apache2ctl的用户; httpd.conf的内容;以及系统日志的内容。

这比我们在这里调试的要多,但也许你可以通过这些东西搜索相关的东西并发布它们吗?