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脚本并运行,并在Web浏览器上看到错误输出。 另外nginx错误日志说明从同一个消息fpm的stderr输出。 我已经检查用户有写(甚至已经尝试777)的权限到指定的日志文件夹。 甚至指定的error.log文件已经由php-fpm成功创build。 但是,无论php脚本发生了多大的错误,日志文件都是空的。

这是怎么回事?

[稍后find原因]

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

这对我工作:

 ; 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 

编辑:

要编辑的文件是configuration所需池的文件。 默认是:/etc/php-fpm.d/www.conf

在find我的php-fpm日志写入/var/log/upstart/php5-fpm.log之前,我苦苦挣扎了很久。 这似乎是如何新贵和php-fpm交互之间的一个错误。 在这里查看更多: 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创build它,然后设置正确的所有者sudo chown www-data.www-data /var/log/fpm-php.www.log

一旦完成,php5-fpm重新启动,日志恢复。

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

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

取消注释:

 catch_workers_output 

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

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

我从这里收集了大量的答案,并提出了一个全面的解决scheme:

所以,如果你用php5-fpm设置nginx并使用error_log()logging消息,你可以在/var/log/nginx/error.log默认看到它。

如果你想使用error_log(print_r($myArr, true));logging大量数据(比如数组),就会出现问题error_log(print_r($myArr, true)); 。 如果一个数组足够大,看来nginx会截断你的日志条目。

为了解决这个问题,你可以configurationfpm来pipe理日志。 以下是这样做的步骤。

  1. 打开/etc/php5/fpm/pool.d/www.conf

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

  2. 取消注释以下两行; 在行首:

    ;php_admin_value[error_log] = /var/log/fpm-php.www.log ;php_admin_flag[log_errors] = on

  3. 创build/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来看到这个用户应该是什么 $ ps aux | grep php.*www和看第一列。

  5. 重新启动php5-fpm:

    $ sudo service php5-fpm restart

现在你的日志将在/var/log/fpm-php.www.log

在您的fpm.conf文件中,您没有设置仅用于错误logging的2个variables

这个variables是error_log(错误日志文件的文件path)log_level(错误日志级别)

; 错误日志文件; 注意:默认的前缀是/ usr / local / php / var; 默认值:log / php-fpm.log

 error_log = log/php-fpm.log 

; 日志级别; 可能的值:警报,错误,警告,通知,debugging; 默认值:通知

 log_level = notice 

在我的情况下,我显示错误日志是去/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”的所有者目录

你可以做:

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