ウェブサーバ - apache がこける - その3

クラウディア 
1. 概要
2. 設定
3. gdb
4. core
5. 解決

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」では、機能が完全に削除されているようです。  ここからは、単なる推理ですが、削除された機能を使って、マルチバイト文字の処理を行う際に、文字数の計算をまちがっていて、バッファオーバーランか何かでこけているようです。  該当の個所をコメントアウトしたら、現象はなくなりました。  珍しく、解決までいきました。
ハイスピードプラン