Come si includono in modo condizionale i file nel vhost di Nginx?


12

Nelle righe seguenti, potrei avere un file di configurazione specifico del sito che contiene ulteriori fastcgi_params unici per quel sito. Se questo file esiste, voglio caricarlo.

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

Tuttavia, questo non funziona e l'errore che ottengo è:

nginx: [emerg] la direttiva "include" non è consentita qui in ...

Aggiornare

Ho pensato che invece di controllare separatamente, potevo lasciare includere il controllo per me.

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

Tuttavia, questo non sembra funzionare.


Hai trovato una soluzione a questo problema? Sono nella stessa barca e mi chiedo come hai fatto?
jackweirdy,

Scusa, penso di aver finalmente risolto qualunque problema il problema fosse diverso.
Xeoncross,

Risposte:


8

includefa la sua cosa all'avvio del server: variabili come il runtime $hostnon possono essere utilizzate, né può essere utilizzato in un ifcontesto, come hai scoperto.

Dovresti dividere i serverblocchi per host diversi. Scusate!


31

Bene, questo è piuttosto vecchio, ma comunque, ho trovato una soluzione.

Ho una configurazione con vhosts configurati in questo stile:

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

Invece di verificare se il file esiste (il che non è possibile), faccio semplicemente:

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

In questo modo posso semplicemente creare un file nella sites-customizationscartella, che per mia convenzione, è chiamato lo stesso della configurazione principale. Le *opere più o meno come il caso, in quanto non si rompe se non ci sono file di configurazione aggiuntivi. Se lo desideri, ciò ti consente anche di aggiungere più configurazioni extra in file separati.


5

So che questo è vecchio ma la soluzione potrebbe aiutare qualcuno in cerca di una risposta come ho fatto io.

Avevo un sacco di reindirizzamenti che dovevo includere solo per un host specifico e mentre includenon è consentito nella ifdirettiva, ho finito per aggiungere l' ifinterno del file che stavo includendo ...

Quindi ho un include /etc/nginx/conf.d/redirectse dentro quel file ho:

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

5

Approfitto dell'espansione del glob()modello di funzione, che è utilizzata da nginx nella includedirettiva e funziona bene sui miei server Debian.

Nel tuo caso, prova a sostituire questa riga:

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

con questo:

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

è una maschera di file che corrisponde a un solo file e non farà lamentare nginx se il file non esiste. Tuttavia le variabili non sono consentite nelle direttive include, quindi è necessario fornire un valore fisso in <hostname>. Abbiamo dovuto creare uno script che generi singoli file .conf (uno per vhost).

modificare

Come ha sottolineato Gerald Schneider , stavo suggerendo di mantenere $hostla sostituzione, il che non è consentito. Ho cambiato il suggerimento sopra.


1
la variabile $hostnon funzionerà ancora qui.
Gerald Schneider,

Spiacenti, hai ragione, le variabili non sono consentite nelle direttive include. Usiamo uno script Python che crea un singolo .conf per ogni vhost da un elenco, ma facciamo un ampio uso di deviazioni aggiuntive "personalizzate" dallo standard.
Alberto Pastore,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.