PHP-FPM不写入错误日志


PHP-FPM doesn't write to error log

我刚刚安装了一个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)。php-fpm甚至已经成功创建了指定的error.log文件。然而,日志文件总是空的,不管php脚本中出现了什么离谱的错误。

怎么回事?

[过了好一会儿才发现原因]

这是许可。将owner改为网站的用户解决了问题

这对我有用:

; 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- fmp .d/www.conf

在发现php-fpm日志被写入/var/log/upstart/php5-fpm.log之前,我为此挣扎了很长时间。这似乎是upstart和php-fpm交互之间的一个bug。详见:https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595

我有一个类似的问题,不得不对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重新启动,日志记录被恢复。

有多个php配置文件,但这是你需要编辑的一个:

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

取消注释

catch_workers_output

将允许php stderr进入php-fpm的错误日志而不是/dev/null。

我从一堆答案中收集了一些见解,并提出了一个全面的解决方案:

所以,如果你用php5-fpm设置nginx,并使用error_log()记录一条消息,默认情况下你可以在/var/log/nginx/error.log中看到它。

如果您想使用error_log(print_r($myArr, true));记录大量数据(例如数组),可能会出现问题。如果数组足够大,nginx似乎会截断日志条目。

为了解决这个问题,你可以配置fpm (php.net fpm config)来管理日志。下面是这样做的步骤。
  1. 打开/etc/php5/fpm/pool.d/www.conf:

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

  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.log的所有权,以便php5-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 .

php-fpm从v5.3.9到现在(5.3.14和5.4.4)有一个bug https://bugs.php.net/bug.php?id=61045。开发人员承诺将在下一个版本中进行修复。如果你不想等待-使用补丁在该页重新构建或回滚到5.3.8。

在你的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

我想在现有的答案中添加另一个技巧,因为它们没有解决我的问题。

在你的php位置块中注意下面的nginx指令:

fastcgi_intercept_errors on;

删除这条线结束了许多小时的挣扎和拔头发。

它可以隐藏在一些包含的conf目录中,比如我的fedora中的/etc/nginx/default.d/php.conf

在我的例子中,我显示错误日志将转到/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指定的文件中看到日志了

在我的情况下php-fpm输出500错误没有任何日志记录,因为缺少php-mysql模块。我把joomla安装到另一台服务器上,然后忘记了它。因此,apt-get install php-mysql和服务重启解决了这个问题。

我开始尝试修复损坏的日志记录没有成功。最后使用strace,我在db相关的系统调用后发现了失败消息。虽然我的情况与op的问题没有直接关系,但我希望它能对您有所帮助。

在alpine 3.15上使用php8时发现/var/log/php8/error.log

/var/log/php8 # cat error.log
 16:10:52] NOTICE: fpm is running, pid 14
 16:10:52] NOTICE: ready to handle connections

我也有这个:

catch_workers_output = yes

查看"PHP-FPM"的Owner目录

你可以这样做:

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