动态location
1.功能说明
本系统支持对配置的server中的location进行动态的添加、删除,可以对locaiton进行便捷的配置和所需指令功能的添加使用。
2.依赖模块
动态location功能依赖:
njet.conf
load_module modules/njt_http_location_module.so;
njet_ctrl.conf
load_module modules/njt_http_location_api_module.so;
3.配置说明
使用动态location功能需要在njet.conf中配置
load_module modules/njt_http_location_module.so;
在njet_ctrl.conf中配置
load_module modules/njt_http_sendmsg_module.so;
load_module modules/njt_http_location_api_module.so;
http {
server {
listen 8081;
location /api {
dyn_module_api;
}
}
}
4.API说明
添加接口:
POST http://IP+port/api/v1/dyn_loc
删除接口:
PUT http://IP+port/api/v1/dyn_loc
动态location增加说明:
配置项 | 必填 | 配置说明 |
---|---|---|
type | 是 | “add” 添加location |
addr_port | 是 | 添加的主机的,port 端口。 例如:“192.168.40.203:8000”, 或 “0.0.0.0:8000” |
server_name | 是 | 主机的server_name, 例如:“cluster.tmlake.com” |
locations | 是 | List 对象列表。 对象字段:location_rule,//可以为空。 location_name, //不能为空。location_body, 结尾不要带,暂时不支持if指令和包含zone的指令;proxy_pass 结尾不要带; |
特别说明:
location_body 或 proxy_pass 字段均可以为空。
proxy_pass 现在支持http,https,ip地址,unix socket,域名,变量等。(例如:http://backend1、https://backend1、http://127.0.0.1:443、http://$upstream_name、http://unix:/var/lib/njet/njet-502-server.sock等)
动态location删除说明:
配置项 | 必填 | 配置说明 |
---|---|---|
type | 是 | “del” 删除location |
addr_port | 是 | 添加的主机的,port 端口。 例如:“192.168.40.203:8000”, 或 “0.0.0.0:8000” |
server_name | 是 | 主机的server_name, 例如:“cluster.tmlake.com” |
location_rule | 否 | Location 的表达式, 例如:“=” 或 其他的正则式 |
location_name | 是 | location的名字,也就是表达式后面的。 例如: “/” 或 “/test” |
说明:
添加的嵌套location, 删除时只能通过根location一并删除,不支持直接删除子location。
5.调用样例
5.1 post 添加
回显{“code”:0,“msg”:“success."}即为添加成功。
curl -v -s -X POST http://127.0.0.1:8081/api/v1/dyn_loc -d '{"type":"add","addr_port":"0.0.0.0:8899","server_name":"cluster1","locations":[{"location_rule":"","location_name":"/","location_body":"","proxy_pass":"http://http1"}]}'
> POST /dyn_location HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1:8081
> Accept: */*
> Content-Length: 149
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 149 out of 149 bytes
< HTTP/1.1 200 OK
< Server: njet/1.23.1
< Date: Mon, 22 May 2023 07:22:30 GMT
< Content-Type: application/json
< Content-Length: 27
< Connection: keep-alive
<
* Connection #0 to host 127.0.0.1 left intact
{"code":0,"msg":"success."}
5.2 put 删除
动态location功能也支持动态进行删除操作,以下将展示如何进行验证:
进行动态删除location操作:
curl -v -s -X PUT http://127.0.0.1:8081/api/v1/dyn_loc -d '{"type":"del","addr_port":"0.0.0.0:8899","server_name":"cluster1","location_rule":"","location_name":"/"}'
> PUT /dyn_location HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1:8081
> Accept: */*
> Content-Length: 105
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 105 out of 105 bytes
< HTTP/1.1 200 OK
< Server: njet/1.23.1
< Date: Mon, 22 May 2023 07:38:36 GMT
< Content-Type: application/json
< Content-Length: 27
< Connection: keep-alive
<
* Connection #0 to host 127.0.0.1 left intact
{"code":0,"msg":"success."}
再次请求之前的上游资源,可以发现已经请求失败,删除成功:
curl -v -s http://127.0.0.1:8899/1.html
> GET /1.html HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1:8899
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Server: njet/1.23.1
< Date: Mon, 22 May 2023 07:39:55 GMT
< Content-Type: text/html
< Content-Length: 152
< Connection: keep-alive
<
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>njet/1.23.1</center>
</body>
</html>
* Connection #0 to host 127.0.0.1 left intact
6.location功能增强
6.1 功能说明:
location现在支持根据表达式进行判断。
1)支持所有变量匹配 2)支持逻辑与和逻辑或运算 3)顺序匹配多添加location,都不满足走正常location 路径匹配。 4)操作符:=,!= ,正则。
6.2 静态配置文件示例
server {
listen 80;
location ( $http_host = www.test.com && $http_user_agent ~= windows) {
return 200 " www.test.com && http_user_agent ~= window ";
}
location ( $uri = "/delete" || $request_method = DELETE) {
return 200 $remote_addr":delete";
}
location ( $remote_addr = "192.168.40.203" && $request_method = PUT && $uri ~* .png$) {
proxy_pass
}
location ( $remote_addr = "192.168.40.203" && $request_method = PUT && $uri ~* .png$) {
proxy_pass http://backend1;
}
}
6.3 动态新增方法示例
1)多个与(&&)变量locaiton添加
{
"type": "add",
"addr_port": "0.0.0.0:8888",
"server_name": "cluster1",
"locations": [{
"location_rule": "",
"location_name": "( $remote_addr = \"192.168.40.203\" && $request_method = PUT && $uri ~* .png$)",
"location_body": "return 200 $remote_addr\":PUT*.png\""
}]
}
2)多个与(&&)否(!=)变量添加
{
"type": "add",
"addr_port": "0.0.0.0:8888",
"server_name": "cluster1",
"locations": [{
"location_rule": "",
"location_name": "( $remote_addr = \"192.168.40.203\" && $request_method = PUT && $uri != \"/1.png\")",
"location_body": "return 200 $remote_addr\":PUT*.png\""
}]
}
3)多个或(||)变量添加
{
"type": "add",
"addr_port": "0.0.0.0:8888",
"server_name": "cluster1",
"locations": [{
"location_rule": "",
"location_name": "( $uri = \"/delete\" || $request_method = DELETE || $remote_addr = \"192.168.40.203\")",
"location_body": "return 200 $remote_addr\":delete\""
}]
}
4)正则方式添加
{
"type": "add",
"addr_port": "0.0.0.0:8888",
"server_name": "cluster1",
"locations": [{
"location_rule": "",
"location_name": "($uri ~* .(mp4|jpg|gif)$ && $server_port ~ \\d)",
"location_body": "",
"proxy_pass":"http://http1"
}]
}
5)与(||)或(&&)多变量添加
{
"type": "add",
"addr_port": "0.0.0.0:8888",
"server_name": "cluster1",
"locations": [{
"location_rule": "",
"location_name": "( $remote_addr = \"192.168.40.203\" || $uri ~* .(mp4|jpg|gif)$ && $request_method = PUT)",
"location_body": "",
"proxy_pass":"http://http1"
}]
}
6.4 注意事项
1)mirror 指令:
在使用mirror指令时location 条件一定要包含uri 的条件,避免重新路由时,条件总是满足类似($remote_addr = “192.168.40.104” && $server_port = “6969”)这种不包含uri路径的条件,造成mirror 失败。
location ($uri = "/" && $remote_addr = "192.168.40.104" && $server_port = "6969"){
mirror /mirror1;
mirror /mirror2;
proxy_pass http://backend;
}
2)表达式location的执行顺序为由上到下、由先到后依次执行,在添加表达式location时需要注意先后顺序。
3)location 名称:因在增强功能中需要对表达式进行处理,所以njet会将”(“作为关键词进行处理,在locaiton使用中,无法单独将location_name设置为”(“起始进行使用,如若检测到location_name是以”(“起始,而没有”)“时,njet即会出现报错,不予处理。
例如:
location ( {
return 200 ok;
}
在nginx 下能,正常使用。 而在njet 里 会被识别不完整的表达式,并提示错误。