Nginx
Nginx 根據 args 選擇上游
我需要兩組不同的上游。但是我所有的請求都來自同一個 URL(同一個路徑)。不同之處在於有些請求會有一個特殊的參數,而有些則沒有。根據這一點,我需要選擇使用哪個上游。這是我的配置文件範例的不完整部分:
server_name localhost; root /var/www/something/; upstream pool1 { server localhost:5001; server localhost:5002; server localhost:5003; } upstream pool2 { server localhost:6001; server localhost:6002; server localhost:6003; } location / { # this is the part where I need help try_files $uri @pool1; } location @pool1 { include fastcgi_params; fastcgi_pass pool1; } location @pool2 { include fastcgi_params; fastcgi_pass pool2; }
所以……我不知道的部分是如何檢查參數/參數是否在 URL 中,並根據它使用位置 pool1 或 pool2。
知道如何實現嗎?
謝謝!
@hellvinz 是對的。我無法發表評論,所以我正在做另一個答案。
location / { if($myArg = "otherPool") { rewrite ^/(.*)$ /otherUpstream/$1 last; } try_files $uri pool1; } location /otherUpstream { proxy_pass http://@pool2; }
我認為您必須將 $myArg 更改為您正在測試的查詢參數的名稱,並將 otherPool 更改為您設置的任何名稱。加上重寫是未經測試的,所以我也可能有這個錯誤,但你明白了。
我想提出一個沒有 if語句的替代版本。我知道這是一個較老的問題,但未來的Google人可能仍然會覺得這很有幫助。
我必須承認這也意味著改變你選擇上游的方式。但我看不出這樣做有什麼問題。
想法是隨請求發送自定義 HTTP 標頭(X-Server-Select)。這允許 nginx 然後選擇正確的池。如果標題不存在,將選擇預設值。
您的配置可能會變成這樣:
upstream pool1 { server localhost:5001; server localhost:5002; server localhost:5003; } upstream pool2 { server localhost:6001; server localhost:6002; server localhost:6003; } # map to different upstream backends based on header map $http_x_server_select $pool { default "pool1"; pool1 "pool1"; pool2 "pool2"; } location / { include fastcgi_params; fastcgi_pass $pool; }
在作為未來的我回到這里之後添加:為了輕鬆測試伺服器,您可以在 chrome 中安裝一個擴展(我使用 ModHeader),它允許您修改請求標頭。