Wie können Sie Dateien in Nginx vhost bedingt einbinden?

12

In den folgenden Zeilen wird möglicherweise eine standortspezifische Konfigurationsdatei angezeigt , die zusätzliche, für diesen Standort eindeutige fastcgi_params enthält . Wenn diese Datei existiert, möchte ich sie laden.

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

Dies funktioniert jedoch nicht und der Fehler, den ich erhalte, ist:

nginx: [emerg] "include" Direktive ist hier nicht erlaubt in ...

Aktualisieren

Ich dachte, anstatt separat zu prüfen, könnte ich auch für mich prüfen lassen .

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

Dies scheint jedoch nicht zu funktionieren.

Xeoncross
quelle
Haben Sie eine Lösung für dieses Problem gefunden? Ich sitze im selben Boot und frage mich, wie Sie das gemacht haben?
Jackweirdy
Entschuldigung, ich glaube, ich habe endlich das Problem auf eine andere Weise gelöst.
Xeoncross

Antworten:

8

includemacht seine Sache beim Serverstart - Laufzeitvariablen wie $hostkönnen nicht verwendet werden, und sie können auch nicht in einem ifKontext verwendet werden, wie Sie herausgefunden haben.

Sie müssten die serverBlöcke für verschiedene Hosts aufteilen . Es tut uns leid!

Shane Madden
quelle
31

Nun, das ist ziemlich alt, aber trotzdem habe ich einen Workaround gefunden.

Ich habe ein Setup mit vhosts in diesem Stil konfiguriert:

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

Anstatt zu überprüfen, ob die Datei existiert (was nicht möglich ist), mache ich einfach:

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

Auf diese Weise kann ich einfach eine Datei im sites-customizations-Ordner erstellen, die nach meiner Konvention den gleichen Namen hat wie die Hauptkonfiguration. Das *funktioniert ziemlich ähnlich wie das if, da es nicht kaputt geht, wenn keine zusätzlichen Konfigurationsdateien vorhanden sind. Wenn Sie möchten, können Sie auf diese Weise auch mehrere zusätzliche Konfigurationen in separaten Dateien hinzufügen.

user158786
quelle
5

Ich weiß, dass dies alt ist, aber die Lösung könnte jemandem helfen, nach einer Antwort zu suchen, wie ich es getan habe.

Ich hatte eine Reihe von Weiterleitungen, die ich nur für einen bestimmten Host einschließen musste, und obwohl includedies in der ifDirektive nicht zulässig ist , habe ich am Ende die ifdarin enthaltene Datei hinzugefügt ...

Also habe ich eine include /etc/nginx/conf.d/redirectsund in dieser Datei habe ich:

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

Ich nutze die glob()Funktionsmuster-Erweiterung, die von nginx in der includeDirektive verwendet wird und auf meinen Debian-Servern gut funktioniert.

Versuchen Sie in Ihrem Fall, diese Zeile zu ersetzen:

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

mit diesem:

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

Es ist eine Dateimaske, die nur mit einer Datei übereinstimmt und Nginx nicht dazu bringt, sich zu beschweren, wenn die Datei nicht existiert. Da Variablen in Include-Anweisungen nicht zulässig sind, müssen Sie in einen festen Wert eingeben <hostname>. Wir mussten ein Skript erstellen, das einzelne .conf-Dateien generiert (eine pro vhost).

Bearbeiten

Wie Gerald Schneider betonte, schlug ich vor, $hostdie Ersetzung beizubehalten, was nicht erlaubt ist. Ich habe den obigen Vorschlag geändert.

Alberto Pastore
quelle
1
Die Variable $hostwird hier immer noch nicht funktionieren.
Gerald Schneider
Sie haben Recht, Variablen sind in Include-Anweisungen nicht zulässig. Wir verwenden ein Python-Skript, das aus einer Liste eine einzige .conf-Datei für jeden vhost erstellt, aber wir machen ausgiebigen Gebrauch von "benutzerdefinierten" zusätzlichen Abweichungen pro vhost vom Standard.
Alberto Pastore