¿Cómo se incluyen condicionalmente los archivos en Nginx vhost?

12

En las líneas a continuación, podría tener un archivo de configuración específico del sitio que contiene fastcgi_params adicionales únicos para ese sitio. Si este archivo existe, quiero cargarlo.

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;
                }
        }
}

Sin embargo, esto no funciona y el error que obtengo es:

nginx: [emergeg] la directiva "include" no está permitida aquí en ...

Actualizar

Pensé que, en lugar de verificar por separado, podría dejar incluir el cheque por mí.

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;
        }
}

Sin embargo, esto no parece estar funcionando.

Xeoncross
fuente
¿Encontraste una solución a este problema? Estoy en el mismo barco y me pregunto cómo hiciste esto.
jackweirdy
Lo siento, creo que finalmente resolví el problema de otra manera.
Xeoncross

Respuestas:

8

includehace lo suyo durante el inicio del servidor: las variables de tiempo de ejecución como $hostno se pueden usar, ni se puede usar en un ifcontexto, como descubrió.

Tendría que dividir los serverbloques para diferentes hosts. ¡Lo siento!

Shane Madden
fuente
31

Bueno, esto es bastante viejo, pero de todos modos, encontré una solución alternativa.

Tengo una configuración con vhosts configurados en este estilo:

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

En lugar de verificar si el archivo existe (lo cual no es posible), simplemente hago:

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

De esta manera, simplemente puedo crear un archivo en la sites-customizationscarpeta, que según mi convención, se denomina igual que la configuración principal. Los *trabajos más o menos como el caso, ya que no se rompe si no hay archivos de configuración adicionales. Si lo desea, esto también le permite agregar múltiples configuraciones adicionales en archivos separados.

usuario158786
fuente
5

Sé que esto es antiguo, pero la solución podría ayudar a alguien a buscar una respuesta como yo.

Tenía un montón de redireccionamientos que necesitaba incluir solo para un host específico y, aunque includeno está permitido en la ifdirectiva, terminé agregando el ifinterior del archivo que estaba incluyendo ...

Entonces tengo un include /etc/nginx/conf.d/redirectsy dentro de ese archivo tengo:

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

Aprovecho la glob()expansión del patrón de función, que es utilizada por nginx en la includedirectiva, y funciona bien en mis servidores Debian.

En su caso, intente reemplazar esta línea:

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

Con este:

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

es una máscara de archivo que coincide con un solo archivo y no hará que nginx se queje si el archivo no existe. Sin embargo, las variables no están permitidas en las directivas de inclusión, por lo que debe proporcionar un valor fijo en <hostname>. Tuvimos que crear un script que genera archivos .conf individuales (uno por vhost).

Editar

Como señaló Gerald Schneider , estaba sugiriendo mantener $hostel reemplazo, lo cual no está permitido. He cambiado la sugerencia anterior.

Alberto Pastore
fuente
1
la variable $hosttodavía no va a funcionar aquí.
Gerald Schneider
Lo sentimos, tienes razón, las variables no están permitidas en las directivas de inclusión. Utilizamos un script de Python que crea un único .conf para cada vhost de una lista, pero hacemos un uso extensivo de las desviaciones adicionales por vhost adicionales "personalizadas" del estándar.
Alberto Pastore