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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM