nginx

Nginx长连接

2018-09-11  本文已影响1311人  猪蹄胖

讨论关于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。


image.png

nginx服务器出现大量TIME_WAIT,可能情况是keepalive设置的值太小,

原理:

Nginx 和后端的长连接不够用时 Nginx 会新建连接来处理新的请求,而我们的配置已经配置死了 HTTP1.1,建立连接后,后端认为是长连接而不会主动关闭连接一般有个空闲超时,关闭连接由 Nginx 来做了,所以 Nginx 会出现大量的 TIME_WAIT

默认情况下,NginxHTTP1.0 请求后端,后端处理完成后就主动关闭连接,所以 TIME_WAIT 在后端。

如果开启了长连接,而长连接又大量不够用,此时 Nginx 存在的 TIME_WAIT 可能会大量占用端口,导致端口用尽,如果用尽,后果很严重

小网站在被CC攻击时的连接数情况

image.png
上一篇 下一篇

猜你喜欢

热点阅读