如何让 Apache2 等待网络初始化?

如何让 Apache2 等待网络初始化?

服务器刚刚从 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或处于活动状态。使用您最喜欢的文本编辑器打开控制文件;我喜欢使用:sendmailmonitnano

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

现在完成了这些,让我们创建一个monitApache 规则集。首先,找出 Apache.pid文件的设置位置并检查它是否已设置。这通常是在 Ubuntu 12.04 上使用默认 Apache 包安装设置的位置:

ls -la /var/run/apache2.pid

如果该.pid文件路径正确,让我们像这样创建实际的monitApache 规则集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 }

脚本的逻辑相当简单:monitApache 规则集将检查/var/run/apache2.pid文件,并知道使用特定init.d指令startstop逻辑。神奇之处在于if/块,它基本上监视本地主机上的thenApache 端口,如果超时 15 秒或更长时间,它将采取行动恢复 Apache。如果满足或条件,该行将向指定的电子邮件地址发送电子邮件警报;这是可选的,因此如果您不需要被电子邮件警报淹没,请随意将其注释掉。80127.0.0.1alerttimeoutnonexist

现在重新启动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。进行实验并查看效果。

相关内容