Nginx 根据参数选择上游

Nginx 根据参数选择上游

我需要两组不同的上游。但我的所有请求都来自同一个 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 中,并根据这一点使用位置池 1 或池 2。

知道如何实现这个吗?

谢谢!

答案1

@hellvinz 说得对。我无法发表评论,所以我要再回答一次。

location / {
   if($myArg = "otherPool") {
       rewrite  ^/(.*)$ /otherUpstream/$1 last;
     } 
   try_files $uri pool1;
}

location /otherUpstream {
     proxy_pass http://@pool2;
}

我认为您必须将 $myArg 更改为您正在测试的查询参数的名称,并将 otherPool 更改为您设置的任何名称。此外,重写尚未测试,所以我可能也错了,但您明白我的意思。

答案2

我想提出一个替代版本没有 if声明。我知道这是一个老问题,但未来的谷歌用户可能仍然会发现这很有帮助。

我必须承认这也意味着改变选择上游的方式。但我认为这样做没有问题。

这个想法是随请求发送自定义 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) 允许您修改请求标头。

答案3

您可以使用如果测试包含的参数$参数

相关内容