리버스 프록시시 nginx가 업스트림의 호스트 이름을 전달하도록 설정 server web3.local:80;

호스트 이름으로 여러 도커 컨테이너를 실행합니다.

web1.local web2.local web3.local

nginx에 의한 호스트 이름을 기반으로 수행됩니다. 이 설정 앞에 (인터넷에 연결된 다른 컴퓨터에서) 다음과 같이 업스트림을 정의하는 프록시가 있습니다.

    upstream main {
      server web1.local:80;
      server web2.local:80;
      server web3.local:80;
    }

실제 가상 호스트 설명 :

    server {
      listen 80;
      server_name example.com;
      location / {
        proxy_pass http://main;
      }
    }

이제 컨테이너는 “web1.local”대신 “main”호스트 이름을 수신하므로 요청에 제대로 응답하지 않습니다.

질문 : 요청을 프록시 할 때 Host : 헤더의 업스트림 서버 그룹 이름 대신 nginx에 업스트림 서버 이름을 전달하도록하려면 어떻게해야합니까?



답변

실제로 proxy_set_header를 통해 그렇게 할 수 있습니다.

자세한 내용은 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header를 참조하거나 여기에서 유스 케이스 예제를 참조하십시오. https://stackoverflow.com/questions/12847771/configure-nginx- with-proxy-pass

위의 게시 구성에 동적 접근 방식을 포함 시켰습니다.

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

정적 호스트 이름을 가진 예는 다음과 같습니다.

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            www.example.com;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}


답변

나는 같은 문제가 있었고 마침내 두 가지 수준의 프록시를 사용하여 문제를 해결했습니다. 다음은 상황에 맞는 방법입니다.

server {
  listen      8001 default_server;
  server_name web1.example.com;
  location / {
    proxy_pass       http://web1.local:80;
    proxy_set_header Host web1.local:80;
  }
}

server {
  listen      8002 default_server;
  server_name web2.example.com;
  location / {
    proxy_pass       http://web2.local:80;
    proxy_set_header Host web2.local:80;
  }
}

server {
  listen      8003 default_server;
  server_name web3.example.com;
  location / {
    proxy_pass       http://web3.local:80;
    proxy_set_header Host web3.local:80;
  }
}

upstream main {
  server 127.0.0.1:8001;
  server 127.0.0.1:8002;
  server 127.0.0.1:8003;
}

server {
  listen      80;
  server_name example.com;
  location / {
    proxy_pass http://main;
  }
}

보다시피 트릭은 각 서버에 적합한 호스트를 다시 작성하여 서버를 프록시 할 특정 포트에 응답하는 로컬 서버를 만드는 것입니다. 그런 다음 업스트림에서이 로컬 서버를 사용하고 실제 프록시에서 해당 업스트림을 사용할 수 있습니다.


답변

따라서 nginx에 대한 모든 문서를 읽음으로써 (실제로 업스트림 모듈 = ()에 대한 코드를 파싱 할 수 없었습니다.이 나쁜 해결책을 찾았습니다. 불행히도이 솔루션은 실패한 호스트를 추적하지는 않지만 무작위로 하나를 선택하고 요청을 리디렉션합니다. 모든 백엔드가 실행되도록 모니터링을 설정해야합니다.

server {
        listen 80;
        server_name example.com;
        resolver 127.0.0.1;

        location / {
                set $upstream "";
                rewrite_by_lua '
                        local upstreams = {
                                "http://web1.dokku.localdomain",
                                "http://web2.dokku.localdomain",
                                "http://web3.dokku.localdomain",
                                "http://web4.dokku.localdomain"
                        }
                        ngx.var.upstream = upstreams[ math.random( #upstreams ) ]
                ';
                proxy_pass $upstream;
        }
}


답변

업스트림 가산기를 이와 같은 별도의 헤더로 전달합니다.

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    add_header       X-Upstream      $upstream_addr;
  }
}

시도하면 어떻게 되나요?

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $upstream_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    add_header       X-Host          $host;
  }
}


답변

목표는 논리적으로 보이지만 nginx는 Host : 헤더를 업스트림과 일치하도록 변경하지 않습니다 . 대신, DNS에서 upstream도메인 이름 CNAME을 IP 주소로 가져 오는 방법으로 취급 합니다 .

요청 헤더 (및 본문)는 업스트림이 선택되기 전에 고정됩니다. 특정 업스트림이 응답하지 않는 것으로 확인되었지만 요청이 변경되지 않는 경우 요청 중반에 업스트림이 변경 될 수 있습니다.


답변

흠. 비슷한 설정을 가지고 있는데 간단하게 수행했습니다.

location / {
    ...
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_pass ...;
}

의 사용 $http_host(수신 요청의 HTTP 호스트 헤더) 여기가 아닌 $host(서버 호스트 이름 구성) 클라이언트에 의해 전달 된 동일한 호스트 헤더 내 테스트에서, 상류까지 전달됩니다.

https://stackoverflow.com/questions/14352690/change-host-header-in-nginx-reverse-proxy참조하십시오 .


답변

다른 사람들이 이미 $ upstream과 같은 스크립트 변수를 사용하여 게시 했으므로 원하는대로 설정할 수 있으며 추가 헤더 해킹없이 문제를 해결할 것입니다.

값이 조건부 (이름에 $가 없음)가 아닌 경우 프록시 패스 핸들러 위협 스크립트 변수는 구성 단계에서 업스트림으로 백업되어 나중에 사용됩니다.

이 문제를 생략하고 (무료 버전) 업스트림의 장점을 최대한 활용하는 간단한 방법은 다음과 같습니다 Split_Clients.

split_clients $request_uri $my_upstream {
              33%          server1.domainX.com;
              33%          server2.domainX.com;
# Always use DOT at end entry if you wonder why, read the SC code.
              *            server3.domainX.com;
}
location / {
    ...
    proxy_pass http://$my_upstream;
}

위의 예는 업스트림과 거의 동일하게 보입니다. 매핑을 수행하는 다른 모듈 (예 : chash_map_module )이 있지만 트리 외부에 있으므로 자체적으로 빌드해야합니다. 일부 사용 사례에서는 불가능합니다 /