PHP-FPMはエラーログに書き込みません


161

nginx + php-fpmサーバーをインストールしました。PHP-FPMがログにエラーを書き込まないことを除いて、すべてが正常に見えます。

fpm.conf

[default]
listen = /var/run/php-fpm/default.sock
listen.allowed_clients = 127.0.0.1
listen.owner = webusr
listen.group = webusr
listen.mode = 0666
user = webusr
group = webusr
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.status_path = /php/fpm/status
ping.path = /php/fpm/ping
request_terminate_timeout = 30s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/default/slow.log
chroot = /var/www/sites/webusr
catch_workers_output = yes
env[HOSTNAME] = mapsvr.mapking.com
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/php-fpm/default/error.log
php_admin_flag[log_errors] = on

nginx.conf

server
{
  listen        80 default_server;
  server_name   _;

  charset       utf-8;
  access_log    /var/log/nginx/access.log rest;

  include       conf.d/drops.conf.inc;

  location      /
  {
    root        /var/www/sites/webusr/htdocs;
    index       index.html index.htm index.php;
  }

  # pass the PHP scripts to FastCGI server listening on socket
  #
  location      ~ \.php$
  {
    root           /var/www/sites/webusr/htdocs;
    include        /etc/nginx/fastcgi_params;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME /htdocs/$fastcgi_script_name;
    if (-f $request_filename)
    {
      fastcgi_pass   unix:/var/run/php-fpm/default.sock;
    }
  }

  location      = /php/fpm/status
  {
    include        /etc/nginx/fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass   unix:/var/run/php-fpm/default.sock;
  }

  location      = /php/fpm/ping
  {
    include        /etc/nginx/fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass   unix:/var/run/php-fpm/default.sock;
  }

  # redirect server error pages to the static page /50x.html
  #
  error_page    500 502 503 504  /50x.html;
  location      = /50x.html
  {
    root        /usr/share/nginx/html;
  }
}

エラーのあるphpスクリプトを作成して実行すると、Webブラウザーにエラー出力が表示されます。また、nginxエラーログには、fpmからのstderr出力が同じメッセージで示されます。ユーザーが指定されたログフォルダーへの書き込み権限(私は777も試しました)を持っていることを確認しました。指定されたerror.logファイルでさえ、php-fpmによって正常に作成されています。ただし、phpスクリプトから発生したとんでもないエラーに関係なく、ログファイルは常に空です。

どうしたの?

[しばらくして理由がわかりました]

許可でした。所有者をサイトのユーザーに変更して問題を解決しました。


問題のあるphpのバージョンはv5.3.9とv5.3.14の間です(今日と同様)。v5.3.15およびv5.4.5以降で機能するはずです。
アントンバベンコ

hhvm + php-fpmをhomesteadで使用している場合、ログは末尾にあります/var/log/hhvm/error.log
astroanu

ここでも同じ問題。アクセスと遅いログは異なる許可を必要とするようです、したがってフォルダーはroot-755で作成されます。
2017年

回答:


190

これは私のために働きました:

; Redirect worker stdout and stderr into main error log. If not set, stdout and
; stderr will be redirected to /dev/null according to FastCGI specs.
; Default Value: no
catch_workers_output = yes

編集:

編集するファイルは、目的のプールを構成するファイルです。デフォルトでは/etc/php-fpm.d/www.conf


5
<strike>どの構成ファイルにありますか?php.ini?php-fpm.conf?</ strike>。私の中でコメントを外しました/etc/php-fpm.d/www.conf
Swivel

16
Ubuntu 14では、このファイルは/etc/php5/fpm/pool.d/www.confにあります
Gilberto Albino

2
私はああ、私が見る、それはの価値だ...このとらえどころのない「メインエラーログ」はここで、その後の質問は推測php_admin_value[error_log]CentOSの7上の/var/log/php-fpm/www-error.log -その同じ設定ファイルでは、 、例
Brad Peabody 2017

7
sudo vi /etc/php/7.0/fpm/pool.d/www.conf私のために
コリンアンダーソン

Debian 9.1とPHP-FPM 7.0では、これは正しい方法でした
Antwane '30

79

私のphp-fpmログがに書き込まれているのを見つける前に、私はこれに長い間苦労しました/var/log/upstart/php5-fpm.log。upstartとphp-fpmの相互作用のバグのようです。詳細はこちら:https : //bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595


11
ありがとう!! これは私にとって鍵でした。私は後でこれを覚えておくつもりはない知っているので、私は2つのファイルをシンボリックリンク終わった:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
njbair

PHPはとても混乱しています...事前に作成されている/var/log/php7.0-fpm.logので、php_admin_value[error_log] = /var/log/fpm-php.www.log非標準のログにリダイレクトしますか?
ピータークラウス

53

私は同様の問題があり、pool.d/www.confファイルに対して次のことを行わなければなりませんでした

php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on

それでもログファイルは書き込まれていなかったため、実際にtouch /var/log/fpm-php.www.log正しい所有者を設定してログファイルを作成する必要がありましたsudo chown www-data:www-data /var/log/fpm-php.www.log

これが行われ、php5-fpmが再起動すると、ロギングが再開されました。


それは実際にそうでした!エラーの直後にさらにコンテンツがサイトに表示されました:)
holms

これを本当にありがとう!これは、Ubuntu 14.04.1(Jessie)で私が他の人を助ける場合の解決策でした。
ウィリアム・タレル2015

vagrant / debian wheezy環境での問題。
Xosofox 2016年

/ var / log /などの他のパスは、時間の無駄です。
PedroGóes16年

1
なぜ?!これはまだfpm-php7の問題です。
user1634074

31

複数のphp設定ファイルがありますが、これは編集する必要があるファイルです。

/etc/php(version)?/fpm/pool.d/www.conf

次の行のコメントを外します。

catch_workers_output

これにより、PHPのstderrが/ dev / nullではなくphp-fpmのエラーログにアクセスできるようになります。


2
お使いの設定ファイルが置かれているドッキングウィンドウを使用して人のために:/usr/local/etc/php-fpm.d/
エドワード・

で、ログを行くこのconfに、と/var/log/php7.0-fpm.logで、 /var/log/fpm-php.www.logまたは他の?
Peter Krauss、

どこにログインしますか?
Viktor

26

私はここで多数の回答から洞察を集め、包括的なソリューションを提示します。

したがって、php5-fpmを使用してnginxをセットアップし、メッセージをログに記録するerror_log()と、/var/log/nginx/error.logデフォルトでそれを表示できます。

を使用して大量のデータ(配列など)をログに記録する場合は、問題が発生する可能性がありますerror_log(print_r($myArr, true));。配列が十分に大きい場合はnginx、ログエントリが切り捨てられるようです。

これを回避するには、ログを管理するように構成fpmphp.net fpm config)できます。これを行う手順は次のとおりです。

  1. オープン/etc/php5/fpm/pool.d/www.conf

    $ sudo nano /etc/php5/fpm/pool.d/www.conf

  2. ;の先頭を削除して、次の2行のコメントを外します(error_logはここで定義されています:php.net

    ;php_admin_value[error_log] = /var/log/fpm-php.www.log ;php_admin_flag[log_errors] = on

  3. 作成/var/log/fpm-php.www.log

    $ sudo touch /var/log/fpm-php.www.log;

  4. /var/log/fpm-php.www.logphp5-fpmが編集できるように所有権を変更します。

    $ sudo chown vagrant /var/log/fpm-php.www.log

    注:vagrantは、所有権を付与する必要があるユーザーです。実行$ ps aux | grep php.*wwwして最初の列を見ると、これがどのユーザーであるかがわかります。

  5. php5-fpmを再起動します。

    $ sudo service php5-fpm restart

これで、ログはにあります/var/log/fpm-php.www.log


試しましたが、まだ「fpm-php.www.log」が空です。何か案が?
Sudharshan Nair

印刷してphpinfo()、これらの設定が実際に適用されているかどうかを確認します(@SudharshanNair)。
Gezim

@Gezim。お返事をありがとうございます。エラーログのパスは/var/log/fpm-php.www.logです。それでもこのファイルは空です
Sudharshan Nair

@SudharshanNair、log_errorsエラーがオンになっている場合、チェックする他の唯一のものは、ファイルの許可と所有権です(ステップ4)。
Gezim、

@Gezim。私は777のアクセス許可と所有権をとして与えましたがwww-data:www-data、まだ運がありません。何か案が ?
Sudharshan Nair

14

バグがありhttps://bugs.php.net/bug.php?id=61045 v5.3.9からのphp-FPMで、現在(5.3.14と5.4.4)まで。開発者は修正を約束し、次のリリースで公開される予定です。待ちたくない場合は、そのページのパッチを使用して、再ビルドするか、5.3.8にロールバックしてください。


4

fpm.confファイルで、エラーロギング専用の2つの変数を設定していません。

変数はerror_log(エラーログファイルのファイルパス)とlog_level(エラーログレベル)です。

; Error log file
; Note: the default prefix is /usr/local/php/var
; Default Value: log/php-fpm.log

error_log = log/php-fpm.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice

log_level = notice

/usr/local/var/php代わりにデフォルトではありません/usr/local/php/varか?ただ推測する。
n611x007 2015

2

私の場合、エラーログが/var/log/php-fpm/www-error.logに送られていることを示しています。/etc/php-fpm.d/www.confのこの行にコメントしました

php_flag[display_errors]   is commented
php_flag[display_errors] = on  log will be at /var/log/php-fpm/www-error.log

上記のように、この行もコメント解除しました

catch_workers_output = yes

これで、nginxで指定されたファイルのログを確認できます。


0

問題が解決しなかったため、既存の回答に別のヒントを追加したいと思います。

PHPのロケーションブロックで次のnginxディレクティブに注意してください。

fastcgi_intercept_errors on;

この線を取り除くことは、髪を悩ませたり引っ張ったりする何時間もの終わりをもたらしました。

それは/etc/nginx/default.d/php.conf私のfedoraのようにいくつかの含まれているconfディレクトリに隠される可能性があります。


-1

私の場合、php-mysqlモジュールが見つからないため、php-fpmはログを記録せずに500エラーを出力します。joomlaのインストールを別のサーバーに移動しましたが、忘れていました。したがってapt-get install php-mysql、サービスの再起動で解決しました。

壊れたログを修正しようとして成功しませんでした。最後に、stracedb関連のシステムコールの後に失敗メッセージが見つかりました。私のケースは直接opの質問とは関係ありませんが、それが役に立つことを願っています。


-4

「PHP-FPM」のオーナーディレクトリを確認

できるよ:

ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/

5
/ var / log / php-fpmを777に設定しないでください。サーバーがシンボリックリンク攻撃に対して脆弱になっただけです(悪化していない場合)
Luca Gibelli
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.