【问题标题】:Apache shutdown - Couldn't grab mutexApache 关闭 - 无法获取互斥锁
【发布时间】:2018-11-12 03:35:29
【问题描述】:

由于某些我不知道的原因,Apache 正在崩溃。

这是崩溃时的 apache 日志:

[Sat Jun 02 02:38:05.196006 2018] [mpm_prefork:emerg] [pid 1122] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Sat Jun 02 02:38:05.196006 2018] [mpm_prefork:emerg] [pid 1116] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Sat Jun 02 02:38:05.198767 2018] [mpm_prefork:emerg] [pid 1115] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Sat Jun 02 02:38:05.199523 2018] [mpm_prefork:emerg] [pid 3924] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Sat Jun 02 02:38:05.204189 2018] [mpm_prefork:emerg] [pid 1937] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Sat Jun 02 02:38:05.207362 2018] [mpm_prefork:emerg] [pid 1120] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Sat Jun 02 02:38:06.057310 2018] [core:alert] [pid 1099] AH00050: Child 1115 returned a Fatal error... Apache is exiting!
[Sat Jun 02 02:38:06.057483 2018] [:emerg] [pid 1099] AH02818: MPM run failed, exiting

我最近在服务器上做的最后一件事是为我的网站安装 certbot 到通用 HTTPS 证书。

【问题讨论】:

  • 我也有同样的问题,发生在日志轮换事件中
  • 你解决了吗?

标签: ubuntu apache2 apache2.4 ubuntu-18.04


【解决方案1】:

虽然肖恩的解决方案是有效的,但我学到了另一种解决这个问题的方法。

首先,您应该知道这个问题与在 Ubuntu 上使用 Certbot 和 SSL 证书有关。

现在,要在不做任何不确定的情况下解决问题,只需执行以下操作(以 root 身份或使用 sudo):

  1. 创建以下文件:/etc/apache2/conf-available/mutex.conf
  2. 在新创建的文件中添加Mutex file:${APACHE_LOCK_DIR} default
  3. 使用a2enconf mutex.conf 启用新配置文件
  4. 使用systemctl restart apache2 重新启动 Apache

但是,嘿,它已经默认启用了!为什么要为此创建一个文件?

当我找到这个解决方案时,我还是一样。

奇怪的是,似乎一旦您开始使用 SSL 证书,此配置行就会以某种方式“被忽略”。
因此,Apache 无法找到互斥文件的锁定目录。

仅在/etc/apache2/apache2.conf 中添加(删除评论)这一行也不起作用。
您必须专门创建一个配置文件并启用它。
否则解决不了问题。

【讨论】:

  • 感谢您的解决方案。请重新检查您的步骤 2,因为它似乎是一个错字。我不得不使用a2enconf mutex-file(没有conf)。
  • @icasimpan 对不起“挑剔”......这可能是一个错误,但我不会将其归类为错字。拼写错误——至少在外行的术语下——只是拼写错误,主要是因为匆忙,或者有时是出于对实际拼写的不了解——通常是偶然的,没有经过校对。
  • it seems that once your start using SSL certificates, this configuration line is somehow "ignored". 重要的精度我在使用SSL之前没有这个问题。
【解决方案2】:

在我的情况下,以下步骤适合我。

  1. 通过 SSH 连接到服务器

  2. 编辑 /etc/apache2/apache2.conf 文件。下面的命令我使用了 nano 编辑器,你可以使用你喜欢的编辑器

sudo nano /etc/apache2/apache2.conf

  1. 搜索“Mutex”部分

  2. 添加下面一行,

Mutex posixsem

  1. 保存并关闭文件。

  2. 重启Apache服务前检查配置,运行命令,

sudo apachectl 配置测试

  1. 如以上检查一切正常,重启Apache服务,

sudo service apache2 重启

希望这对某人有所帮助。

【讨论】:

  • 我刚刚将 Mutex 更新为 posixsem,似乎工作正常。需要进行更多测试。但是,apache docs 表示“如果进程中的线程持有互斥锁段错误,则不会恢复信号量所有权,从而导致网络服务器挂起。”我不明白。你对此有什么想法吗?
【解决方案3】:

您尚未共享完整的日志跟踪。可能是:

[Sun Jul 21 15:49:43 2019] [error] (12)无法分配内存:fork: 无法派生新进程

这是由于内存不足和 apache 未能创建新进程。它还取决于您将其配置为分叉的进程数。当网站上的流量过多时,就会发生这种情况。

【讨论】:

  • 我添加了与错误相关的所有行。这是与使用 Certbot 和 SSL 证书有关的问题。出于某种原因,一旦您使用 SLL 证书,mutex 默认值不会“找到”,您必须手动设置它。使用Mutex file:${APACHE_LOCK_DIR} default 创建文件/etc/apache2/conf-available/mutex-file.conf 并启用它可以正常工作。
【解决方案4】:

我在 Ubuntu 17.10 和 Apache 2.4.27 上遇到了同样的错误。

这似乎与 Apache 与操作系统讨论文件锁定有关。当我进入/etc/apache2/apache2.conf并将Mutex flock添加到Mutex部分(靠近ServerRoot部分)时,似乎已经解决了问题。

不幸的是,我只能说这使用了flock() 函数(系统调用?)来处理文件锁定。每https://httpd.apache.org/docs/2.4/mod/core.html#mutex

所以这是一个有点黑魔法的修复,因为我个人对 Apache 的文件锁定行为还不够熟悉,无法说出它为什么起作用,我只能说它起作用是因为 Apache 崩溃似乎已经停止,但只能这样远的。不过,它可能会对您有所帮助,而且风险似乎相当低。

【讨论】:

  • 感谢您的回复。我会在以后检查这个。会及时通知您。
  • 你好肖恩。仅供参考,我用我不久前找到的自己的解决方案来回答这个问题。您的仍然有效,但请注意避免摆弄未知参数。看看... ;)
猜你喜欢
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多