动态更新nginx upstream服务节点
本脚本可运行于 openresty-1.13.6.2。其他版本未测试,请检查是否存在 cjson, ngx.upstream 模块。
本脚本主要用于动态更新 nginx upstream 中的 server,删除或添加 server 时立即生效,不需要 reload nginx。(限制条件:server 必须是 nginx.conf 配置文件中已经配置到 upstream 中的 server,不支持新增 server 到 upstream.)
以下是一个nginx.conf配置的例子:
http { ... ... lua_shared_dict upstreams 10m; upstream local { server 192.168.56.101:8080; server 192.168.56.101:8081 backup; server 192.168.56.101:8082; balancer_by_lua_file "./ngx_lua/upstream.lua"; check interval=3000 rise=2 fall=5 timeout=1000; } # 在配置server backup及健康检查时,也一样支持 # upstream local { # server 192.168.56.101:8080; # server 192.168.56.101:8081 backup; # server 192.168.56.101:8082; # balancer_by_lua_file "./ngx_lua/upstream.lua"; # check interval=3000 rise=2 fall=5 timeout=1000; # } server { ... ... location /local{ proxy_pass http://local; } location = /ups { default_type text/plain; content_by_lua_file "./ngx_lua/upsops.lua"; } location = /ups/check { default_type text/plain; content_by_lua_file "./ngx_lua/srvcheck.lua"; } } } 如果upstream中只有一个节点,或者通过本脚本删除upstream中的server节点只剩下一个节点时,本脚本会拒绝对此节点进行删除操作,保证 upstream 必须有可用的服务节点。
PUT请求:http://192.168.56.101/ups?op=del&server=192.168.56.101:8080 请求返回: {"msg":"del a server success.","data":["192.168.56.101:8080"],"code":"A00001"} data 为此次操作的目标 server。 PUT请求:http://192.168.56.101/ups?op=add&server=192.168.56.101:8080 请求返回: {"msg":"add a server success.","data":["192.168.56.101:8080"],"code":"A00001"} data 为此次操作的目标 server。 如果返回json的数据中 data 为空,说明 add server 或 del server请求已经生效,upstream已处理正常状态;如果 data 不为空,说明还没有客户端请求对应的 upstream ,只要有客户端请求到 upstream 就会生效,这不影响upstream保证只少有一个服务节点高可用。
PUT请求:http://192.168.56.101/ups/check 请求返回: {"msg":"OK","data":{"192.168.56.101:8080":1},"code":"A00001"} data 中 server 的值为1表示要删除的节点,值为0表示要恢复的节点;data 为空表示 upstream 处理正常状态。