nginx+php-fpm+php在程序调试方面的吐血总结
版本相关:CentOS 6.3
、Nginx 1.0.15
、PHP 5.3.3
。
日志文件作用说明(相对/var/log/
目录,默认情况)
nginx/access.log
:记录网站正常访问的情况(200
、30x
等),包括访客IP
、访问时间、请求页面及方法、使用的浏览器UA
等,形如:
1 | 110.75.124.119 - - [27 /Jun/2014 :03:44:00 +0800] "GET /login HTTP/1.1" 200 9786 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" "-" |
nginx/error.log
:记录网站非正常访问的情况,如页面找不到(404
)、nginx
配置错误信息、php
/php-fpm
运行错误等(也有PHP message出现),形如:
1 2 3 4 5 6 7 8 | 2014 /06/27 03:52:36 [error] 10527 #0: *17184 open() "/usr/share/nginx/search" failed (2: No such file or directory), client: 107.155.70.57, server: 112.124.58.20, request: "GET http: //www .google.com /search ? btnG=1&filter=0&start=0&q=facebook.com HTTP /1 .1", host: "www.google.com" |
php-fpm/error.log
:记录php-fpm
运行状况,以及php
出错记录,形如:
1 2 3 4 5 6 7 | [28-Jun-2014 01:01:03] NOTICE: ready to handle connections [28-Jun-2014 01:01:19] NOTICE: exiting, bye-bye! [28-Jun-2014 01:01:19] NOTICE: fpm is running, pid 17106 [28-Jun-2014 01:01:19] NOTICE: ready to handle connections [28-Jun-2014 01:04:12] WARNING: [pool www] child 17111 said into stderr: "NOTICE: PHP message: PHP Fatal error: Class 'DB' not found in /usr/share/nginx/config .inc.php on line 102" |
需要注意的地方
php.ini
里面的log_errors
项要设置为On
,/etc/php-fpm.d/www.conf
里面的php_admin_flag[log_errors]
也要设置为on
;在
PHP 5.3.8
及之前的版本中,通过FastCGI
运行的PHP
,在用户访问时出现错误,会首先写入到PHP
的errorlog
中;如果PHP
的errorlog
无法写入,则会将错误内容返回给FastCGI
接口,然后nginx
在收到FastCGI
的错误返回后记录到了nginx
的errorlog
中;在PHP 5.3.9
及之后的版本中,出现错误后PHP
只尝试写入PHP
的errorlog
中,如果失败则不会再返回到FastCGI
了,错误日志会输出到php-fpm
的错误日志里;所以如果想把PHP
错误日志输出到nginx
错误日志,需要使用PHP 5.3.8
之前的版本,并且配置文件中PHP
的error_log
对于php worker
进程不可写(本段摘自nginx php-fpm 输出php错误日志);/etc/php-fpm.d/www.conf
里面的额外定义,会覆盖php.ini
里面的配置,参见下图英文说明;/etc/php-fpm.d/www.conf
里面的php_value
/php_flag
能被PHP
脚本里面的ini_set
覆盖,但是php_admin_value
/php_admin_flag
不会被PHP
脚本里的ini_set
覆盖;php-fpm
和php.ini
的错误级别不同:php-fpm
里的log_level
(记录出错信息时的级别),可用级别为:alert
(必须立即处理),error
(错误情况),warning
(警告情况),notice
(一般重要信息),debug
(调试信息),默认:notice
,php.ini
里面错误报告级别error_reporting = E_ALL & ~E_DEPRECATED
(详细说明参见官方文档);在调试的时候,无论是
php.ini
,还是php-fpm
的相关配置,还是nginx
相关配置,最终需要注意的是PHP
脚本里的error_reporting
一定要打开,否则前面所有工作都是白费事;一般可以在
PHP
脚本里使用error_reporting(E_ALL & ~E_STRICT & ~E_WARNING & ~E_NOTICE);
来打开error_reporting
,并且strict
、warning
和notice
不记录。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)