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不记录。

浙公网安备 33010602011771号