Como você inclui arquivos condicionalmente no Nginx vhost?

12

Nas linhas abaixo, talvez eu tenha um arquivo de configuração específico do site que contenha fastcgi_params adicionais exclusivos desse site. Se esse arquivo existir, 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 é:

A diretiva nginx: [emerg] "include" não é permitida aqui em ...

Atualizar

Eu pensei que, em vez de verificar separadamente, eu poderia deixar incluir o cheque para 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.

Xeoncross
fonte
Você encontrou uma solução para este problema? Estou no mesmo barco e me pergunto como você fez isso.
jackweirdy
Desculpe, acho que finalmente resolvi qualquer que fosse o problema.
Xeoncross

Respostas:

8

includefunciona durante a inicialização do servidor - variáveis ​​de tempo de execução como $hostnão podem ser usadas, nem podem ser usadas em um ifcontexto, como você descobriu.

Você precisaria dividir os serverblocos para diferentes hosts. Desculpe!

Shane Madden
fonte
31

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

Eu tenho uma instalaçã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), basta:

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

Dessa forma, eu posso simplesmente criar um arquivo na sites-customizationspasta-, que, segundo minha convenção, tem o mesmo nome da configuração principal. As *obras praticamente como o caso, uma vez que não quebrar se não há arquivos de configuração extra. Se você preferir, isso também permite adicionar várias configurações extras em arquivos separados.

user158786
fonte
5

Sei que isso é antigo, mas a solução pode ajudar alguém que procura uma resposta como eu.

Eu tinha vários redirecionamentos que precisava incluir apenas para um host específico e, embora includenão seja permitido na ifdiretiva, acabei adicionando ifo arquivo dentro do arquivo que estava incluindo ...

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

if ($host = "www.example.com") {
    # Some conf or redirects for this site only.
}
Titi
fonte
5

Aproveito a glob()expansão do padrão de função, que é usada pelo nginx na includediretiva, e funciona bem em 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á o nginx reclamar se o arquivo não existir. No entanto variáveis não são permitidos incluem directivas, para que você deve fornecer um valor fixo em <hostname>. Tivemos que criar um script que gere arquivos .conf individuais (um por vhost).

Editar

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

Alberto Pastore
fonte
1
a variável $hostainda não vai funcionar aqui.
Gerald Schneider
Desculpe, você está certo, as variáveis ​​não são permitidas nas diretivas de inclusão. Usamos um script python que cria um único .conf para cada vhost de uma lista, mas fazemos uso extensivo de desvios adicionais "personalizados" por vhost do padrão.
Alberto Pastore