重新启动 apache httpd 正好需要 90 秒

重新启动 apache httpd 正好需要 90 秒

我有一台 openSUSE 13.1 VM(主机运行 Virtualbox 4.2.18,也在 openSUSE 13.1 上),重新启动 httpd(Apache/2.4.6)总是需要 1.5 分钟:

foobar:~ # time /etc/init.d/apache2 restart
redirecting to systemctl restart apache2.service

real    1m30.778s
user    0m0.004s
sys     0m0.000s

随后立即重启就正常了(非常快):

foobar:~ # time /etc/init.d/apache2 restart
redirecting to systemctl restart apache2.service

real    0m1.023s
user    0m0.004s
sys     0m0.000s

5 分钟后,重启时间再次变为恰好 90 秒:

foobar:/tmp # time /etc/init.d/apache2 restart
redirecting to systemctl restart apache2.service

real    1m30.684s
user    0m0.000s
sys     0m0.000s

我目前所寻找的是:

  • top当 apache 重新启动时并没有显示太多信息(使用率约为 0%)。
  • netstat也没有表现出与外界的任何联系。

请注意,这是一个当前流量为 0 并且内存和磁盘中有大量可用 GB 的虚拟机。

我还发现“重新启动”中的“停止”部分需要 90 秒。

知道为什么会发生这种情况或我下一步应该去哪里查看吗?

编辑:我发现当stop花费 90 秒时我会始终得到以下信息/var/log/apache2/error_log

[core:notice] [pid 3179] AH00052: child pid 3203 exit signal Segmentation fault (11)

答案1

经过多次尝试和错误,我发现这是由php5正在加载的模块引起的/etc/sysconfig/apache2。删除它可以完全停止此行为。

但是我需要该php5模块,因此为了减轻这种延迟,我添加了以下内容etc/apache2/server-tuning.conf

GracefulShutdownTimeout 2

现在,当停止 apache 时发生段错误,它只会挂起 2 秒钟。

答案2

同样的事情发生在我身上,结果是我将 /etc/hosts 文件保留为默认设置。

在我更新主机文件之后,延迟立即消失,如下所示:

127.0.0.1   localhost
::1         localhost
172.16.333.444  www.mysite.com mysite.com

参考:

为多个域提供服务的单个 IP 服务器的 /etc/hosts 条目

https://unix.stackexchange.com/questions/57439/slow-start-of-midnight-commander#answer-397879

答案3

使用优雅重启时,父 Apache 进程会停止接受新连接,并永远等待所有子进程退出。因此,实际上 Web 服务器处于死机状态(现有连接除外),直到所有现有子进程退出。

在短时间 http/https 连接的正常使用情况下,正常关闭或重启时这不是问题……通常需要一秒钟。问题在于,当你有延迟子进程退出的东西时,例如持久的 websocket 连接。在这种情况下,服务器将永远无法正常停止/重启……它将永远处于半死状态。

您可以使用 GracefulShutdownTimeout 指令调整延迟:

https://httpd.apache.org/docs/2.4/mod/mpm_common.html#gracefulshutdowntimeout

默认情况下设置为 0(无限)。5 秒是一个更合理的值。

请注意,使用 systemctl 重启服务器时,默认情况下它最多只会等待 90 秒,然后强制其终止子进程(而不是永远),这就是您看到这 90 秒延迟的原因。这是在 /etc/systemd/system.conf 中设置的:

#DefaultTimeoutStopSec=90s

也可以使用 TimeoutStopSec 选项针对各个单元进行更改。

相关内容