ApacheがAH00144で落ちていたので対処した話


深夜に、本番システムがダウンしているという連絡があった。

BtoBのWebサービスが開けなくなっている!!!
翌日のビジネスアワーまでに孤軍奮闘で解決しなくてはならないという、胃が痛くなる事案に緊急対処したので、その情報共有である。

環境

Amazon EC2 の Ubuntu 16.04 で稼働するWebサイト。

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.3 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

$ apache2 -v
Server version: Apache/2.4.18 (Ubuntu)

エラーログ

サーバにログインしてみると Apache がエラーを吐いて死んでいた。
Fatal error という文字列を見ると、一瞬で酔いが醒めるよね。

$ tail /var/log/apache2/error.log
[Tue Aug 25 20:51:54.215281 2020] [mpm_prefork:emerg] [pid 930] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Tue Aug 25 20:51:54.215369 2020] [mpm_prefork:emerg] [pid 929] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Tue Aug 25 20:51:54.216849 2020] [mpm_prefork:emerg] [pid 933] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Tue Aug 25 20:51:54.217182 2020] [mpm_prefork:emerg] [pid 931] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Tue Aug 25 20:51:54.218350 2020] [mpm_prefork:emerg] [pid 928] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Tue Aug 25 20:51:54.218757 2020] [mpm_prefork:emerg] [pid 1336] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Tue Aug 25 20:51:55.040404 2020] [core:alert] [pid 1287] AH00050: Child 928 returned a Fatal error... Apache is exiting!
[Tue Aug 25 20:58:05.444208 2020] [mpm_prefork:emerg] [pid 1333] (22)Invalid argument: AH00146: couldn't release the accept mutex

AH00144: couldn't grab the accept mutex がプロセスの数だけ出力されている。

とりあえず AH00144 でググってみると、
https://hirose31.hatenablog.jp/entry/2020/03/10/190010
という秀逸なブログを発見!

当環境でも諸事情により、非システムユーザ(uidが1000以上)で Apache を起動していたのだ。
再現方法も見事に合致してる。

対処

手順としてはシンプル。

/etc/apache2/apache2.conf
#Mutex file:${APACHE_LOCK_DIR} default

のコメントを外し、rebootしただけ。

もしくは、/etc/apache2/conf-available/mutex-file.confみたいなファイルを作り、a2enconf mutex-fileとしても良いかもしれない。

セマフォの確認

次の通り、対策前後で、Apacheがセマフォを作っていないことを確認できれば、定義は反映されている。

対策前
$ ipcs -a

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 0          root       644        80         2
0x00000000 32769      root       644        16384      2
0x00000000 65538      root       644        280        2

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x000000a7 0          root       600        1
0x00000000 131073     testuser   600        1
0x00000000 163842     testuser   600        1
0x00000000 98307      testuser   600        1
対策後
$ ipcs -a

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 0          root       644        80         2
0x00000000 32769      root       644        16384      2
0x00000000 65538      root       644        280        2

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x000000a7 0          root       600        1