簡體   English   中英

基於值頭的平衡器nginx

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM