• [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/
  • 相关阅读:
    Revit 二次开发 交互及UIAPI之TaskDialog
    Revit 二次开发 交互及UIAPI之Selection
    Revit 二次开发 元素创建与修改练习
    编译带libev和libuv的libwebsocket (Win平台)
    sqlite3存储格式
    MAC OS下编译apple跨平台的libevent库 (可延申到其它第三库)
    Unix, Linux以及NT内核和它们各自衍生的系统关系图
    简单地迁移你的android jni代码逻辑到iOS
    使用ndk交叉编译android各平台版本的第三方库
    使用Android Studio进行ndk开发的准备
  • 原文地址:https://www.cnblogs.com/hugetong/p/13648710.html
Copyright © 2020-2023  润新知