PHP-FPM 不会写入错误日志

我刚刚安装了一个 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 脚本并运行,并在浏览器上看到错误输出。另外,nginx 错误日志用相同的消息声明 fpm 的 stderr 输出。我检查了用户是否对指定的日志文件夹具有写权限(我甚至尝试了777)。即使是指定的 error.log 文件也已经由 php-fpm 成功创建。然而,日志文件总是空的,无论 php 脚本出现什么离谱的错误。

发生什么事了?

[找到了原因,相当一段时间后]

这是许可。改变了网站的所有者为网站的用户解决了这个问题。

365647 次浏览

在 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

这对我很有效:

; 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

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

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

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

取消下面这句话的注释:

catch_workers_output

这将允许 PHP stderr 转到 php-fpm 的错误日志,而不是/dev/null。

我有一个类似的问题,必须对 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-fpm 日志被写到 /var/log/upstart/php5-fpm.log之前,我纠结了很长一段时间。它似乎是 upstart 和 php-fpm 交互方式之间的一个 bug。点此查看更多内容: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595

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

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

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

为了解决这个问题,您可以配置 fpm(Net fpm 配置)来管理日志。

  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 ; php _ admin _ Flag [ log _ error ] = on

  3. 创建 /var/log/fpm-php.www.log:

    $sudo touch/var/log/fpm-php

  4. 更改 /var/log/fpm-php.www.log的所有权,以便 php5-fpm 可以编辑它:

    $sudo chown 漂泊者/var/log/fpm-php. www.log

    注意: vagrant是我需要给予所有权的用户。通过运行 $ ps aux | grep php.*www并查看第一列,您可以看到这应该是什么用户。

  5. 重新启动 php5-fpm:

    $sudo 服务 php5-fpm 重新启动

现在您的日志将在 /var/log/fpm-php.www.log中。

在我的示例中,我显示错误日志转到 /var/log/php-fpm/www-error. log。所以我在/etc/php-fpm 中注释了这一行。译者: pestwave

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”的 Owner 目录

你可以这样做:

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

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

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

fastcgi_intercept_errors on;

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

它可能隐藏在某个包含的 conf 目录中,比如我的软呢帽中的 /etc/nginx/default.d/php.conf

在我的例子中,由于缺少 php-mysql 模块,php-fpm 在没有任何日志记录的情况下输出500个错误。我把 Joomla 的安装移到了另一个服务器上,然后就忘了。所以 apt-get install php-mysql和服务重启解决了这个问题。

我开始尝试修复破损的日志记录,但没有成功。最后使用 strace,我发现在与 db 相关的系统调用之后出现了故障消息。虽然我的案子和行动组的问题没有直接关系,但我希望能有所帮助。

在使用 php8的 alpine 3.15上,我在/var/log/php8/error.log 上找到了 i

/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