我遇到一个问题,启用 MS SQL Server [1] 的 PHP 驱动程序会导致 Apache httpd 在通过 systemd ( systemctl start httpd
) 启动三分钟后超时。如果直接启动 Apache 则运行正常 ( httpd -X
)。systemctl 错误是:
httpd.service 的作业失败,因为向控制进程发送了致命信号。有关详细信息,请参阅“systemctl status httpd.service”和“journalctl -xe”。
如果我禁用 PHP/MSSQL 驱动程序,问题就消失。
这是 RedHat 7.5,SELinux 处于“宽容”模式。
下面的链接包含运行 的相关日志文件echo $(date) && systemctl restart httpd
。回显日期为Mon Jun 25 11:46:25 CDT 2018
,因此日志从该点开始。估计故障时间为 11:49:25,因为运行 后已超时 3 分钟restart httpd
。请注意,PHP 错误日志中没有条目,因此未包含该条目。ApacheLogLevel
设置为debug
。
日志文件:https://gist.github.com/jamesmontalvo3/50cfaa2b2cee966917fc96e3c6784887
由于上面的日志似乎没有显示任何有用的信息,我还运行了strace -ff -o /tmp/st2 -s 5000 systemctl start httpd
。六个堆栈跟踪进程的输出可以在这里找到:https://gist.github.com/jamesmontalvo3/89f5e3897c1e2b71b68818215f220477。不过,我这里也没有看到任何错误。
我如何才能确定如何修复此问题,而没有任何有用的错误消息?还是我只是错过了什么?
我已将此问题发布在 PHP/MSSQL 驱动程序的 GitHub [2] 和 Apache 邮件列表 [3] 上。
参考文献:
[1]https://github.com/Microsoft/msphpsql
答案1
我认为最重要的信息是:
6月25日 11:47:56 服务器故障 systemd[1]: httpd.service 启动操作超时。终止。
默认情况下,systemd 会给服务 90 秒(DefaultTimeoutStartSec
in system.conf
)的时间来启动 – 如果启动时间超过此时间,服务将被终止(首先使用 SIGTERM,然后再过 90 秒使用 SIGKILL,明白了吗systemd.kill(5)
– 这就是您所说的三分钟的来源)。据推测,启用 PHP/MSSQL 驱动程序会使 Apache 启动速度变慢,以至于需要超过 90 秒的时间。
尝试增加,例如甚至。您可以使用以下命令执行此操作TimeoutStartSec
:apache.service
TimeoutStartSec=5min
TimeoutStartSec=infinity
systemctl set-property apache.service TimeoutStartSec=5min
(顺便说一句,strace
ingsystemctl
不是很有用,因为systemctl
它不会自行启动服务 - 它只是与 PID1 对话并告诉它执行一些操作。要找出导致 Apache 如此缓慢的原因,您可以添加strace
到ExecStart=
的指令中apache.service
。)