我刚刚安装了一个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)。php-fpm甚至已经成功创建了指定的error.log文件。然而,日志文件总是空的,不管php脚本中出现了什么离谱的错误。
怎么回事?
[过了好一会儿才发现原因]
这是许可。将owner改为网站的用户解决了问题
这对我有用:
; 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- fmp .d/www.conf
在发现php-fpm日志被写入/var/log/upstart/php5-fpm.log
之前,我为此挣扎了很长时间。这似乎是upstart和php-fpm交互之间的一个bug。详见: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
创建它,然后设置正确的所有者sudo chown www-data:www-data /var/log/fpm-php.www.log
。
一旦这样做了,php5-fpm重新启动,日志记录被恢复。
有多个php配置文件,但这是你需要编辑的一个:
/etc/php(version)?/fpm/pool.d/www.conf
取消注释
catch_workers_output
将允许php stderr进入php-fpm的错误日志而不是/dev/null。
我从一堆答案中收集了一些见解,并提出了一个全面的解决方案:
所以,如果你用php5-fpm设置nginx,并使用error_log()
记录一条消息,默认情况下你可以在/var/log/nginx/error.log
中看到它。
如果您想使用error_log(print_r($myArr, true));
记录大量数据(例如数组),可能会出现问题。如果数组足够大,nginx
似乎会截断日志条目。
fpm
(php.net fpm config)来管理日志。下面是这样做的步骤。打开
/etc/php5/fpm/pool.d/www.conf
:$ sudo nano /etc/php5/fpm/pool.d/www.conf
通过删除行首的
;
取消下面两行的注释:(error_log在这里定义:php.net);php_admin_value[error_log] = /var/log/fpm-php.www.log ;php_admin_flag[log_errors] = on
创建
/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
并查看第一列,您可以看到这应该是什么用户。重启php5-fpm:
$ sudo service php5-fpm restart
现在你的日志将在/var/log/fpm-php.www.log
.
php-fpm从v5.3.9到现在(5.3.14和5.4.4)有一个bug https://bugs.php.net/bug.php?id=61045。开发人员承诺将在下一个版本中进行修复。如果你不想等待-使用补丁在该页重新构建或回滚到5.3.8。
在你的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
我想在现有的答案中添加另一个技巧,因为它们没有解决我的问题。
在你的php位置块中注意下面的nginx指令:
fastcgi_intercept_errors on;
删除这条线结束了许多小时的挣扎和拔头发。
它可以隐藏在一些包含的conf目录中,比如我的fedora中的/etc/nginx/default.d/php.conf
。
在我的例子中,我显示错误日志将转到/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输出500错误没有任何日志记录,因为缺少php-mysql模块。我把joomla安装到另一台服务器上,然后忘记了它。因此,apt-get install php-mysql
和服务重启解决了这个问题。
我开始尝试修复损坏的日志记录没有成功。最后使用strace
,我在db相关的系统调用后发现了失败消息。虽然我的情况与op的问题没有直接关系,但我希望它能对您有所帮助。
在alpine 3.15上使用php8时发现/var/log/php8/error.log
/var/log/php8 # cat error.log
16:10:52] NOTICE: fpm is running, pid 14
16:10:52] NOTICE: ready to handle connections
我也有这个:
catch_workers_output = yes
查看"PHP-FPM"的Owner目录
你可以这样做:
ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/