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

2014-06-28 9,324 1 技术 大超超。

背景

买了台云服务器,在上面安装好了CentOS+Nginx+PHP with fpm-fcgi,跑了一些demo网站,正在测试使用typecho建立的站点时,本地测试没问题,服务器上测试就出问题了,报500错误,一般是脚本方面的问题。

但是由于服务器环境比较严格,默认把php的错误级别调整的比较高,在页面不显示错误信息,所以想找错误日志看具体出错在哪。

以前使用Apache+php的时候,直接查看/var/log/httpd/error_log就行了,现在找了/var/log/目录下面的几个相关的文件夹都找不到出错信息,就去查找这方面的资料,有一些启发,后来也成功解决,写下来记录和分享。

版本相关:CentOS 6.3Nginx 1.0.15PHP 5.3.3

 

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

  • nginx/access.log:记录网站正常访问的情况(20030x等),包括访客IP、访问时间、请求页面及方法、使用的浏览器UA等,形如:

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出现),形如:

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出错记录,形如:

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

 



声明: 本文由大超超。原创编译,转载请保留链接: http://www.thinkful.cn/archives/498.html