2015-08-13 34 views
6

我有一個nginx服務器,配置爲使用queryparam作爲上游哈希。網址看起來像下面如何使用url路徑名作爲nginx中的上游哈希

http://www.my-server.com/xyz/WXYZ?abc=123 

和配置,下面

upstream test { 
    hash $arg_abc; 
    .... 
} 

是否有可能使用URL作爲上游散列WXYZ一部分?

WXYZ是動態值,並且xyz始終是相同的並且將在那裏。

這是我試過,

location ~ ^/xyz/(.).*$ { 
    hash $1 
} 
+0

您是否解決了問題? – Anatoly

回答

6

The deployment guide明確地說,這是可能的:

通用散列方法:於從用戶定義的密鑰確定 被髮送的請求,其可以是文本,變量或 其組合的服務器。例如,該密鑰可以是源IP地址和端口, 或URI:

upstream backend { 
    hash $request_uri consistent; 

    server backend1.example.com; 
    server backend2.example.com; 
} 

散列密鑰$ REQUEST_URI其可與$ arg_your_key但不能確定替換是作品與上游塊,但是它應該工作作爲proxy_pass值:

location /xyz { 
    proxy_pass http://localhost/$uri$is_args$args; 
} 

不知道的要求,但如果你需要使用某些後端基於參數$ arg_abc你需要地圖功能,像here

map $arg_abc $backend_server { 
default 'serverdefault.domain.com:80'; 
123 'server1.domain.com:80'; 
234 'server2.domain.com:80'; 
345 'server3.domain.com:80'; 
} 

server { 
location/{ 
    proxy_pass http://$backend_server; 
} 
} 
2

是,按照該文檔hash,你只能用它在upstream背景下,所以你已經嘗試將無法確實工作。

但是,爲什麼你只需要使用URI中的特定路徑,而不是整個事物,如果其他部分保持不變呢?我認爲這個想法是,整個字符串應該被進一步散列,所以,即使所有的URL都是相同的,散列函數仍然應該均勻地分配一切。所以,你很可能只是使用$request_uri$uri作爲你的散列。

另外,如果您仍然希望做你的方式,你可以嘗試使用命名模式匹配您的locationlocation ~ ^/xyz/(?<varForHash>.).*$ {…),然後用從這樣的比賽($varForHash)變量爲您hash(你很可能連從您的示例中也可以使用$1,只需在正確的背景下— upstream)。

+0

你可以爲第二種方式發佈一些代碼嗎?我在這裏有點困惑,因爲我在做你的第二個例子 – Exception

+0

我做錯了,你在'location'內有'hash'指令,而它應該在'upstream'上下文中;只需將其從「位置」移到「上游」,這可能有用;但即使是這樣,使用上面的「命名捕獲」也是一個更好的主意。 – cnst

1

我得到了類似的任務,我解決了它。 我創建upstream.conf並將其添加到nginx.conf。 upstream.conf內容如下:

map $uri $myvar{ 
    default $uri; 
    # pattern "Method1" + "/" + GUID + "/" + target parameter + "/" + HASH; 
    "~*/Method1/(.*)/(.*)/(.*)$" $2; 
    # pattern "Method2" + "/" + GUID + "/" + target parameter; 
    "~*/Method2/(.*)/(.*)$" $2; 
} 


upstream backend { 
    hash $myvar consistent; 
    server s1:80; 
    server s2:80; 
}