PHP 7.1でxmlrpc.phpにアクセスがあると、PHP-FPMがクラッシュする

概要

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)で応答。
    "POST /xmlrpc.php?for=jetpack&token=HOGEHOGE HTTP/1.1" 502 166 "https://example.hostname/xmlrpc.php?for=jetpack&token=HOGEHOGE" "Jetpack by WordPress.com" "-" :-"
  • nginx error.log
    nginxのエラーログにはPHP-FPMのエラーが記録されている。
    [error] 15222#15222: *15979 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.0.112.80, server: , request: "POST /xmlrpc.php?for=jetpack&token=HOGEHOGE HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "example.hostname", referrer: "https://example.hostname/xmlrpc.php?for=HOGEHOGE"
  • PHP-FPM error.log
    PHP-FPMのエラーログには大した情報がなく、子プロセスの終了と起動だけが記録されている。
    WARNING: [pool www] child 12475 exited on signal 11 (SIGSEGV - core dumped) after 2.779686 seconds from start
    NOTICE: [pool www] child 12490 started

サーバー構成

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を使わないオプション値を設定する。

<?php
/**
 * XML-RPC protocol support for WordPress

<?php
ini_set( 'opcache.enable', 0 ); // Opcacheを使わない
/**
 * XML-RPC protocol support for WordPress
解決方法2:nginxの設定ファイルを変更

xmlrpc.phpへアクセスがあった際、Opcacheを使用しないオプション値をPHP-FPMへ渡す。

(この方法だと、Opcacheが一旦Disabledになってしまうと、Enabledに戻らない?)

location = /xmlrpc.php {
    fastcgi_param PHP_ADMIN_VALUE "opcache.enable=0"; # Opcacheを使わない
    include fastcgi.conf;
}

その他、注意など

  • xmlrpc.phpを書き換える際、ファイルの所有者が変わらないように注意。
    パーミッションの関係で、WordPressのアップデートに失敗することがある。

更新情報

2017年4月23日
”その他、注意など”の項目を追加。

著者

西尾 健(にしお たけし)
石川県金沢市在住の素人フォトグラファー。
ダメ人間で写真が好き。フィルムの魅力に引き込まれ、フィルムで撮り続ける日々。
このWebサイトでは、主に自分用のメモと記録を、写真と文を交えて記事にしています。

コメントを残す

*印の項目は必ず入力して下さい。