PHP
Linux
MySQL
Apache
logrotate

php-pecl-mysql-xdevapiをインストールするとApacheのリロードに失敗する問題


はじめに

PHPのモジュールで、php-pecl-mysql-xdevapiをインストールしてから

Apacheが決まった時間帯に勝手に落ちる現象が発生していたので

その原因と対策について投稿してみます。


環境

CentOS Linux release 7.6.1810 (Core)

Server version: Apache/2.4.6 (CentOS)

PHP 7.3.5 (cli)


決まった時間に落ちるのでcronを確認

/var/log/cron をみてみる。

run-parts(/etc/cron.daily)[21871]: starting logrotate

run-parts(/etc/cron.daily)[21891]: finished logrotate

cron.dailyでlogrotateが動いている。

/var/log/httpd/配下のログを確認すると、Apacheが落ちるタイミングで

ログがローテートされている。


ログローテート設定の確認

/var/logrotate.d/httpd の中身を確認してみると

/var/log/httpd/*log {

missingok
notifempty
sharedscripts
compress
delaycompress
postrotate
create 0644
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}

ログローテートの際に、systemctl reload httpd が実行されている。

リロードの際にApacheが落ちてる模様


Apacheのログを確認

落ちた時間付近の /var/log/httpd/error_log に気になるログが...

PHP Fatal error:  Class mysql_xdevapi\\XSession cannot extend from interface CURLMOPT_MAXCONNECTS in Unknown on line 0

[core:notice] [pid 17512] AH00060: seg fault or similar nasty error detected in the parent process

php-pecl-mysql-xdevapiが原因っぽいログがでてる。

どうやらこのモジュールが原因でリロードした際にApacheが起動してこない模様


Apacheをリロードしてみる

systemctl reload httpd

やはりApacheが起動してこない...

ログをみると先ほど出ていたログと同様のログがでてる。


php-pecl-mysql-xdevapiを削除してみる

yum remove php-pecl-mysql-xdevapi

削除!


再度Apacheをリロードしてみる

systemctl restart httpd

一回リスタートかけてリロード実施!

systemctl reload httpd

Apacheが落ちてない!

php-pecl-mysql-xdevapiをインストールした状態でApacheをリロードすると

Apacheが立ち上がらなくなる模様


対策

1.そもそもphp-pecl-mysql-xdevapiを使用しない

2.restartなら問題なく起動するので

 /etc/logrotate.d/httpd のreload部分をrestartに変更することで

 問題なく起動する。

 ただし、ログローテートの度にApacheのリスタートが実施される。

3.ローテートの設定を下記のように、postrotateとendscriptの間を

 copytruncateに変更するとリロードなくログローテートが行える。

/var/log/httpd/*log {

missingok
notifempty
sharedscripts
compress
delaycompress
postrotate
copytruncate
endscript
}

copytruncateはリロードなくログローテートできるが、ローテート最中にきた

アクセスについては記録できないとのこと


おわりに

エンジニアになり1年たったので、たまにはこうやって記事書いたりしていこうと

思います。(たぶん)