Use o grupo upstream nginx com várias portas

5

Eu gostaria de usar a mesma definição upstream com várias portas:

upstream production {
    server 10.240.0.26;
    server 10.240.0.27;
}
server {
    listen 80;
    server_name some.host;
    location / {
        proxy_pass http://production:1234;
    }
}
server {
    listen 80;
    server_name other.host;
    location / {
        proxy_pass http://production:4321;
    }
}

Usando essa configuração nginx -t lances: upstream "production" may not have port 1234 e retorna com o código de saída 1.

Quando tento definir a proxy_pass URL (ou partes de) como uma variável como:

set $upstream_url "http://production:1234"
set $upstream_host production;
set $upstream_port 1234;
proxy_pass $upstream_url;
# or
proxy_pass http://production:$upstream_port;
# or
proxy_pass http://$upstream:$upstream_port;

O Nginx tenta resolver o nome do meu upstream via resolver:

 *16 no resolver defined to resolve production, client: ...., server: some.host, request: "GET / HTTP/1.1", host: "some.host"

Para mim, o doc_proxy_pass soa como se exatamente isso não devesse acontecer;

A server name, its port and the passed URI can also be specified using variables:

proxy_pass http://$host$uri; or even like this:

proxy_pass $request; In this case, the server name is searched among the described server groups, and, if not found, is determined using a resolver.

Testado com versões nginx:

  • 1,6
  • 1,9
  • 1,10
  • 1,11

Estou faltando alguma coisa? Existe uma maneira de contornar isso?

    
por jayme 29.12.2016 / 17:37

2 respostas

8

Você deve definir a porta em cada entrada server em upstream . Se você não fizer isso, o nginx irá configurá-lo para 80 . Então server 10.240.0.26; significa server 10.240.0.26:80; .

Você pode definir vários blocos upstream:

upstream production_1234 {
    server 10.240.0.26:1234;
    server 10.240.0.27:1234;
}
upstream production_4321 {
    server 10.240.0.26:4321;
    server 10.240.0.27:4321;
}
server {
    listen 80;
    server_name some.host;
    location / {
        proxy_pass http://production_1234;
    }
}
server {
    listen 80;
    server_name other.host;
    location / {
        proxy_pass http://production_4321;
    }
}

Outra opção é configurar o DNS local para resolver o nome do host production para vários IPs e, nesse caso, o nginx utilizará todos eles.

http://nginx.org/r/proxy_pass: If a domain name resolves to several addresses, all of them will be used in a round-robin fashion.

server {
    listen 80;
    server_name some.host;
    location / {
        proxy_pass http://production:1234;
    }
}
    
por 29.12.2016 / 18:55
2

Quando você usa upstreams, as portas são definidas nos blocos upstream:

upstream production {
    server 10.240.0.26:8080;
    server 10.240.0.27:8081;
}

Em outras palavras, o nginx resolve o argumento proxy_pass para um grupo upstream ou um par host:port . Quando você usa uma variável como argumento, ela só resolve para host:port par.

    
por 29.12.2016 / 18:08

Tags