1. 概要
実は、前ページの内容を書いてから、何年も経過しております。
オペレーティングシステム自体のバージョンも変わっているし、マシンも世代交代しております。
「Apache」の設定で、「MPM」やら「OPcache」やらいじっておりましたら、ふと気づくと、「/var/log/messages」やら「Apache」のエラーログに
Nov 1 15:17:04 ns kernel: pid 11345 (httpd), jid 0, uid 80: exited on signal 11
Nov 1 15:33:59 ns kernel: pid 10484 (httpd), jid 0, uid 80: exited on signal 11
Nov 1 15:34:01 ns kernel: pid 11660 (httpd), jid 0, uid 80: exited on signal 11
とか
[Mon Nov 01 15:17:04.847234 2021] [core:notice] [pid 8611:tid 34370711552] AH00052: child pid 11345 exit signal Segmentation fault (11)
[Mon Nov 01 15:34:00.449038 2021] [core:notice] [pid 8611:tid 34370711552] AH00052: child pid 10484 exit signal Segmentation fault (11)
[Mon Nov 01 15:34:02.496973 2021] [core:notice] [pid 8611:tid 34370711552] AH00052: child pid 11660 exit signal Segmentation fault (11)
とか、出力されております。
微妙に時刻が違いますが、おそらくは、同じタイミングで、出力されたものです。
2. 設定
まずは、記憶をたどりながら、「core」を出力する設定から・・・。
「httpd.conf」に
CoreDumpDirectory /tmp
の行があることを確認(なければ追加)。
「ulimits」の値を確認(ちゃいな個所は割愛)
$ ulimit -a | grep core
core file size (512-blocks, -c) unlimited
「root」ユーザ権限で、「kern.sugid_coredump」の値を確認して変更
$ sysctl kern.sugid_coredump
kern.sugid_coredump: 0
$ sysctl kern.sugid_coredump=1
kern.sugid_coredump: 0 -> 1
3. gdb
「core」をはかせるところまでは、行ったのですが、ふと気づきました。
「FreeBSD 12.2 RELEASE」のマシンなのですが、これは、デフォルトの「C」が、「clang」で、「gdb」はない。
あわくってインストールします。
cd /usr/ports/devel/gdb
make config
オプションは、デフォルトのままで・・・。
cd /usr/ports/devel/gdb
make
make install
4. core
では、「core」を見てみます(主要な部分のみ記載)。
gdb httpd /tmp/httpd.core
で「where」を見てみると
#0 0x00000008007f48fa in _read () from /lib/libc.so.7
#1 0x000000080061fb06 in ?? () from /lib/libthr.so.3
#2 0x0000000000276cd0 in ap_mpm_podx_check ()
#3 0x0000000800bcbbdd in ?? () from /usr/local/libexec/apache24/mod_mpm_event.so
#4 0x0000000800bcb6d1 in ?? () from /usr/local/libexec/apache24/mod_mpm_event.so
#5 0x0000000800bcad09 in ?? () from /usr/local/libexec/apache24/mod_mpm_event.so
#6 0x000000000026f3db in ap_run_mpm ()
#7 0x000000000025c82c in main ()
うむ、「MPM」がらみだな、やはり。
スレッドのライブラリで落ちているように見えます。
5. 解決
実は、これ、結局「PHP」の問題だったようです。
[02-Nov-2021 09:26:57 Asia/Tokyo] PHP Deprecated: Unknown: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
[02-Nov-2021 09:26:58 Asia/Tokyo] PHP Deprecated: Unknown: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
調べてみると「php.ini」の「mbstring.internal_encoding」という設定をしていると、非推奨であるために、出力されているということで、その設定をやめなさいと書いてあります。
「FreeBSD - メンテナンス・トラブルシュート - PHP」にオチが書いてあるのですが。
「.htaccess」に、下記の行が書いてあるものがありました。
php_value mbstring.internal_encoding UTF-8
php_flag mbstring.encoding_translation Off
このあたりの機能が、「PHP 5.6」くらいで非推奨になって、「PHP 8.0」では、機能が完全に削除されているようです。
ここからは、単なる推理ですが、削除された機能を使って、マルチバイト文字の処理を行う際に、文字数の計算をまちがっていて、バッファオーバーランか何かでこけているようです。
該当の個所をコメントアウトしたら、現象はなくなりました。
珍しく、解決までいきました。