一、nginx使用场景
大型应用架构中,一般会使用nginx反向代理,分为三层:
1.调用层,浏览器或APP;
2.中间层,反向代理nginx;
3.服务层,server一般是apche、tomcat
请求调用过程:
1.浏览器/app发起请求
2.DNS解析网址为ip地址
3.通过外网ip访问nginx
4.nginx发送请求给内网ip的server
上面架构,要想支持全链路的长连接,需要做到两点:
1.从client到nginx的连接是长连接;
2.从nginx到server的连接是长连接;
二、长连接设置
1.client到nginx的长连接:
由于目前浏览器默认使用HTTP/1.1,请求header中默认设置Connection:keep-alive,所以只需在nginx配置中做如下配置:
http {keepalive_timeount 120s 120s;keepalive_requests 10000;
}
2.nginx和server的长连接
默认情况下,nginx访问后端都是用的短连接(HTTP/1.0)一个请求来了,nginx会新开一个端口和后端建立连接,后端执行完毕后主动关闭该tcp连接。为了让nginx和后端server(nginx称之为upstream)之间保持长连接,典型设置如下:
http {upstream http_backend {server 192.168.2.154:8080;server 192.168.2.109:8080;keepalive 32; # 长连接缓存池大小为32keepalive_timeout 120s; # 长连接失效时间keepalive_requests 2000; # 每条长连接最大复用请求数为2000}server {location /http/ {proxy_pass http://http_backend;proxy_http_version 1.1; # 启用HTTP/1.1版本与被代理服务器建立连接proxy_set_header Connection "Keep-Alive"; # 设置发送被代理服务器请求头属性字段Connection}}
三、问题总结
综上所述,nginx反向代理的情况下,tcp长连接设置完成。在实际系统应用长连接的场景中,可能会出现大量TIME_WAIT的情况,这里简单做个总结:
1.导致nginx端出现大量TIME_WAIT的情况有两种:
a.keepalive_requests设置比较小,高并发下超过此值后nginx会强制关闭和客户端的长连接;(主动关闭连接后导致nginx出现TIME_WAIT)
b.keepalive设置比较小(空闲数太小),导致高并发下nginx会频繁出现连接数震荡,不停的关闭、开启和后端server的长连接;
2.导致后端server端出现大量TIME_WAIT的情况:
nginx没有打开和后端的长连接,即:没有设置proxy_http_version 1.1和proxy_set_header Connection "Keep-Alive",从而导致后端server每次请求后就关闭连接,高并发下就会出现server端的大量TIME_WAIT.