Nginx 的配置文件中 http 模块有关于 keepalive 的一些字段,这里的 keepalive 表示的是 HTTP1.1 的长连接。
长连接
HTTP/1.0 性能上的一个很大的问题,那就是每发起一个请求,都要新建一次 TCP 连接(三次握手),而且是串行请求,做了无谓的 TCP 连接建立和断开,增加了通信开销。
为了解决上述 TCP 连接问题,HTTP/1.1 提出了长连接的通信方式,也叫持久连接。这种方式的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。
持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态
Nginx 的配置文件
worker_processes 1;
events {
worker_connections 1024;
}
# http 模块
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
# 当进行TCP连接后,如果在 65s 内没有活动,则关闭长连接
# 即在点击一个链接后,在65s内没有点击另一个链接,则会关闭当前TCP连接
# 如果在65s内点击了其它链接,则会复用当前的TCP连接,不用进行三次握手
keepalive_timeout 65;
#keepalive_timeout 0; # 超时时间为 0 表示不使用 TCP 长连接
keepalive_disable msie6;
keepalive_requests 1000;
keepalive_time 1h;
upstream httpds {
server 192.168.137.129:80; # A 服务器
server 192.168.137.130:80; # B 服务器
keepalive 32;
}
server {
listen 80;
server_name localhost;
location / {
proxy_http_version 1.1; # 配置 http 版本,默认是 http1.0,不支持长连接
proxy_set_header Connection:""; # 将 Connction:close 中的 close 去掉
proxy_pass http://httpds; # 转发到 httpds 中的服务器中
}
}
}
http 模块中的 keepalive
keepalive_disable none | browser ...;
禁用不支持长连接的的浏览器的开启此功能。browser
参数指定哪些浏览器将不能开启 keepalive 功能。该字段的默认值是 msie6
,即表示使用微软的 IE6.0 浏览器发起请求,将不支持开启 keepalive 功能;如果值是 safari
,则表示 Mac 系统中的 safari
浏览器不能开启 keepalive 功能;值为 none
表示所有浏览器都可以支持该功能。
keepalive_requests number; # number 默认值是 1000
设置一个长连接中能够处理的最大请求数 number
。一个连接中的请求数量超过 number
后,将关闭连接。 定期关闭连接对于释放每个连接的内存分配是必要的。因此,使用过高的最大请求数可能会导致内存使用过多,不推荐使用。
keepalive_time time; # time 默认值是 1h
限制通过一个长连接可以处理请求的最长时间。达到这个时间后,将关闭这个连接。它的默认值是 1小时,即一个连接在开启超过一小时后,将会强制关闭。
keepalive_timeout timeout; # timeout 默认值为 75s
第一个参数 timeput
表示一个连接的超时时间,如果在 timeout
时间内再次发起请求,将会复用当前已经打开的长连接,并将 timeout
重置(默认值则重置为75s)。timeput
为 0 表示不使用长连接功能。
upstream 模块中的 keepalive
Nginx 中的 upstream 又称为上游服务器(即下图中的 Tomcat 服务器)。
从浏览器中发起的请求会发送到 Nginx 中取,然后 Nginx 会做一些处理(如过滤信息等操作)把请求转发到上游服务器中,然后 Tomcat 处理请求,并将请求的数据返回给浏览器。
在浏览器把请求发到 Nginx 时,请求报文中携带着一些浏览器的信息,如 User-Agent、Connection 等信息。但是 Nginx 将请求报文转发到 Tomcat 时,会把关于浏览器的一些信息给清除掉,从而导致 Tomcat 并不知道请求到底是哪个用户发起的,它只知道是 Nginx 向它发起的请求。
![](/qrcode.jpg)
经过 Nginx 把报文请求头的一些信息清除后,Connection 中的信息也被清除了,所以它转发的请求报文中的 Connection 的值是 close,即 Connection :close
,这表示不启用长连接功能,将导致 Nginx 每转发一次请求都需要重新经过三次握手建立一个新的连接。
所以在 Nginx 转发请求到上游服务器时也需要开启长连接的功能,只需要在 upstream 模块中添加上 keepalive 相关的字段就可以启用相关功能了。
upstream httpds {
server 192.168.137.129:80; # A 服务器
server 192.168.137.130:80; # B 服务器
keepalive 32;
keepalive_timeout 65;
keepalive_requests 1000;
keepalive_time 1h;
}
server {
listen 80;
server_name localhost;
location / {
# 转发时使用 http1.1 进行转发
proxy_http_version 1.1; # 配置 http 版本,默认是 http1.0,不支持长连接
proxy_set_header Connection:""; # 将 Connction:close 中的 close 去掉
proxy_pass http://httpds; # 转发到 httpds 中的服务器中
}
}
keepalive 表示将启用转发到上游服务器的长连接,它的值为在每个工作进程缓存中的上游服务器的最大空闲长连接数,当超过这个数字时,最近最少使用的连接将被关闭。
keepalive_timeout 、keepalive_requests、keepalive_time 的含义和 http 模块上的含义是一样的。