前言
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/