转:一例502bad gateway的排查

转自:http://drdr.nix-adm.org/?p=192

一例502bad gateway的排查 一个站点突然502了,重启php fastcgi进程依然很慢。

站点结构比较简单,一台WEB,一台DB。

排查这种完全无法访问的问题比较简单。

首先看负载,命令w,或用vmstat 1 5 看负载倾向,负载几乎没有,基本是fastcgi进程挂掉了,你可以通过 netstat -an|grep LISTEN来确认fastcgi在不在。

如果负载比较高,那多半是fastcgi被阻塞了,如果你是用socket方式连接的fastcgi,那直接netstat -an|grep sock就可以看到阻塞的队列有多长。

如果确认是阻塞了,那可以直奔php的slow_log了,如果你的fpm还没有配置这个选项,赶紧配置上吧, slow的时间基准设置为1秒。

在本例中,fastcgi就堵住了,查看slow log,发现都是mysql查询函数被阻塞了。

那mysql是如何能阻塞呢,本例mysql是与WEB是分离部署的,所以首先要排查网络原因,ping db,发现延迟居然到了100ms ,俩机器可是在同一个LAN内,那什么原因会造成延迟变大呢,流量,状态表,负载,都可能,首先应该检查的是流量。

俩机器分别执行sar -n DEV 1 10查看用于通信的内网流量使用情况,发现数据库这台机器流量使用了接近100M,使用ethtool 检查网卡,发现协商成100M了,但一般来说,纯数据库查询,跑满百M,也很不可思议,所以一定有其他原因。

tcpdump -nn -i eth1 port not 3306 看一下除了mysql外,内网还有承载其他业务分组么,发现几乎没有,那就确定是 mysqld 的原因了。

show processlist,发现队列不是很长,不过发现有一个用于replication(主从复制)的进程,问一下,果然复制是新加的,停掉丛库后,流量一下就下来了。

slow log对排查php被阻塞到站点挂掉的原因,绝对是最直接的方式。

另:Nginx 502错误的几种解决方法 http://www.houyanpeng.com/nginx-502%E9%94%99%E8%AF%AF%E7%9A%84%E5%87%A0%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95.html

ginx 502 Bad Gateway错误是FastCGI有问题,造成NGINX 502错误的可能性比较多。将网上找到的一些和502 Bad Gateway错误有关的问题和排查方法列一下,先从FastCGI配置入手:

1.FastCGI进程是否已经启动

2.FastCGI worker进程数是否不够 运行 netstat -anpo | grep “php-cgi” | wc -l 判断是否接近FastCGI进程,接近配置文件中设置的数值,表明worker进程数设置太少 参见:http://blog.s135.com/post/361.htm

3.FastCGI执行时间过长 根据实际情况调高以下参数值 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300;

4.FastCGI Buffer不够 nginx和apache一样,有前端缓冲限制,可以调整缓冲参数 fastcgi_buffer_size 32k; fastcgi_buffers 8 32k; 参见:http://www.hiadmin.com/nginx-502-gateway-error%E4%B8%80%E4%BE%8B/

5.Proxy Buffer不够 如果你用了Proxying,调整 proxy_buffer_size 16k; proxy_buffers 4 16k; 参见:http://www.ruby-forum.com/topic/169040

6.https转发配置错误 正确的配置方法 server_name www.mydomain.com; location /myproj/repos { set $fixed_destination $http_destination; if ( $http_destination ~* ^https(.*)$ ) { set $fixed_destination http$1; } proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Destination $fixed_destination; proxy_pass http://subversion_hosts; } 参见:http://www.ruby-forum.com/topic/169040

当然,还要看你后端用的是哪种类型的FastCGI,我用过的有php-fpm,流量约为单台机器40万PV(动态页面), 现在基本上没有碰到502。

Leave a Reply

Your email address will not be published. Required fields are marked *