PHP-FPM不写入错误日志

eid*_*ng8 154 php

我刚刚安装了一个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
Run Code Online (Sandbox Code Playgroud)

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我做了一个错误的PHP脚本并运行,并在Web浏览器上看到错误输出.此外,nginx错误日志使用相同的消息说明fpm的stderr输出.我检查用户是否已对指定的日志文件夹进行了写入(我甚至尝试过777).甚至指定的error.log文件也可以通过php-fpm成功创建.但是,无论从php脚本发出什么错误的错误,日志文件始终为空.

这是怎么回事?

[发现原因很久以后]

这是许可.将所有者更改为网站的用户解决了问题.

mic*_*lbn 183

这对我有用:

; 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
Run Code Online (Sandbox Code Playgroud)

编辑:

要编辑的文件是配置所需池的文件.默认情况下为:/etc/php-fpm.d/www.conf

  • 在Ubuntu 14上,该文件位于/etc/php5/fpm/pool.d/www.conf (14认同)
  • `sudo vi/etc/php/7.0/fpm/pool.d/www.conf` (7认同)
  • <strike>在什么配置文件中?php.ini中?PHP-fpm.conf?</击>.我在`/ etc/php-fpm.d/www.conf`中取消注释了它 (5认同)
  • 我想问题是这个难以捉摸的“主要错误日志”在哪里...哦,我知道了,它是同一配置文件中的php_admin_value [error_log]`的值-/ var / log / php-fpm / www- CentOS 7上的error.log,例如 (2认同)

Cod*_*der 78

在找到我的php-fpm日志之前,我在这方面挣扎了很长时间/var/log/upstart/php5-fpm.log.它似乎是upstart和php-fpm如何交互之间的错误.点击此处查看:https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595

  • 谢谢!!这对我来说很关键.我最终对两个文件进行了符号链接,因为我知道我以后不会记得这个:`ln -sf /var/log/upstart/php5-fpm.log/var/log/php5 -fpm.log` (11认同)

adn*_*ans 48

我遇到了类似的问题,不得不对pool.d/www.conf文件执行以下操作

php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
Run Code Online (Sandbox Code Playgroud)

它仍然没有写日志文件所以我实际上必须通过touch /var/log/fpm-php.www.log设置正确的所有者来创建它sudo chown www-data.www-data /var/log/fpm-php.www.log.

完成此操作后,重启php5-fpm,恢复日志记录.


vec*_*tor 30

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

/etc/php(version)?/fpm/pool.d/www.conf
Run Code Online (Sandbox Code Playgroud)

取消注释说:

catch_workers_output
Run Code Online (Sandbox Code Playgroud)

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

  • 对于那些使用docker的人,您的配置文件位于:/usr/local/etc/php-fpm.d/ (2认同)

Gez*_*zim 25

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

因此,如果您使用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.

  • 我试过了,“fpm-php.www.log”仍然是空的。任何想法? (3认同)

小智 14

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


khi*_*ari 6

在您的 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
Run Code Online (Sandbox Code Playgroud)


Ars*_*lum 5

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

请注意 php 位置块中的以下 nginx 指令:

fastcgi_intercept_errors on;
Run Code Online (Sandbox Code Playgroud)

去掉这条线就结束了数小时的挣扎和拉扯头发。

它可能隐藏在一些包含的conf目录中,就像/etc/nginx/default.d/php.conf我的fedora中一样。