Add geo routing to different backends for same domain

This commit is contained in:
Thomas Lynch
2025-03-15 12:45:22 +11:00
parent c0a2f77f8b
commit 84ddfbc719
9 changed files with 74 additions and 27 deletions

View File

@@ -1,19 +1,37 @@
package.path = package.path .. "./?.lua;/etc/haproxy/scripts/?.lua;/etc/haproxy/libs/?.lua"
package.path = package.path .. "./?.lua;/etc/haproxy/scripts/?.lua;/etc/haproxy/libs/?.lua"
local bot_check = require("bot-check")
local utils = require("utils")
local server_cn_split_regex = "([^;]+);(%u%u)$"
local backends_map = Map.new('/etc/haproxy/map/backends.map', Map._str)
function get_server_names(txn)
local key = txn.sf:hdr("Host")
local user_cn = txn:get_var("txn.xcn") or "XX"
local value = backends_map:lookup(key or "")
if value ~= nil then
local filtered_backends = {}
local all_backends = {}
local vals = utils.split(value, ",")
-- todo: something smarter?
return vals[math.random(#vals)]
else
return ""
-- Single pass to filter and collect backends
for _, backend in ipairs(vals) do
local backend_server_name, server_cn = backend:match(server_cn_split_regex)
if backend_server_name then
table.insert(all_backends, backend_server_name)
if server_cn == user_cn or server_cn == "XX" then
table.insert(filtered_backends, backend_server_name)
end
end
end
-- Randomly select from filtered backends if available
if #filtered_backends > 0 then
return filtered_backends[math.random(#filtered_backends)]
elseif #all_backends > 0 then
-- If no filtered backends, randomly select from all backends
return all_backends[math.random(#all_backends)]
end
end
return ""
end
core.register_fetches("get_server_names", get_server_names)