nginx+php-fpm+php在程序调试方面的吐血总结

版本相关:CentOS 6.3Nginx 1.0.15PHP 5.3.3

 

日志文件作用说明(相对/var/log/目录,默认情况)

  • nginx/access.log:记录网站正常访问的情况(20030x等),包括访客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"

 

需要注意的地方

  1. php.ini里面的log_errors项要设置为On/etc/php-fpm.d/www.conf里面的php_admin_flag[log_errors]也要设置为on

  2. PHP 5.3.8及之前的版本中,通过FastCGI运行的PHP,在用户访问时出现错误,会首先写入到PHPerrorlog中;如果PHPerrorlog无法写入,则会将错误内容返回给FastCGI接口,然后nginx在收到FastCGI的错误返回后记录到了nginxerrorlog中;在PHP 5.3.9及之后的版本中,出现错误后PHP只尝试写入PHPerrorlog中,如果失败则不会再返回到FastCGI了,错误日志会输出到php-fpm的错误日志里;所以如果想把PHP错误日志输出到nginx错误日志,需要使用PHP 5.3.8之前的版本,并且配置文件中PHPerror_log对于php worker进程不可写(本段摘自nginx php-fpm 输出php错误日志);

  3. /etc/php-fpm.d/www.conf里面的额外定义,会覆盖php.ini里面的配置,参见下图英文说明;140628调试错误信息说明.png

  4. /etc/php-fpm.d/www.conf里面的php_value/php_flag能被PHP脚本里面的ini_set覆盖,但是php_admin_value/php_admin_flag不会被PHP脚本里的ini_set覆盖;

  5. php-fpmphp.ini的错误级别不同:php-fpm里的log_level(记录出错信息时的级别),可用级别为:alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息),debug(调试信息),默认: noticephp.ini里面错误报告级别error_reporting = E_ALL & ~E_DEPRECATED(详细说明参见官方文档);

  6. 在调试的时候,无论是php.ini,还是php-fpm的相关配置,还是nginx相关配置,最终需要注意的是PHP脚本里的error_reporting一定要打开,否则前面所有工作都是白费事;

  7. 一般可以在PHP脚本里使用error_reporting(E_ALL & ~E_STRICT & ~E_WARNING & ~E_NOTICE);来打开error_reporting,并且strictwarningnotice不记录。

posted @ 2016-09-07 11:37  编程未来  阅读(435)  评论(0编辑  收藏  举报