概要
WordPress + nginx + PHP-FPMという構成でPHP 7.1を使用すると、xmlrpc.phpへのアクセスでPHP-FPMの子プロセスがクラッシュ(segfault)する。
発生条件と、解決法を簡単にメモする。
問題の内容
WordPressのxmlrpc.phpに対してPOSTアクセスがあると、PHP-FPMの子プロセスがsegfaultでクラッシュする。
このxmlrpc.phpへのアクセスはスパムなどによるものではなく、JetPackプラグインのサイト統計情報を表示したりするものである。
例えば、WordPressの管理画面のダッシュボードでサイト統計情報を表示するようにしていれば、管理画面を開くたびにPHP-FPMがクラッシュする。
なお、PHP-FPMの子プロセスはすぐに再起動して待ち受け状態になり、Webサーバー自体は特に問題なく使用し続けられる。
各種ログ
- nginx access.log
xmlrpc.phpへのアクセスには502(Bad Gateway)で応答。 - nginx error.log
nginxのエラーログにはPHP-FPMのエラーが記録されている。 - PHP-FPM error.log
PHP-FPMのエラーログには大した情報がなく、子プロセスの終了と起動だけが記録されている。
サーバー構成
WordPress(4.7.2) + nginx(1.10.2) + PHP-FPM(7.1.1)
その他
PHPが7.0系のときには発生しておらず、7.1系にアップデートした後に発生。
原因と解決方法
PHP 7.1が出て間もないせいか、検索しても有益な情報が少ないが、Upgrading to PHP 7.1 - erick t. hitterに記載されていることが、まさに同様の情報。
原因
PHP 7.1のOpcacheとxmlrpc.phpを組み合わせて使用すると問題が発生する(どちらが悪いのかは不明)。
解決方法
xmlrpc.phpでOpcacheを使わないようにする。
解決方法1:xmlrpc.phpを書き換え
ファイル冒頭部分にPHP実行時にOpcacheを使わないオプション値を設定する。
↓
解決方法2:nginxの設定ファイルを変更
xmlrpc.phpへアクセスがあった際、Opcacheを使用しないオプション値をPHP-FPMへ渡す。
(この方法だと、Opcacheが一旦Disabledになってしまうと、Enabledに戻らない?)
その他、注意など
- xmlrpc.phpを書き換える際、ファイルの所有者が変わらないように注意。
パーミッションの関係で、WordPressのアップデートに失敗することがある。
更新情報
2017年4月23日
”その他、注意など”の項目を追加。