Usando uma variável server_name em uma configuração nginx proxy_pass

3

Eu tenho dois back-ends com dados diferentes com os quais quero testar meu código de interface do usuário, por isso estou tentando configurar o Nginx para permitir que eu alterne entre eles com base na URL.

Assim, por exemplo, a URL local https://ui.local.otherserver:80 tentaria meus arquivos locais e, em seguida, procuraria qualquer outra coisa em https://otherserver:80 .

Estou tentando evitar dois blocos de server , pois a configuração abaixo é simplificada e a duplicação é um problema.

O comportamento que estou vendo é que um dos back-ends funciona bem, e o outro me dá um erro 502 (Bad Gateway), mas se eu codificar o nome de cada servidor na linha proxy_pass , funciona como esperado, ou seja, proxies com sucesso para esse servidor específico.

Alguma idéia do que estou fazendo errado?

ssl             on;
ssl_certificate      /usr/local/etc/nginx/conf.d/cert.ui.crt;
ssl_certificate_key  /usr/local/etc/nginx/conf.d/cert.ui.key;

server {
    listen          443;
    listen          80;
    server_name     ~^ui\.local\.(?<backend>.+)$;
    expires         -1;
    access_log      /var/log/nginx/ui.access.log;
    error_log       /var/log/nginx/ui.error.log;

    root /Users/richard/Projects/ui/trunk/;

    location ~ ^(.*)$ {
        try_files $1 @platform;
    }
    location @platform {
        proxy_pass https://$backend:$port;
    }
}
    
por Richard Marr 04.03.2013 / 12:35

2 respostas

1

502 é um erro de gateway inválido, o que significa que o nginx não conseguiu se comunicar com o back-end. Deveria haver uma mensagem mais detalhada no log de erros do nginx explicando qual era o erro de comunicação. Dê uma olhada em /var/log/nginx/error.log (ou similar) para encontrar a causa real.

    
por 05.03.2013 / 18:08
3

Você precisa definir a diretiva "resolver" explícita em sua configuração de servidor ou a configuração de localização para que isso funcione. Com o uso de variáveis na diretiva proxy_pass, o NGINX precisa fazer uma resolução de tempo de execução. Aqui gethostbyname () não pode ser usado porque é uma chamada de bloqueio. Portanto, o NGINX espera que um resolvedor assíncrono seja configurado, caso contrário, ele fornecerá o 502 gateway ruim.

    
por 26.11.2014 / 00:21

Tags