Como você inclui condicionalmente arquivos no Nginx vhost?

9

Nas linhas abaixo, eu pode ter um arquivo de configuração específico do site que contenha fastcgi_params exclusivo para esse site. Se este arquivo existir, eu quero carregá-lo.

server {
        listen 80 default;
        server_name _;
        root /path/www/$host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;


                if (-f /path/www/$host/nginx.conf) {
                        include /path/www/$host/nginx.conf;
                }
        }
}

No entanto, isso não funciona e o erro que recebo é:

nginx: [emerg] "include" directive is not allowed here in ...

Atualizar

Eu pensei que, em vez de verificar separadamente, eu poderia deixar incluir verificar por mim.

server {
        listen 80 default;
        server_name _;
        root /path/www/$host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;

                include /path/www/$host/*.nginx;
        }
}

No entanto, isso não parece estar funcionando.

    
por Xeoncross 20.01.2012 / 00:01

4 respostas

8

include faz sua parte durante o início do servidor - variáveis de tempo de execução como $host não podem ser usadas, nem podem ser usadas em um contexto if , como você descobriu.

Você precisaria dividir os blocos server para hosts diferentes. Desculpe!

    
por 20.01.2012 / 00:16
24

Bem, isso é bastante antigo, mas, de qualquer forma, encontrei uma solução alternativa.

Eu tenho uma configuração com vhosts configurados neste estilo:

/etc/nginx/sites-enabled/site.com.conf

Em vez de verificar se o arquivo existe (o que não é possível), simplesmente faço:

include /etc/nginx/sites-customizations/site.com.*.conf

Dessa forma, posso simplesmente criar um arquivo na pasta sites-customizations , que, por convenção, tem o mesmo nome da configuração principal. O * funciona bem como o if, já que ele não quebra se não houver arquivos de configuração extras. Se você quiser, isso também permite adicionar várias configurações extras em arquivos separados.

    
por 13.02.2013 / 13:14
4

Eu sei que isso é antigo, mas a solução pode ajudar alguém a procurar uma resposta como eu fiz.

Eu tinha vários redirecionamentos que precisava incluir apenas para um host específico e, embora include não seja permitido na diretiva if , acabei adicionando o if no arquivo que eu estava incluindo. .

Então eu tenho um include /etc/nginx/conf.d/redirects e dentro desse arquivo eu tenho:

if ($host = "www.example.com") {
    # Some conf or redirects for this site only.
}
    
por 01.03.2016 / 13:10
2

Eu aproveito a expansão do padrão de função glob() , que é usada pelo nginx na diretiva include , e funciona bem nos meus servidores Debian.

No seu caso, tente substituir esta linha:

include /path/www/$host/nginx.conf;

com este:

include /path/www/<hostname>/nginx[.]conf;

é uma máscara de arquivo que corresponde a apenas um arquivo e não fará reclamações do nginx se o arquivo não existir. No entanto, as variáveis não são permitidas nas diretivas de inclusão, portanto, você deve fornecer um valor fixo em <hostname> . Tivemos que criar um script que gera arquivos .conf individuais (um por vhost).

Editar

Como Gerald Schneider apontou, eu estava sugerindo manter $host na substituição, o que não é permitido. Eu mudei a sugestão acima.

    
por 04.01.2018 / 15:53