Nginx

Nginx 根據 args 選擇上游

  • October 25, 2018

我需要兩組不同的上游。但是我所有的請求都來自同一個 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;
}

來源:nginx 根據 http 標頭使用不同的後端

在作為未來的我回到這里之後添加:為了輕鬆測試伺服器,您可以在 chrome 中安裝一個擴展(我使用 ModHeader),它允許您修改請求標頭。

引用自:https://serverfault.com/questions/561993