我刚刚安装了一个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脚本发出什么错误的错误,日志文件总是为空。
发生了什么事?
[后来找到原因]
是许可。将所有者更改为网站的用户解决了问题。
答案 0 :(得分:177)
这对我有用:
; 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
答案 1 :(得分:77)
在找到我的php-fpm日志写入/var/log/upstart/php5-fpm.log
之前,我很长时间都在努力解决这个问题。它似乎是upstart和php-fpm如何交互之间的错误。点击此处:https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595
答案 2 :(得分:48)
我遇到了类似问题,必须对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,恢复了日志记录。
答案 3 :(得分:31)
有多个php配置文件,但这是您需要编辑的文件:
/etc/php(version)?/fpm/pool.d/www.conf
取消注释:
catch_workers_output
这将允许PHPs stderr转到php-fpm的错误日志而不是/ dev / null。
答案 4 :(得分:25)
我在这里从一堆答案中收集了见解,并提出了一个全面的解决方案:
因此,如果您使用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
。
答案 5 :(得分:14)
从v5.3.9到现在(5.3.14和5.4.4),php-fpm中存在一个错误https://bugs.php.net/bug.php?id=61045。开发人员承诺修复将在下一版本中发布。如果您不想等待 - 在该页面上使用补丁并重新构建或回滚到5.3.8。
答案 6 :(得分:3)
你没有设置2变量,仅用于错误记录
此变量是error_log(错误日志文件的文件路径)log_level(错误日志记录级别)
错误日志文件 ;注意:默认前缀是/ usr / local / php / var ;默认值:log / php-fpm.log
error_log = log/php-fpm.log
日志级别 ;可能的值:警报,错误,警告,通知,调试 ;默认值:通知
log_level = notice
答案 7 :(得分:2)
在我的情况下,我显示错误日志是 /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 :(得分:1)
我想在现有答案中添加另一个提示,因为它们不能解决我的问题。
在您的php位置块中注意以下nginx指令:
fastcgi_intercept_errors on;
删除此行结束了许多小时的挣扎和拉扯头发。
它可以隐藏在我的软呢帽中某些包含的conf目录(如/etc/nginx/default.d/php.conf
中)。
答案 9 :(得分:0)
检查“PHP-FPM”的所有者目录
你可以这样做:
ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/
答案 10 :(得分:-1)
在我的情况下,由于缺少php-mysql模块,php-fpm输出500错误而没有任何日志记录。我将joomla安装移至另一台服务器,却忘记了。因此apt-get install php-mysql
并重新启动服务即可解决。
我从尝试修复失败的日志记录开始,但没有成功。最后,在与数据库相关的系统调用之后,我用strace
发现了失败消息。尽管我的案子与op的问题没有直接关系,但我希望它会有所帮助。