技術情報

WordPressのnginx + php-fpm環境でデバッグログ(debug.log)が出ない件

2017.06.09


php-fpmの設定

忙しい方のために最初に結論です。nginx + php-fpm環境でwordpressを運用している方で、wp-config.php内で

define( 'WP_DEBUG_LOG', true );

を設定しても どうしてもdebug.logがでない方は、下記php-fpmの設定ファイル、

/etc/php-fpm.d/www.conf

※ 上記パスはCentOS7.3の例です。

の中の下の方にあるerror_logを設定している部分にて、

php_admin_value[error_log] = /var/log/php-fpm/www-error.log

php_admin_valueを下記のようにphp_value

  php_value[error_log] = /var/log/php-fpm/www-error.log

と変更して、php-fpmをリロードしてみてください。wordpress 内で ini_set( ‘error_log’ ..) が効くようになり、debug.log出力できるようになるはずです。

wordPressでのエラーログ

wordpressのテーマやプラグインを開発する時には DEBUGオプションをtrueにしておく事が推奨されています。この設定はwp-config.php内で、下記のようにデフォルトではfalseとなっているWP_DEBUGオプションをtrueに設定します。

define('WP_DEBUG', true);

すると、画面上にプログラム実行上のエラーや警告はもちろん、Notice(通知)レベルの情報も表示してくれます。

例えば、少しテーマ開発の経験のある方ならよくご存じの サイトトップのurlを返してくれる関数、

get_bloginfo('home')書いているテーマがあると、、

PHP Notice:  get_bloginfo がバージョン 2.2.0 から非推奨になった引数付きで呼び出されました。関数 bloginfo() のオプション home は非推奨です。....

と表示してくれます。

画面でこんなメッセージがたくさん表示されると非常に見ずらいので、ログファイルに書き出してもらうようにするオプションがあります。

define('WP_DEBUG', true);
define( 'WP_DEBUG_DISPLAY', false ); /* 画面に表示しない */
define( 'WP_DEBUG_LOG', true );      /* ログ出力を /wp-content/debug.log に */

詳しくはこちら「WordPressでのデバッグ」を参照してください。

さて、ここまでで、debug.logにメッセージが出力されている方はなんの問題もないのですが、
nginx + php-fpmを使っている方はここで悩むことになります。

apacheではパーミッションの問題で書き込んでくれない事があるのですが、その辺りを
解決したとしても、debug.logには書き込んでくれませんでした。

WP_DEBUG_LOGオプションで実行する部分は、

wp-includes/load.phpwp_debug_mode()関数内

ini_set( 'error_log', WP_CONTENT_DIR . '/debug.log' );

の部分です。この部分がきちんとできれば良いのですが、テーマファイルの適当な所で、


としても何故か /var/log/php-fpm/www-error.logと表示されてしまいます。

試しに以下のようなerror_logにファイルパスをセットして、そのセットした値を表示するだけのスクリプトを実行してみてください。

<?php
ini_set( 'error_log', '/home/hoge/wp-content/debug.log' );
echo ini_get( 'error_log' );

出力は残念ながらセットされていません。

セットしたい環境変数が自前のスクリプト内で設定できるかできないかは、

にあります。

error_log は PHP_INI_ALL ですので、本来であれば自分のプログラム内で
ini_setで設定できるはずです。

実はこれはphp-fpm側の設定に問題がありました。

デフォルトのまま使用すると、以下のような設定になります。

php_admin_value[error_log] = /var/log/php-fpm/www-error.log

このphp_admin_valueで設定すると、スクリプト内のini_setで設定できなくなってしまいます。

参考: 設定を変更するには

そこで冒頭て説明したphp_admin_valuephp_value に変更してあげれば、めでたくdebug.logが出力されるようになります。

デフォルトでこのような設定になっているというのは何か理由がありそうですが、残念ながら調べても出てきませんでした。

速度やセキュリティによる事情があるかもしれませんので、本番環境ではこの設定はしない方が無難かとおもわれます。

もし本番中に何かlogを出したくなったら、、下のプラグインを使ってみてください。(笑)

WordPressにプラグインを入れて高機能にしていくと今度はスピードが気になってきます。それに伴い、nginxを採用するようになってきました。WordPressが速いと評判のKUSANAGIでもnginxがデフォルトになっています。

nginxでwordpressを動かしていて、つまずいた時にお役に立てれば幸いです。