[英]Balancer nginx based on value header
我是 nginx 新手,想請教一下。 我需要為平衡器編寫以下邏輯。 請求轉到公共地址 gate.mysite.com,然后代理到四個外部服務器 remote[1-4].server.com 之一。 如果請求包含帶有某個數字的標頭“X-Stamp”,則請求將路由到服務器,其數量使用公式 (X-Stamp mod 4)+1 計算。 如果沒有標題“X-Stamp”,則為循環。 此外,還有以下路由規則:
gate1.mysite.com -> remote1.server.com
gate2.mysite.com -> remote2.server.com
gate3.mysite.com -> remote3.server.com
gate4.mysite.com -> remote4.server.com
我使用 nginx openresty 編寫了這樣的配置。
http {
upstream host1 {
server remote1.server.com:443;
}
upstream host2 {
server remote2.server.com:443;
}
upstream host3 {
server remote3.server.com:443;
}
upstream host4 {
server remote4.server.com:443;
}
upstream all {
server remote1.server.com:443;
server remote2.server.com:443;
server remote3.server.com:443;
server remote4.server.com:443;
}
server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name gate.mysite.com;
...
location / {
set $num_header_glob '';
rewrite_by_lua_block {
--reading request headers
local req_headers = ngx.req.get_headers()
local num_header = ""
-- checking an a header value to determine target uri
if req_headers["X-Stamp"] then
num_header = ((req_headers["X-Stamp"])%4)+1
else
-- default path if not header found
num_header = "5"
end
ngx.log(ngx.NOTICE, string.format("resolved num_header: %s", num_header))
ngx.var.num_header_glob = num_header
}
proxy_pass https://$target_uri;
}
}
map $num_header_glob $target_uri {
"1" "host1";
"2" "host2";
"3" "host3";
"4" "host4";
"5" "all";
}
}
server {
listen 443 ssl;
server_name gate1.mysite.com;
...
location / {
proxy_pass https://host1;
}
}
server {
listen 443 ssl;
server_name gate2.mysite.com;
...
location / {
proxy_pass https://host2;
}
}
server {
listen 443 ssl;
server_name gate3.mysite.com;
...
location / {
proxy_pass https://host3;
}
}
server {
listen 443 ssl;
server_name gate4.mysite.com;
...
location / {
proxy_pass https://host4;
}
}
}
但是我需要用以下條件來補充它——如果我在響應中收到一個 HTTP-status 307,我需要替換傳輸給客戶端的 HTTP 標頭 Location 值
"remote1.server.com" to "gate1.mysite.com"
"remote2.server.com" to "gate2.mysite.com"
"remote3.server.com" to "gate3.mysite.com"
"remote4.server.com" to "gate4.mysite.com"
如何實施?
您正在尋找的是header_filter
階段。 就像是:
header_filter_by_lua_block {
if ngx.status == 307 then
ngx.header["Location"] = (ngx.header["Location"] or ""):gsub("://remote(%d).server.com", "://gate%1.mysite.com")
end
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.