2014年2月10日星期一

处理一个nginx php 慢的故障

一个后台维护系统,运行了一年半,一直都是很好。昨天突然接到反馈,说页面响应速度超慢。过后看了一下
服务器的 access log,的确是有些慢,处理时间很多都在 15-25s 之间。

一般有问题都是和开发协同看,检查了一遍所有的接口请求情况,同时检查了php 的 slow 和nginx error log 和
网络,均没有任何收获。每次遇到头痛的问题就是不知道是哪里的问题。
问题还是得查,php 没有 slow 信息,但还是要确定 slow 所在,还是需要查到相关的 log 才能解决。
让开发将代码部分执行每部分的时间精确输出,给出的结论是不慢。
开发使用测试的域名访问,速度还是可以的。
由于正式环境走的是ssl 代理,初步怀疑和走的 ssl 有关系,终于方向可查。

ssl 是从 56.com 那个 proxy 过来的,将 nginx 的 log level 设置到 debug 级别,根据开发给出的地址,终于有
所发现:

类似于这种慢的请求(19.87s):

59.32.213.232 56.com - [08/Jan/2014:20:25:37 +0800] GET /check/v/_cs_u_check1.php?a=2&b=0&t=600000&func_id=1116&func_key=2274c88c3f&func_t=1389183697 HTTP/1.0 "200" 367128 "https://56.com/backendv/check/login/index.php?do=menuleft&class1=1" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" "113.107.234.104" "19.873"

这边都会报相应的warning:

2014/01/08 20:25:59 [warn] 24974#0: *70 an upstream response is buffered to a temporary file /home/nginx-1.4.4/fastcgi_temp/7/00/0000000007 while reading upst
ream, client: 59.32.213.232, server: backend.v.56.com, request: "GET /check/v/_cs_u_master.php?id=http%3AFFwww.56.comFu71Fv_MTAzODAwMDIw.htmlChttp%3
AFFwww.56.comFu92Fv_MTAzOTc2NDgx.htmlChttp%3AFFwww.56.comF HTTP/1.0", upstream: "fastcgi://unix:/home/php/p

针对此情况,前端的 56.com proxy_buffer 记得之前跑 php 的时候超时有增加过值,于是我在 nginx 中 ssl server 和 80 端口的 
server 部分都分别加上(分别加的目的是防止还有问题,区分起来比较容易):

client_max_body_size 500m;
client_body_buffer_size 1024k;
fastcgi_buffers 512 4k;

观察, proxy 和 redirect 问题导致的 buffered to a tempoprary file 里的 warning ,页面的访问速度正常。

到目前为止,个人能力能够处理网页访问的简单总结:

  1. 检查服务器上的主要服务 php 是否正常(php 错误日志和慢日志优先,设定 log 的级别为 debug);
  2. 检查网络相关,ping 通能否?域名 hosts 指向是否正确?
  3. 检查服务调用的接口是否正常;
  4. ​检查一切有可能的系统服务,/var/log/messages 下是否有报错,dmesg 是否有有用的信息。
  5. ​找到有说服力的测试验证方法,定位问题大致方向。

没有评论:

发表评论