Nginx: como definir o cabeçalho do host para o servidor escolhido (balanceamento de carga)

10

Eu tenho um site que funciona como balanceador de carga. Site A.

Eu tenho outros sites que só podem ter um domínio. Então, se eu apenas redirecionar para eles, ele diz o nome do host não encontrado.

Portanto, se eu definir manualmente o cabeçalho para algo, apenas esse site será exibido.

Como posso definir o proxy_set_header Host xxxxendereço do servidor escolhido. Dessa forma, cada solicitação de novo roteamento terá um cabeçalho de host diferente e apropriado.

Não será um problema se meus outros 2 sites funcionarem com base no URL e não no cabeçalho do host.

worker_processes  1;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
error_log  logs/error.log  debug;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    upstream myapp1 {
        #server localhost:3333;
        server www.asd.com:80;
    }

    server {
        listen 80;

        location / {
            proxy_set_header Host            $upstream_addr;  // should become somehow www.asd.com right now this code doesn't work
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_pass http://myapp1;
        }
    }
}
Muhammad Umer
fonte
$server_addré de alguma forma 127.0.0.1 por quê?
Muhammad Umer 26/03
eu quero cabeçalho de anfitrião para ser www.asd.com quando o servidor www.asd.com:80é escolhido
Muhammad Umer
ou se existe uma maneira de escrever if(server1) than host = a; ,if(server2) than host = b;
Muhammad Umer
1
O problema é que o cabeçalho do host apropriado deve ser, na minha opinião, o que você recebe do cliente. Se o cliente solicitar www.asd.com, é o cabeçalho do host. Isso ajudará a gerar corretamente URLs absolutos no back-end quando necessário, definir os domínios apropriados para cookies etc. O que você estiver tentando fazer, provavelmente está olhando para o caminho errado.
Florin Asăvoaie
cliente e servidor do meio sou eu.
Muhammad Umer

Respostas:

6

Você precisa definir o cabeçalho para a variável host recebida, conforme documentado aqui :

proxy_set_header Host $host;
Jeff Wong
fonte
This variable is equal to line Host in *the header of request* or nameou seja, o que o cliente / navegador informar, esse será o escolhido.
Muhammad Umer
É isso que você gostaria de fazer, correto? O cliente solicita um recurso / host virtual a partir do seu proxy e você precisa atender a um host virtual. O host virtual a ser servido é escolhido pelo cliente / borwser.
Jeff Wong
nenhum host virtual é escolhido pelo servidor de forma aleatória
Muhammad Umer
1
Algo assim? Criar dois níveis de proxy, e definir o host codificado para o ponto final na segunda camada serverfault.com/a/622782/287634
Jeff Wong
mal dar uma olhada, mas eu acho que ive já visto desde que eu upvoted algumas coisas lá
Muhammad Umer