为了账号安全,请及时绑定邮箱和手机立即绑定

网站频繁出现502 bad gateway 怀疑是127.0.0.1连接太多

网站频繁出现502 bad gateway 怀疑是127.0.0.1连接太多

BIG阳 2019-04-09 20:24:04
用的是linode的vps,在上面架设了一个discuz论坛和一个wordpress的博客两个站。每天pv两个站加起来大概有九万多,vps的配置是2G内存,所有程序跑满后还能剩余600MB左右,用的web服务端是nginx,从配置后四个月内一直没有问题,最近频繁的502badgateway报错。开始也找不到问题所在,认为是配置环境的问题,于是重新配置了环境,折腾了几次之后发现依然是这样502badgateway报错或者根本打不开,检查后台IP连接数,发现有个127.0.0.1这个ip的连接数特别多,每次宕机之前能高于1500的IP连接数。在这里提问想询问各位大牛究竟问题出自哪里?这么高的连接数出自什么原因,是这个连接数导致的502吗?如何可以解决?第一次提问,本人新手,冒昧提问,请各位大牛理解。
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

502的问题有很多种情况,主要的问题就是nginx->php这一层出现问题,可能是并发问题,也可能是PHP处理能力问题,还有可能是code代码的问题.
你说的127.0.0.1比较多是很正常的,估计是因为你的nginx调用php使用的是ip:port的方式,还有mysql也会是走的127.0.0.1,所以你应该用端口来区分.
另外你说数量比较多,也不会全是ESTABLIST,如果你了解TCP协议就会知道,会有哪些状态.你可以查看下各个状态的量.
netstat-n|awk'/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}'
如果TIMEWAIT的数量太多,当然是可以做一些优化的.
net.core.somaxconn=4096
net.ipv4.tcp_max_syn_backlog=8192
net.ipv4.tcp_syn_retries=5
net.ipv4.tcp_synack_retries=5
net.ipv4.tcp_abort_on_overflow=0
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_tw_buckets=90000
net.ipv4.tcp_fin_timeout=30
net.ipv4.ip_local_port_range=1000065000
net.ipv4.tcp_keepalive_time=1200
如果担心并发能力的问题,可以查看下ulimit还有nginx的并发控制.
其实如果你的访问量(PV)没有太多变化,但是导致了502我想你应该多查看下php的日志.另外很常见的一个可能性是因为某个PHP程序hang住,导致你之后的PHP进程全部堵塞出现处理能力不够,这个可以查看你每一个请求的处理时间.还有限制php进程处理时间,减少Backlog的数量,但并不一定Max_children开得越大越好,像2G的还是开小些吧,32够了.
尤其是在出现502的时候一定要多观察PHP的状态,是有defunct,还是有CPU或者内存占用很大的进程.都是可以发现问题的.要具体问题具体分析了.
下面看下我实验的502情况(结构说明:Nginx(proxy)-->Nginx+PHP表格中说的nginx和PHP都是非proxy):
操作过程
返回时间
返回码
nginx进程不存在
立马
502
服务器死机
>proxy_connect_timeout
502
Nginx存在,fpm不存在
立马
502
nginx存在,fastcgi执行超时
>fastcgi_read_timeout
504
fpmbacklog队列满
立马
502
fpm主动断开
>request_terminate_timeout
502
PS:你的标题应该改改,应该是"网站频繁出现502,怀疑是127.0.0.1连接太多",把现象先描述出来.
                            
查看完整回答
反对 回复 2019-04-09
?
富国沪深

TA贡献1790条经验 获得超9个赞

我以前碰到这种问题是因为在nginx后面的webserver没有正确完成TCPtermination导致大量的TIME_WAIT/CLOSE_WAITconnection,最后导致openfile超过上限。你netstat-ano|grep-E'TIME_WAIT|CLOSE_WAIT'|wc-l看看是不是很多呢。如果是的话,可以调整linux的参数:
减少TIME_WAIT的timeout时间至30s
echo30>/proc/sys/net/ipv4/tcp_fin_timeout
如果CLOSE_WAIT过多,那就是server实现有bug。
                            
查看完整回答
反对 回复 2019-04-09
  • 2 回答
  • 0 关注
  • 816 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信