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 2015年

这里同样的问题。似乎访问日志和慢日志需要不同的权限,因此该文件夹是使用root-755创建的。
烤饼

Answers:


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 ,例如
布拉德·皮博迪

7
sudo vi /etc/php/7.0/fpm/pool.d/www.conf对我来说
Collin Anderson

这对我来说是正确的方法,在Debian 9.1和PHP-FPM 7.0上
Antwane

79

在找到我的php-fpm日志写入之前,我为此苦了很长时间/var/log/upstart/php5-fpm.log。这似乎是新贵和php-fpm之间互动的错误。在此处查看更多信息:https : //bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595


11
谢谢!!这是我的关键。我结束了两个文件的符号链接,因为我知道以后再也不会记住它了:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
njbair 2015年

PHP是如此混乱...有一个预先创建的/var/log/php7.0-fpm.logphp_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 2014年

非常感谢!如果对其他人有用,这就是在Ubuntu 14.04.1(Jessie)上为我解决的解决方案。
威廉·特雷尔

在无业游民/ debian狂躁的环境中存在一些问题。
Xosofox

其他路径,例如/ var / log /,只是浪费时间。
PedroGóes16

1
为什么?!在fpm-php7上这仍然是一个问题。
user1634074

31

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

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

取消注释以下行:

catch_workers_output

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


2
对于那些使用docker的用户,您的配置文件位于:/usr/local/etc/php-fpm.d/
Edward

有了这个conf,at /var/log/php7.0-fpm.log,at /var/log/fpm-php.www.log或其他位置的日志在哪里?
彼得·克劳斯

它登录到哪里?
维克多·乔拉斯

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. 通过删除;该行的开头来取消注释以下两行:(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


我试过了,“ fpm-php.www.log”仍然为空。任何想法?
Sudharshan Nair

打印您的文件,phpinfo()并查看@SudharshanNair是否确实获取了这些设置。
Gezim '18年

@Gezim。感谢您的回复。我的错误日志路径是/var/log/fpm-php.www.log。这个文件仍然是空的
Sudharshan Nair 18'Aug

@SudharshanNair,如果log_errors打开了错误,则要检查的唯一另一件事是文件的许可权和所有权(步骤4)。
Gezim '18年

@Gezim。我已将777的权限和所有权授予www-data:www-data,仍然没有运气。任何想法 ?
Sudharshan Nair

14

从v5.3.9起直到现在(5.3.14和5.4.4),php-fpm中都有一个错误https://bugs.php.net/bug.php?id=61045。开发人员承诺的修复程序将在下一个版本中发布。如果您不想等待,请在该页面上使用补丁程序,然后重新构建或回滚到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

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;

删除该行已结束了许多小时的挣扎和拉扯头发。

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


-1

在我的情况下,由于缺少php-mysql模块,php-fpm输出500错误而没有任何日志记录。我将joomla安装移至另一台服务器,却忘记了。这样apt-get install php-mysql,服务重启就解决了。

我首先尝试解决不成功的日志记录问题。最终,strace在与数据库相关的系统调用之后,我发现了失败消息。尽管我的案子与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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.