动态proxy_pass

1. 功能说明

动态proxy_pass功能,可以通过动态API接口,更新proxy_pass指令中配置的upstream名。

该功能主要为了满足以下场景:

  • location中通过proxy_pass 指令,配置了静态的upstream 名。但在业务需要时,能动态切换upstream 名,而不需要重新重启服务的情况。例如:从测试环境,向正式环境切换时。
  • 相比proxy_pass 变量方式,有更好的性能。

2. 依赖模块

动态proxy_pass功能依赖模块:

load_module modules/njt_http_dyn_proxy_pass_module.so;

3.配置说明

Syntax: proxy_pass URL;
Default:
Context: http location, if in location, limit_except stream server

URL = schema + name + args

schema: http,https

name: ip,域名,upstream 名字, 变量,套接字

args: (参数,变量)

示例:

upstream 名(http 或 https) proxy_pass http://backend1$request_uri

使用限制:

  • Location 必须事先,配置了proxy_pass 指令。
  • upstream 名,要在配置文件,预先定义好(有zone 的server 列表也可以空)。
  • 不能修改 schema,只能修改upstream 名,ip, 域名,参数。
  • If limit_except指令中配置proxy_pass暂不支持

4. 调用样例

4.1 API说明

查询接口:

GET http://IP+port/api/v1/config/proxy_pass

修改接口:

PUT http://IP+port/api/v1/config/proxy_pass

4.2 查询当前配置的proxy_pass

通过curl进行查询

curl -X GET http://127.0.0.1:5054/api/v1/config/proxy_pass

返回

{
  "servers": [
    {
      "listens": [
        "0.0.0.0:5888"
      ],
      "serverNames": [
        "localhost"
      ],
      "locations": [
        {
          "location": "/",
          "proxy_pass": "http://backend1"
        },
        {
          "location": "/proxy_pass",
          "proxy_pass": "http://backend2"
        }
      ]
    },
    {
      "listens": [
        "0.0.0.0:5889"
      ],
      "serverNames": [
        ""
      ],
      "locations": [
        {
          "location": "/",
          "proxy_pass": ""
        }
      ]
    },
    {
      "listens": [
        "0.0.0.0:5890"
      ],
      "serverNames": [
        ""
      ],
      "locations": [
        {
          "location": "/",
          "proxy_pass": ""
        }
      ]
    }
  ]
}

4.3 动态修改schema值为http的proxy_pass

curl -X PUT http://127.0.0.1:5054/api/v1/config/proxy_pass -d '{
  "servers": [
    {
      "listens": [
        "0.0.0.0:5888"
      ],
      "serverNames": [
        "localhost"
      ],
      "locations": [
        {
          "location": "/",
          "proxy_pass": "http://backend2"
        },
        {
          "location": "/proxy_pass",
          "proxy_pass": "http://backend1"
        }
      ]
    }
  ]
}'

返回

{"code":0,"msg":"success."}

4.5 动态修改schema值为https的proxy_pass

curl -X PUT http://127.0.0.1:5054/api/v1/config/proxy_pass -d '{
  "servers": [
    {
      "listens": [
        "0.0.0.0:5888"
      ],
      "serverNames": [
        "localhost"
      ],
      "locations": [
        {
          "location": "/",
          "proxy_pass": "https://backend2"
        },
        {
          "location": "/proxy_pass",
          "proxy_pass": "https://backend1"
        }
      ]
    }
  ]
}'

返回

{"code":0,"msg":"success."}

4.4 修改proxy_pass从upstream名变更为upstream名+变量

curl -X PUT http://127.0.0.1:5054/api/v1/config/proxy_pass -d '{
  "servers": [
    {
      "listens": [
        "0.0.0.0:5888"
      ],
      "serverNames": [
        "localhost"
      ],
      "locations": [
        {
          "location": "/",
          "proxy_pass": "https://backend2"
        },
        {
          "location": "/proxy_pass",
          "proxy_pass": "https://backend1$request_uri"
        }
      ]
    }
  ]
}'

返回

{"code":0,"msg":"success."}