nginx基础第三篇:长连接的设置

考虑一个最常见的场景,client->nginx->upstream

1、client与nginx建立长连接,nginx需要如何配置?

nginx默认与client保持长连接。

https://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout

keepalive_requests:设置通过长连接的最大请求数,当请求数量达到指定的数量时,nginx将关闭此连接。默认是1000。压测时,nginx经常关闭连接,就是这个原因。

keepalive_time:设置长连接处理请求的最长时间,当处理请求的时间达到指定的时间时,nginx将关闭此连接。默认是1h。

keepalive_timeout:客户端连接的最大空闲时间。默认为75s。客户端发来请求,nginx处理并响应。如果配置了keepalive_timeout,假如是60s,则nginx不会立即关闭这个TCP连接,它会等最多60s,看客户端是否还有请求。如果60s内没有新的请求,nginx就会关闭此连接。keepalive_timeout如果设置为0,则表示禁用与client之间的长连接。

以上配置的使用范围是http块、server块、location块。

2、nginx与upstream建立长连接,nginx需要如何配置?

https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive

keepalive:设置nginx单个worker process与upstream的最大空闲连接数。如果配置为50,且如果通过ps命令查看nginx有4个worker process,那么nginx与upstream将最多有200个空闲连接。

keepalive默认没有配,表示不启用长连接。即默认情况下,nginx访问upstream都是用的短连接(HTTP1.0),一个请求来了,nginx新开一个端口和upstream建立连接,upstream执行完毕后主动关闭该连接。

keepalive_requests:设置通过长连接的最大请求数,当请求数量达到指定的数量时,nginx将关闭此连接。

keepalive_time:设置长连接处理请求的最长时间,当处理请求的时间达到指定的时间时,nginx将关闭此连接。默认是1h。

keepalive_timeout:空闲的长连接,如果空闲超过这个时间,nginx将关闭此连接。默认是60s。

keepalive、keepalive_timeout使用解释:假如keepalive配置的是32,keepalive_timeout配置的是60s,假如一瞬间nginx收到了1w个请求,则nginx会与upstream建立1w个连接,等请求处理完后,仅保留32个连接作为空闲连接,其余连接均立即被nginx关闭。这32个连接,如果在60s内没有新的请求,则也会被nginx关闭。

以上配置的使用范围是upstream块。

默认情况下,nginx向upstream发送的http请求,是http 1.0,且加了值为close的Connection请求头,故每次请求处理完后,连接都会被upstream关闭。所以,还需要在location块或者server块中添加

proxy_http_version 1.1;
proxy_set_header Connection "";

proxy_http_version和proxy_set_header的使用范围都是http块、server块、location块。

若出现大量TIME_WAIT
1)导致nginx出现大量TIME_WAIT的情况有两种:

①keepalive_requests设置比较小,连接处理的请求数超过此值后nginx就会关闭该连接,高并发下就会导致大量TIME_WAIT。

②keepalive设置的比较小,如果请求的并发是剧烈波动的,那么在并发数比较小时,nginx就会关闭keepalive之外的连接,频繁波动的话,就会导致大量TIME_WAIT。

2)导致upstream出现大量TIME_WAIT的情况:

nginx没有打开和后端的长连接,从而导致upstream每次都关闭连接,高并发下就会出现大量TIME_WAIT。

posted on 2016-10-16 15:13  koushr  阅读(311)  评论(0)    收藏  举报

导航