[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/

 

posted on 2020-09-10 21:57  toong  阅读(1781)  评论(0编辑  收藏  举报