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에 있는지 확인하고 이에 따라 위치 pool1 또는 pool2를 사용하는 방법입니다.

이것을 어떻게 구현할 수 있을까요?

감사해요!

답변1

@hellvinz 말이 맞아요. 댓글을 달 수 없어서 다른 답변을 드리겠습니다.

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

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

$myArg를 테스트 중인 쿼리 매개변수의 이름으로 변경하고 otherPool을 설정한 이름으로 변경해야 할 것 같습니다. 게다가 재작성은 테스트되지 않았기 때문에 나도 틀렸을 수도 있지만 아이디어는 얻을 수 있습니다.

답변2

나는 이것의 대체 버전을 제안하고 싶습니다.만약 없이성명. 나는 이것이 오래된 질문이라는 것을 알고 있지만 미래의 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 헤더를 기반으로 다른 백엔드를 사용합니다.

미래의 나로 돌아온 후 추가됨: 서버를 쉽게 테스트하려면 크롬에 확장 프로그램을 설치할 수 있습니다(ModHeader를 사용합니다)을 사용하면 요청 헤더를 수정할 수 있습니다.

답변3

당신은 사용할 수 있습니다만약에포함된 매개변수 테스트$arg

관련 정보