Nginx 的配置文件中的 keepalive 介绍

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 向它发起的请求。

在这里插入图片描述

经过 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 模块上的含义是一样的。

猜你喜欢

转载自blog.csdn.net/qq_34168988/article/details/125207437