周末休息的时候,经理突然发消息来,说服务器崩了,马上打开网站查看,发现部分接口请求的时候,nginx报502错误。登上服务器,查看了nginx错误日志,发现了大量的异常。
no live upstreams while connecting to upstream
Only one usage of each socket address (protocol/network address/port) is normally permitted) while connecting to upstream
起初以为是nginx的配置问题,百度了许久,修改了proxy_buffer_size,proxy_buffers 参数,加大了缓存,502问题好像消失了。跟经理说问题解决了,是配置问题。
。。。
没想到第二天一早起床,打开微信一看,一堆消息,说服务器又崩了,和昨天的问题一样,早餐都没吃,赶紧跑去公司。
再次检查nginx错误日志,发现了一个错误记录
[crit] 31144#87716: *15013 connect() to [::1]:9008 failed (10055: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full) while connecting to upstream
是说系统缺少足够的缓冲区空间或队列已满,该不会是太多连接到nginx了吧,觉得有可能是websocket长连接的问题,于是把websocket连接暂时关闭,worker_connections参数调大,发现接口变正常了,没有502了。于是跟经理信誓旦旦保证,问题已经解决了。
没想到第三天还是出现了问题,再不解决就要提桶跑路了。
其实这里我进入了一个误区,因为接口返回的是nginx502,以为是nginx的问题,后来,在tomcat的错误日志里,发现了这个问题
Caused by: java.net.SocketException: No buffer space available (maximum connections reached?): connect
这里已经很明显了,是tcp连接数的问题,连接数满了,无法再建立连接了
服务器使用的是 windows serve 2012R2
使用命令 netsh interface ipv4 show dynamicportrange tcp 查看了端口数发现只开放了少量端口
只需要打开注册表,新增两个参数
找到 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 目录下
新增 MaxUserPort (默认可用端口) 值为 65534
然后再次输入命令 netsh interface ipv4 show dynamicportrange tcp
发现端口数改变了。
新增 TcpTimedWaitDelay (tcp恢复时间)值为 30(后来发现此参数需要重启才生效)
或者命令:Set-ItemProperty HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\ -Name TcpTimedWaitDelay -Value 30 -Force
。。
目前已经观察了半个月,并没有发现出现502错误了。