[nginx] 如何设置proxy到upstream的长连接
前言
1. 如下内容将讨论nginx做proxy代理client访问http server的过程。
2. 这里的长连接是指keepalive,指的是http的keepalive,区别与tcp的keepalive。
问题框架
从client经过作为proxy的nginx访问http server时,涉及到2条连接,5个组件。
两条连接为,client到proxy,proxy到server。我们在这里更关心的是,如何让后边的连接为长连接。
五个组件为,client,nginx server, nginx proxy module, nginx upstream module, http server。
背景
我们已知,http1.1为了解决http1.0的效率问题,引入和长连接。
在header里带上一个Connection字段,value等于Keep-Alive,接到header的一方就会知道对方想长连接。
否则这个字段的值就是Close。然后http server就知道对方不希望长连接,他就会close TCP,在发完http response之后。
如:
[root@T9 OUTPUT]# curl -v -H "Connection: keep-alive" http://192.168.7.9:5001/ * About to connect() to 192.168.7.9 port 5001 (#0) * Trying 192.168.7.9... * Connected to 192.168.7.9 (192.168.7.9) port 5001 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 192.168.7.9:5001 > Accept: */* > Connection: keep-alive > < HTTP/1.1 301 Moved Permanently < Server: Nginx < Date: Thu, 10 Sep 2020 11:12:37 GMT < Content-Type: text/html; charset=utf-8 < Transfer-Encoding: chunked < Connection: keep-alive < X-Powered-By: PHP/7.4.8 < X-Content-Type-Options: nosniff < Vary: Accept-Encoding, Cookie < Expires: Thu, 01 Jan 1970 00:00:00 GMT < Cache-Control: private, must-revalidate, max-age=0 < Last-Modified: Thu, 10 Sep 2020 11:12:37 GMT < Location: http://localhost/index.php?title=%E9%A6%96%E9%A1%B5 < * Connection #0 to host 192.168.7.9 left intact [root@T9 OUTPUT]#
方法
现在的问题是,我们如何让作为proxy的nginx与后端建立长连接。
基于前边讲的背景,我们要让proxy发出的请求带上 connection:keep-alive的header。
这个事情涉及到前边讲到的三个组件
nginx proxy module, nginx upstream module, http server
http server需要支持http1.1,没有其他要求。
一
proxy module需要配置如下两个参数:
server { listen 0.0.0.0:5001; location / { proxy_pass http://httpt7/; proxy_http_version 1.1; proxy_set_header Connection ""; } }
因为默认proxy module设置了CONNECTION close的header。
二
upstream module需要设置,keepalive参数,代表同时存在的最多长连接数,没有该参数将不会启动长连接:
upstream httpt7 { server 192.168.7.1:80; keepalive 3; }
另外,curl keepalive的方法
curl -v -H "Connection: keep-alive" http://192.168.7.9:5001/