【问题标题】:PHP-FPM doesn't write to error logPHP-FPM 不写入错误日志
【发布时间】:2012-01-30 10:33:42
【问题描述】:

我刚刚安装了一个 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 日志在 tail /var/log/hhvm/error.log
  • 这里有同样的问题。好像访问和慢日志需要不同的权限,所以文件夹是用root-755创建的。

标签: php


【解决方案1】:

在您的 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?只是猜测。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    fastcgi_intercept_errors on;
    

    移除这条线结束了许多小时的挣扎和拉扯头发。

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

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,必须对 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,恢复日志记录。

      【讨论】:

      • 确实是这样!我什至在出错后立即在网站上出现了一些进一步的内容:)
      • 非常感谢!这是我在 Ubuntu 14.04.1 (Jessie) 上的解决方案,如果它对其他人有帮助的话。
      • vagrant/debian wheezy 环境中的一些问题。
      • 其他路径,比如/var/log/,只是浪费时间。
      • 为什么?!这在 fpm-php7 上仍然是一个问题。
      【解决方案5】:

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

      因此,如果您使用 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”仍然是空的。有什么想法吗?
      • 打印你的phpinfo(),看看这些设置是否真的被采纳了,@SudharshanNair。
      • @Gezim。感谢您的回复。我的错误日志路径是/var/log/fpm-php.www.log。这个文件还是空的
      • @SudharshanNair,如果打开了log_errors 错误,唯一需要检查的是文件的权限和所有权(步骤 4)。
      • 确保www-data 是运行fpm 进程的用户:ps aux | grep php.*www。我没有其他想法。梳理phpinfo()的输出。
      【解决方案6】:

      查看“PHP-FPM”的Owner目录

      你可以这样做:

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

      【讨论】:

      • 永远不要将 /var/log/php-fpm 设置为 777,你只是让你的服务器容易受到符号链接攻击(如果不是更糟的话)
      【解决方案7】:

      在我的例子中,我表明错误日志将发送到 /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 指定的文件中看到日志了。

      【讨论】:

        【解决方案8】:

        在发现我的 php-fpm 日志被写入/var/log/upstart/php5-fpm.log 之前,我为此苦苦挣扎了很长时间。这似乎是暴发户和 php-fpm 交互方式之间的错误。在此处查看更多信息:https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595

        【讨论】:

        • 谢谢!!这对我来说是关键。我最终对这两个文件进行了符号链接,因为我知道我以后不会记住这一点:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
        • PHP 太混乱了...有一个预先创建的/var/log/php7.0-fpm.log 所以,php_admin_value[error_log] = /var/log/fpm-php.www.log 会重定向到非标准日志??
        【解决方案9】:

        这对我有用:

        ; 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

        【讨论】:

        • 在什么配置文件中? php.ini? php-fpm.conf?。我在/etc/php-fpm.d/www.conf 中取消了它的注释
        • 在 Ubuntu 14 上,该文件位于 /etc/php5/fpm/pool.d/www.conf
        • 我想问题是这个难以捉摸的“主要错误日志”在哪里......哦,我明白了,这是同一个配置文件中php_admin_value[error_log] 的值 - /var/log/php -fpm/www-error.log 在 CentOS 7 上,例如
        • sudo vi /etc/php/7.0/fpm/pool.d/www.conf 给我
        • 这对我来说是正确的方式,在 Debian 9.1 和 PHP-FPM 7.0 上
        【解决方案10】:

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

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

        取消注释以下内容的行:

        catch_workers_output
        

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

        【讨论】:

        • 对于使用 docker 的用户,您的配置文件位于:/usr/local/etc/php-fpm.d/
        • 有了这个conf,日志到哪里去了,/var/log/php7.0-fpm.log/var/log/fpm-php.www.log或其他?
        • 它在哪里登录?
        • 滚动到 www.conf 文件的底部 - php_admin_value[error_log] 的值显示日志将写入的位置
        【解决方案11】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-11
          • 2016-09-01
          • 2015-03-05
          • 2018-05-26
          • 1970-01-01
          • 1970-01-01
          • 2019-04-24
          相关资源
          最近更新 更多