服务器刚刚从 Squeeze 升级到 Wheezy。重启后,我注意到 apache2 没有启动,因此安装了 bootlogd 来检查 init 脚本的输出。
apache start 的错误输出是,
Tue Feb 3 08:49:55 2015: [....] Starting web server: apache2(99)Cannot assign requested address: make_sock: could not bind to address [0123:4567:890:abc::d]:80
Tue Feb 3 08:49:55 2015: no listening sockets available, shutting down
Tue Feb 3 08:49:55 2015: Unable to open logs
Tue Feb 3 08:49:55 2015: Action 'start' failed.
Tue Feb 3 08:49:55 2015: The Apache error log may have more information.
启动输出中的时间戳显示“配置网络接口”(08:49:51)和启动 apache 之间相隔 4 秒。
我通过插入一个sleep 5
来解决这个/etc/init.d/apache2
问题,之后 apache2 就可以正常启动了,所以我将其读作网络初始化缓慢(可能特定于 IPv6 网络)。该服务器在 VMWare 上运行,我只能访问 VM。
- 我可以使用哪些更好的方法让 Apache 等待几秒钟并在启动之前检查其地址是否已启动并运行?
- 或者让网络初始化脚本直到地址准备好才退出?
答案1
我可以使用哪些更好的方法让 Apache 等待几秒钟并在启动之前检查其地址是否已启动并运行?
好吧,我概述的方法显然不能解决根本问题。但我相信使用可以处理“启动 Apache 服务”任务而无需破解脚本的独立监控工具init.d
是更稳定的解决方案。关键是使用monit
其自我描述为:
Monit 是一个用于管理和监控 Unix 系统的小型开源实用程序。Monit 可自动进行维护和修复,并可在发生错误时执行有意义的因果操作。
要在 Ubuntu 中安装它,只需执行以下操作;我正在使用aptitude
,这是在 Ubuntu 12.04 FWIW 上:
sudo aptitude install monit
安装完成后,我喜欢设置默认邮件服务器以发送警报。这假设您已在服务器上启用postfix
或处于活动状态。使用您最喜欢的文本编辑器打开控制文件;我喜欢使用:sendmail
monit
nano
sudo nano /etc/monit/monitrc
查找set mailserver
行并设置此行并保存monit
控制文件:
set mailserver localhost
现在检查并确保有一个monit
conf.d
目录设置;这是monit
设置各个任务的地方:
ls -la /etc/monit/conf.d
如果由于某种原因/etc/monit/conf.d
没有设置,请像这样创建:
sudo mkdir /etc/monit/conf.d
现在完成了这些,让我们创建一个monit
Apache 规则集。首先,找出 Apache.pid
文件的设置位置并检查它是否已设置。这通常是在 Ubuntu 12.04 上使用默认 Apache 包安装设置的位置:
ls -la /var/run/apache2.pid
如果该.pid
文件路径正确,让我们像这样创建实际的monit
Apache 规则集nano
:
sudo nano /etc/monit/conf.d/apache2.conf
并将此代码放入该文件并保存:
check process apache with pidfile /var/run/apache2.pid
start "/etc/init.d/apache2 start"
stop "/etc/init.d/apache2 stop"
if failed host 127.0.0.1 port 80
with timeout 15 seconds
then restart
alert [email protected] only on { timeout, nonexist }
脚本的逻辑相当简单:monit
Apache 规则集将检查/var/run/apache2.pid
文件,并知道使用特定init.d
指令start
和stop
逻辑。神奇之处在于if
/块,它基本上监视本地主机上的then
Apache 端口,如果超时 15 秒或更长时间,它将采取行动恢复 Apache。如果满足或条件,该行将向指定的电子邮件地址发送电子邮件警报;这是可选的,因此如果您不需要被电子邮件警报淹没,请随意将其注释掉。80
127.0.0.1
alert
timeout
nonexist
现在重新启动monit
:
sudo service monit restart
您还可以按照monit
此处的日志查看它的运行情况,如果某些操作未按预期进行,则可以进行调试:
sudo tail -f -n 200 /var/log/monit.log
因此,当该服务器尘埃落定时,您将monit
设置好以确保 Apache 正在运行。作为通用的“保持 Apache Web 服务器正常运行”工具,它非常有用,但在您的情况下,monit
它可以接管确保 Apache 在重新启动/启动时启动的任务,这样您就不必摆弄核心 Apacheinit.d
脚本,这确实有点混乱,并且在将来升级期间很容易被遗忘。
另请注意,我可以看到您将 Apache 明确绑定到 IPv6,但此监控脚本假设如果无法到达,127.0.0.1
则应采取行动。也许您需要将 的 IPv4 本地主机地址更改127.0.0.1
为 的 IPv6 等效地址::1
。进行实验并查看效果。