Eu executo vários contêineres de docker com nomes de host:
web1.local web2.local web3.local
O roteamento para estes é feito com base no nome do host pelo nginx. Eu tenho um proxy na frente desta configuração (em uma máquina diferente conectada à Internet) onde eu defino o upstream como:
upstream main {
server web1.local:80;
server web2.local:80;
server web3.local:80;
}
E descrição real do host virtual:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://main;
}
}
Agora, como os contêineres recebem o nome do host "main" em vez de "web1.local", eles não respondem corretamente à solicitação.
Pergunta: como posso dizer ao nginx para passar o nome do servidor upstream em vez do nome do grupo upstream de servidores no cabeçalho Host: ao solicitar o proxy?
nginx
reverse-proxy
pavel_karoukin
fonte
fonte
Respostas:
Na verdade, você pode fazer isso via proxy_set_header.
Para obter mais detalhes, consulte aqui: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header ou veja um exemplo de caso de uso aqui: https://stackoverflow.com/questions/12847771/configure-nginx- com-proxy-pass
Eu incluí a abordagem dinâmica na sua configuração postada acima:
Aqui está um exemplo com um nome de host estático:
fonte
site1.myisp.com
esite2.myisp.com
e eles só respondem ao respectivo nome. Agora, sou o proprietário do meu nome de domínio e gostaria de usar o site do ISP para equilibrar a carga em meus servidores. Essa não é uma boa razão? Muito obrigado;)Eu tive o mesmo problema e finalmente o resolvi usando dois níveis de proxy. Aqui está como você poderia fazer por sua situação (eu acho):
Como você pode ver, o truque é criar um servidor local que responda a uma porta específica que fará proxy do servidor, reescrevendo o host correto para cada servidor. Em seguida, você pode usar esses servidores locais no seu upstream e, finalmente, usá-lo no proxy real.
fonte
Então, ao ler toda a documentação do nginx (eu realmente não consegui analisar o código do módulo upstream = (), eu vim com essa solução bastardizada. Infelizmente, essa solução não controla os hosts com falha, mas simplesmente seleciona um aleatório e redireciona a solicitação para ele. Portanto, tenho que configurar algum tipo de monitoramento para garantir que todos os back-ends estejam em execução.
fonte
Passamos no endereço upstream como um cabeçalho separado como este
E se você tentasse?
fonte
Embora o objetivo pareça lógico, o nginx não mudará o cabeçalho Host: para corresponder ao upstream . Em vez disso, trata
upstream
nomes de domínio como umCNAME
no DNS - como uma maneira de acessar um endereço IP.Os cabeçalhos da solicitação (e o corpo) são corrigidos antes da seleção do upstream. O upstream pode mudar no meio da solicitação se um determinado upstream não responder, mas a solicitação não muda.
fonte
Hmm. Eu tenho uma configuração semelhante, na qual eu simplesmente fiz
O uso de
$http_host
(o cabeçalho do host HTTP da solicitação de entrada) aqui em vez de$host
(a configuração do nome do host do servidor) faz com que o mesmo cabeçalho do host passado pelo cliente seja passado para o upstream no meu teste.Consulte também https://stackoverflow.com/questions/14352690/change-host-header-in-nginx-reverse-proxy .
fonte
Como outras pessoas já postaram usando a variável de script (como $ upstream), você pode configurá-lo da maneira que desejar, e isso corrigirá o problema, sem invasão adicional do cabeçalho.
As variáveis de script de ameaça do manipulador do Proxy Pass de uma maneira diferente, se um valor não for condicional (não tiver $ no nome) for feito backup no upstream na fase de configuração e usado posteriormente.
Uma maneira simples de omitir esse problema e ter as vantagens de (versão gratuita) upstream seria usar algo como
Split_Clients
:O exemplo acima parece quase o mesmo que upstream. Existem outros módulos para o mapeamento, por exemplo , chash_map_module , mas como eles estão fora da árvore, você precisará construí-los por conta própria, o que não é possível em alguns casos de uso /
fonte