共计 1007 个字符,预计需要花费 3 分钟才能阅读完成。
原因
在 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 增多
: