set server_name no Nginx baseado na variável global

2

Eu tenho um servidor com nginx que executa um site em produção que deve ser substituído por um novo site no futuro próximo.

Para estar pronto para esse dia, estou preparando todas as configurações necessárias para executar o novo site.

O que eu gostaria de ter é uma variável global na principal nginx.conf que contém uma string (por exemplo, 'old' ou 'new' representando o site que deveria estar ativo no domínio principal example.com enquanto o outro site está em other.example.com .

Eu tentei:

Em nginx.conf

http{
    ...
    set $site_in_production 'new';
    ...
    include /etc/nginx/conf.c/*.conf;
}

Em /etc/nginx/conf.d/example.com.conf

server{
    ...
    if($site_in_production='new'){
         server_name other.example.com;
    } else {
         server_name example.com www.example.com;
    }
    ...
}

Em /etc/nginx/conf.d/new.example.com.conf

server{
    ...
    if($site_in_production='new'){
         server_name example.com www.example.com;
    } else {
         server_name other.example.com;
    }
    ...
}

Mas, ao executar um configtest, recebo este erro:

 nginx: [emerg] "set" directive is not allowed here in /etc/nginx/nginx.conf:XX

então eu acho que a diretiva set não é permitida fora de um bloco server

Existe uma maneira de obter essa funcionalidade com uma única variável em todos os arquivos de configuração do nginx?

Muito obrigado!

    
por Yaron U. 21.01.2015 / 17:35

1 resposta

1

Basta fazer um script. Claro que uma solução elegante embutida no nginx seria legal ... mas não vamos nos esquecer das ferramentas que o * nix nos oferece:

#!/bin/bash
for i in /etc/nginx/conf.d/*;
do
    sed -i 's/server_name example.com www.example.com;/server_name other.example.com;/g' "$i";
done

... Você pode ter que escapar desses pontos-e-vírgulas. Não tenho certeza ...

    
por 21.01.2015 / 20:08