« 上一篇下一篇 »

遇到Nginx后端应用服务器产生大量time-wait时的解决方法

问题:当启动nginx和php-fpm时,使用netstat -tunap查看到大量TIME_WAIT连接
  由于不知道什么原因,害怕是受到恶意攻击,马上killall nginx 和php-fpm,后来想了想会不会是80端口被攻击造成的?尝试修改nginx的80端口为8081,但结果同样是产生大量TIME_WAIT连接

   在HTTP1.1协议中,有个 Connection 头,Connection有两个值,close和keep-alive,这个头就相当于客户端告诉服务端,服务端你执行完成请求之后,是关闭连接还是保持连接,保持连接就意味着在保持连接期间,只能由客户端主动断开连接。还有一个keep-alive的头,设置的值就代表了服务端保持连接保持多久。

HTTP默认的Connection值为close,那么就意味着关闭请求的一方几乎都会是由服务端这边发起的。那么这个服务端产生TIME_WAIT过多的情况就很正常了。

虽然HTTP默认Connection值为close,但是现在的浏览器发送请求的时候一般都会设置Connection为keep-alive了。所以,也有人说,现在没有必要通过调整参数来使TIME_WAIT降低了。

参考:https:/docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

nginx到后端的默认配置

Passing Request Headers
By default, NGINX redefines two header fields in proxied requests, “Host” and “Connection”,
and eliminates the header fields whose values are empty strings. “Host” is set to the $proxy_host variable,
and “Connection” is set to close.

nginx到后端默认的HTTP版本

Syntax:proxy_http_version 1.0 | 1.1;
   
Default:proxy_http_version 1.0;
   
Context:http, server, location
   
This directive appeared in version 1.1.4.


参考:http:/nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version

Nginx到后端不开启keepalive的原因

keepalive的数量很难设置的准确,偏小的话就没啥作用 偏大的话会影响worker的短连接处理,都是内网 tcp连接的过程耗时应该可忽略吧,==但是带来的问题可能会造成后端服务的TIME-WAIT增多

 

 

有如下几种情况发生:

1、php有慢日志,但是nginx没有499,那应该就是我的连接在(1s,3s)的时间内返回给了slb;

2、php有慢日志,nginx有499,那就是真超时了,连slb都断开请求了;

但对于跨机房来说也应该是专线内网,怎么会有php连接mc集群超过1s呢。然后就请dba帮我查一下,结果他帮我查出来tcp连接有大量的time-wait:ss -na。

这个“大量的time-wait”是在查超时额外赠送的问题~

经过一番搜索,解决了,在/etc/sysctl.conf里配置两行:

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

打开了tcp连接的重用和回收功能。

time-wait过一会儿就降下来了。
---------------------