讨论关于nginx的长连接和TIME-WAIT相关知识点
长连接
Nginx从 1.1.4 开始,实现了对后端机器的长连接支持,这意味着 Nginx 与后端机器的通信效率更高,后端机器的负担更低。
示例:
upstream http_backend {
keepalive 16;
server 127.0.0.1:8080;
}
server {
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1; #设置http版本为1.1
proxy_set_header Connection ""; #设置http头默认为长连接,不关闭
}
}
默认使用http1.0,并且connection连接默认是close
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
原理:
默认情况下 Nginx
访问后端都是用的短连接HTTP1.0
,一个请求来了,Nginx
新开一个端口和后端建立连接,请求结束连接回收。如果像上面的配置一样设置了长连接,Nginx
会接受客户端的请求,处理完成之后Nginx
会继续保持和后端的长连接
如果并发请求超过了 keepalive
指定的最大连接数,Nginx
会启动新的连接 来转发请求,新连接在请求完毕后关闭,而且新建立的连接是长连接
keepalived
keepalive
指定的 数值 是 Nginx
每个 worker
连接后端的最大长连接数,而不是整个 Nginx
的。 而且这里的后端指的是所有的后端,而不是每一个后端。
TIME_WAIT
出现大量TIME_WAIT 状态的连接,使用以下命令验证之:
netstat -n | grep TIME_WAIT
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
从以下原理图中可以看出,发起tcp四次挥手的一方将会进入TIME_WAIT状态,而TIME_WAITE的等待时间默认是2MSL,MSL默认是2min。
nginx服务器出现大量TIME_WAIT,可能情况是keepalive设置的值太小,
原理:
Nginx
和后端的长连接不够用时 Nginx
会新建连接来处理新的请求,而我们的配置已经配置死了 HTTP1.1
,建立连接后,后端认为是长连接而不会主动关闭连接一般有个空闲超时,关闭连接由 Nginx
来做了,所以 Nginx
会出现大量的 TIME_WAIT
。
默认情况下,Nginx
用 HTTP1.0
请求后端,后端处理完成后就主动关闭连接,所以 TIME_WAIT
在后端。
如果开启了长连接,而长连接又大量不够用,此时 Nginx 存在的 TIME_WAIT 可能会大量占用端口,导致端口用尽,如果用尽,后果很严重
小网站在被CC攻击时的连接数情况