我的服务器有时会被 Apache 中的连接填满,卡在“发送回复”状态,需要我重新启动 Apache。大多数情况下,这有效,但有时当我尝试重新启动 Apache 时,我会收到此错误:
Job for httpd.service failed because the control process exited with
error code. See "systemctl status httpd.service" and "journalctl -xe"
for details.
根据建议运行systemctl status httpd.service
或journalctl -xe
然后返回以下相关信息:
Nov 15 06:24:06 hostname.biologyreporter.com systemd-logind[874]:
Failed to remove runtime directory /run/user/1067: Device or resource busy
Nov 15 06:24:27 hostname.biologyreporter.com restartsrv_httpd[29484]:
[Fri Nov 15 06:24:27.255594 2019] [core:emerg] [pid 29509:tid 47498001208384]
(28) No space left on device: AH00023: Couldn't create the mpm-accept mutex
Nov 15 06:24:27 hostname.biologyreporter.com restartsrv_httpd[29484]:
(28) No space left on device: could not create accept mutex
Nov 15 06:24:27 hostname.biologyreporter.com restartsrv_httpd[29484]:
AH00015: Unable to open logs
Nov 15 06:24:27 hostname.biologyreporter.com systemd[1]:
httpd.service: control process exited, code=exited status=1
Nov 15 06:24:27 hostname.biologyreporter.com systemd[1]:
Failed to start Apache web server managed by cPanel EasyApache.
-- Subject: Unit httpd.service has failed
然后,apache 可能需要大约 10 分钟左右才能真正重新启动,网站才能再次正常运行。我不知道为什么它会说“设备上没有剩余空间”,例如df
,运行时返回以下内容(没有任何地方占用了 100% 的空间):
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 3973024 0 3973024 0% /dev
tmpfs 3983400 0 3983400 0% /dev/shm
tmpfs 3983400 255296 3728104 7% /run
tmpfs 3983400 0 3983400 0% /sys/fs/cgroup
/dev/sda2 952008348 137586024 766039760 16% /
/dev/sda1 999320 134892 795616 15% /boot
/dev/loop0 3997376 8856 3778808 1% /tmp
tmpfs 796684 0 796684 0% /run/user/0
tmpfs 796684 0 796684 0% /run/user/1022
我无法找到有关上述具体错误的原因和解决方案的任何可靠信息
No space left on device: AH00023: Couldn't create the mpm-accept mutex
和Failed to remove runtime directory /run/user/1067: Device or resource busy
我应该怎么做才能解决这个问题,以便这些错误不会出现并且 apache 总是顺利重新启动?
答案1
这很可能是由于操作系统的信号量限制以及 Apache 没有正确地进行自身清理造成的。
这些错误意味着系统中缺少进程内通信资源,例如信号量或共享内存段。尝试运行以下命令查看是否已达到信号量限制并查看结果:
ipcs -s | wc -l
cat /proc/sys/kernel/msgmni
cat /proc/sys/kernel/sem
通过 SSH 或控制台执行以下命令,看看是否有帮助:
ipcs -s | awk -v user=apache '$3==user {system("ipcrm -s "$2)}'
ipcs -s
列出当前使用的信号量。
awk -v user=apache
过滤掉 apache 用户拥有的那些,然后下一部分icprm -s "id"
对每个用户执行,以删除该信号量。
即整个命令将删除 apache 用户拥有的所有信号量。
答案2
虽然@dzup4uk 的回答似乎能够指出问题所在,但为了真正解决问题,你必须确保信号量得到清理。
ipcs
命令将显示问题所在,但为了真正解决问题,你必须进行一些清理,这可以通过
ipcrm -a
答案3
如果您的 Apache 在 nobody 用户下运行,那么您需要以 nobody 身份运行它,如下所示:
ipcs -s | awk -v user=nobody '$3==user {system("ipcrm -s "$2)}'