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理日志。 以下是这样做的步骤。
-
打开
/etc/php5/fpm/pool.d/www.conf
:$ sudo nano /etc/php5/fpm/pool.d/www.conf
-
取消注释以下两行
;
在行首:;php_admin_value[error_log] = /var/log/fpm-php.www.log ;php_admin_flag[log_errors] = on
-
创build
/var/log/fpm-php.www.log
:$ sudo touch /var/log/fpm-php.www.log;
-
更改
/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
和看第一列。 -
重新启动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/