67 lines
1.6 KiB
Lua
67 lines
1.6 KiB
Lua
http = require "resty.http"
|
|
def_backend = "upstream-default-backend"
|
|
|
|
local concat = table.concat
|
|
local upstream = require "ngx.upstream"
|
|
local get_servers = upstream.get_servers
|
|
local get_upstreams = upstream.get_upstreams
|
|
local random = math.random
|
|
local us = get_upstreams()
|
|
|
|
function openURL(status)
|
|
local httpc = http.new()
|
|
|
|
local random_backend = get_destination()
|
|
local res, err = httpc:request_uri(random_backend, {
|
|
path = "/",
|
|
method = "GET",
|
|
headers = {
|
|
["X-Code"] = status or "404",
|
|
["X-Format"] = ngx.var.httpAccept or "html",
|
|
}
|
|
})
|
|
|
|
if not res then
|
|
ngx.log(ngx.ERR, err)
|
|
ngx.exit(500)
|
|
end
|
|
|
|
if ngx.var.http_cookie then
|
|
ngx.header["Cookie"] = ngx.var.http_cookie
|
|
end
|
|
|
|
ngx.status = tonumber(status)
|
|
ngx.say(res.body)
|
|
end
|
|
|
|
function get_destination()
|
|
for _, u in ipairs(us) do
|
|
if u == def_backend then
|
|
local srvs, err = get_servers(u)
|
|
local us_table = {}
|
|
if not srvs then
|
|
return "http://127.0.0.1:8181"
|
|
else
|
|
for _, srv in ipairs(srvs) do
|
|
us_table[srv["name"]] = srv["weight"]
|
|
end
|
|
end
|
|
local destination = random_weight(us_table)
|
|
return "http://"..destination
|
|
end
|
|
end
|
|
end
|
|
|
|
function random_weight(tbl)
|
|
local total = 0
|
|
for k, v in pairs(tbl) do
|
|
total = total + v
|
|
end
|
|
local offset = random(0, total - 1)
|
|
for k1, v1 in pairs(tbl) do
|
|
if offset < v1 then
|
|
return k1
|
|
end
|
|
offset = offset - v1
|
|
end
|
|
end
|