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.com
e foo2.example.com
nomes 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.com
e o nginx decida escolher foo2.example.com
a 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:8080
neste caso?
Para evitar o problema XY, estas são as coisas que estou tentando realizar:
- 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
- para
map
o servidor upstream para outra informação que seja mais útil, também para fins de registro - 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_addr
nã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