Existe uma variável nginx para o endereço do servidor upstream não resolvido?

Existe uma variável nginx para o endereço do servidor upstream não resolvido?

Ao usar o nginx como proxy reverso para um grupo de servidores em um bloco upstream, existe uma variável que corresponde ao nome do servidor não resolvido? Por exemplo, considere a seguinte configuração:

http {
    upstream foo {
        server foo1.example.com:8080;
        server foo1.example.com:8081;
        server foo2.example.com:8080;
        server foo2.example.com:8081;
    }
    server {
        server_name foo.example.com;
        location / {
            proxy_pass http://foo;
        }
    }
}

Sejam foo.example.com, foo1.example.come foo2.example.comnomes definidos que resolvem para 192.0.2.1, 192.0.2.2 e 192.0.2.3, respectivamente.

Suponha que uma solicitação chegue foo.example.come o nginx decida escolher foo2.example.coma porta 8080 como o servidor upstream e a solicitação seja bem-sucedida. Então, que eu saiba, estes serão os valores de algumas variáveis ​​relevantes:

  • $host = foo.example.com
  • $proxy_host = foo
  • $upstream_addr = 192.0.2.3:8080(*)

No entanto, nenhum deles corresponde ao valor fornecido na configuração do servidor upstream. Então, mais especificamente, minha pergunta é: qual variável, se houver, terá o valor foo2.example.com:8080neste caso?

Para evitar o problema XY, estas são as coisas que estou tentando realizar:

  1. registrar o servidor upstream por nome de host em vez de endereço IP, pois o endereço IP resolvido pode ser temporário ou pode não suportar pesquisa reversa 1:1
  2. para mapo servidor upstream para outra informação que seja mais útil, também para fins de registro
  3. configurar a verificação de nome de host (por exemplo, via proxy_ssl_name) para SSL upstream quando os servidores não compartilham o mesmo certificado (isso pode justificar uma questão própria, mas não é o único caso de uso)

(*) = A variável $upstream_addrnão parece estar disponível em todos os estágios da solicitação, por exemplo, adicionar proxy_set_header Upstream-Addr $upstream_addr;ao bloco location parece não ter efeito, implicando que a variável está vazia

Responder1

Os proxies podem ser complicados. Nginx proxy_set_headeré o que você quer.Documentos Nginx

proxy_set_header    Host            $host;

Olhe aquiPor exemplode uma configuração mais detalhada para proxies

informação relacionada