系统定制开发nginx之keepalive详解与其配置

文章目录


一、keepalive理解

什么是keepalive

keepalive系统定制开发是长连接的意思。系统定制开发客户端发起http系统定制开发请求前需要先与服务端建立TCP连接,每次TCP系统定制开发连接都需要三次握手来确定,系统定制开发三次交互不仅会增加消费时间,系统定制开发还会增加网络流量。http系统定制开发请求是请求应答式,系统定制开发如果能知道每个请求头系统定制开发与响应体的长度,系统定制开发就可以在一个连接上执系统定制开发行多个请求,这个就是所谓的长连接。

(注意:keepalive是tcp层长连接探活机制;keep-alive是应用层http协议使用,在其头部Connection字段中的一个值,只是代表客户端与服务之间需要保持长连接,可以理解为通过此字段来告诉nginx此连接需要维持长连接,处理完别直接关闭连接。)

如何确定请求头和响应体的长度?

1、请求头长度: 如果当前请求有body,需要客户端在请求头中指定content-length来表明body的大小,否则返回400。
 2、响应体长度: 在http协议中响应body长度的确定
http1.0:①响应头中有content-length,content-length即为body长度。客服端依照这个长度接收数据,接收完了就表示请求完成。②响应头中没有content-length,客户端会一直接收数据,知道服务端主动断开,才表示body接收完了。
http1.1:①chunked传输,响应头中有Transfer-encoding,body为流式输出,body被分成多个块,每块的开始会标识出当前块的长度,此时body不需要通过长度指定。②非chunked传输,响应头中有content-length则按照content-length来接收数据,没有content-length,则客户端接收数据,知道服务器主动断开。

是否可使用长连接的条件是什么?

可知响应体长度的情况下,当服务器输出完body后可以考虑使用长连接。长连接的条件限制如下:

  1. 客服端的请求头中的connection为close,则客户端要求不使用长连接。
  2. 客户端的请求头中的connection为keep-alive,则客户端要求使用长连接。
  3. 客户端的请求头中没有connection这个头,如果是http1.0协议默认为close,如果是http1.1协议默认为keep-alive。

keepalive时Nginx的等待时长是多少?

长连接时,Nginx在输出完响应体后,会设置当前连接的keepalive属性,然后等待客户端的下一次请求,同时也设置了一个最大等待时间,这个时间通过keepalive_timeout来配置,如果是0,则表示关掉长连接,此时不管客户端的connection值是什么都会强制设为close。

keepalive的优势是什么?

服务端确定是keepalive打开时,在响应的http头中也会有connection=Keep-Alive,否则为Close。如果connection值为colse,Nginx在响应完数据后就会关掉连接。所以对于请求量较大的Nginx来说,关掉keepalive最后会产生较多的time-wait状态的socket。当客户端的一次访问需要多次访问同一个server时,keepalive会大量减少time-wait的数量。

二、nginx的keepalive配置

nginx保持keepalive需做那些事情

  1. client到nginx的连接是长连接
  2. nginx到server的连接是长连接

nginx的文件配置

(1)配置TCP层keepalive探活机制的三个参数:

#情况1:http {server {    listen 127.0.0.1:3306 so_keepalive=on;#开启keepalive探活,探测策略走系统默认    }}#情况2:http {server {    listen 127.0.0.1:3306 so_keepalive=7m:75s:9;#把空闲时长从系统默认的5分钟改为了7分钟    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

其中so_keepalive有如下选择配置:

so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]*   on: 开启,探测参数更加系统默认值*   off: 关闭*   keepidle: 连接空闲等待时间 *   keepintvl: 发送探测报文间隔时间*   keepcent: 探测报文重试次数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

如果nginx未设置so_keepalive配置,则走系统默认的探活策略

(2)nginx与客户端(一般为浏览器、APP等)保持的长连接进行限制管理:

http {    keepalive_timeout  120s 120s;    keepalive_requests 100;}
  • 1
  • 2
  • 3
  • 4
keepalive_timeout timeout [header_timeout];
  • 1

第一个参数:客户端连接在服务器端空闲状态下保持的超时值(默认75s);值为0会禁用keep-alive,也就是说默认不启用长连接;第二个参数:响应的header域中设置“Keep-Alive: timeout=time”;告知浏览器对长连接的维持时间;官网介绍如下:

keepalive_requests number;
  • 1

keepalive_requests:默认100,某个长连接连续处理请求次数限制,超过次数则该长连接被关闭;如果需要释放某个连接占用的内存,必须关闭该链接,内存不大的情况下,不建议开大该配置;在QPS较高的场景,则有必要加大这个参数;

(3)nginx与上游server保持长连接

http {    upstream  BACKEND {        server 127.0.0.1:8000;        server 127.0.0.1:8001;        server 127.0.0.1:8002;        keepalive 300; //空闲连接数           keepalive_timeout  120s;//与上游空闲时间        keepalive_requests 100;//与上游请求处理最大次数    }    server{        listen 8080;        location /{            proxy_pass http://BACKEND;            proxy_http_version 1.1;            proxu_set_header Connection "";        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

keepalive:限制nginx某个worker最多空闲连接数,此处不会限制worker与上游服务长连接的总数;
keepalive_timeout:nginx与上游长连接最大空闲时间,默认值为60s;
keepalive_requests:nginx与上游长连接最大交互请求的次数,默认值为100;

三、应用场景

什么时候使用?

明显的预知用户会在当前连接上有下一步操作
复用连接,有效减少握手次数,尤其是https建立一次连接开销会更大

什么时候不用?

访问内联资源一般用缓存,不需要keepalive
长时间的tcp连接容易导致系统资源无效占用

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发