Konfiguration der Nginx-Subdomain

79

Ich habe Nginx als Reverse Proxy für Apache. Ich muss jetzt eine neue Subdomain hinzufügen, die Dateien aus einem anderen Verzeichnis bereitstellt, aber gleichzeitig möchte ich, dass alle Speicherort- und proxy_pass-Anweisungen, die ich für den Standardhost habe, auch auf die Subdomain angewendet werden.

Ich weiß, dass es funktioniert, wenn ich die Regeln vom Standardhost in die neue Subdomain kopiere. Gibt es jedoch eine Möglichkeit für die Subdomain, die Regeln zu erben? Unten finden Sie eine Beispielkonfiguration

server {
    listen       80;
    server_name  www.somesite.com;
    access_log  logs/access.log;
    error_log  logs/error.log error;


   location /mvc {
      proxy_pass  http://localhost:8080/mvc;
   }


   location /assets {
      alias   /var/www/html/assets;
      expires     max;
   }

   ... a lot more locations
}

server {
    listen       80;
    server_name  subdomain.somesite.com;

    location / {
                root   /var/www/some_dir;
                index  index.html index.htm;
        }
}

Vielen Dank

Thomas
quelle

Antworten:

92

Sie können die gemeinsamen Teile in eine andere Konfigurationsdatei und includeaus beiden Serverkontexten verschieben. Das sollte funktionieren:

server {
  listen 80;
  server_name server1.example;
  ...
  include /etc/nginx/include.d/your-common-stuff.conf;
}

server {
  listen 80;
  server_name another-one.example;
  ...
  include /etc/nginx/include.d/your-common-stuff.conf;
}

Bearbeiten: Hier ist ein Beispiel, das tatsächlich von meinem laufenden Server kopiert wurde. Ich konfiguriere meine grundlegenden Servereinstellungen in /etc/nginx/sites-enabled(normales Zeug für Nginx unter Ubuntu / Debian). Die bunkus.orgKonfigurationsdatei meines Hauptservers lautet beispielsweise /etc/nginx/sites-enabledwie folgt :

server {
  listen   80 default_server;
  listen   [2a01:4f8:120:3105::101:1]:80 default_server;

  include /etc/nginx/include.d/all-common;
  include /etc/nginx/include.d/bunkus.org-common;
  include /etc/nginx/include.d/bunkus.org-80;
}

server {
  listen   443 default_server;
  listen   [2a01:4f8:120:3105::101:1]:443 default_server;

  include /etc/nginx/include.d/all-common;
  include /etc/nginx/include.d/ssl-common;
  include /etc/nginx/include.d/bunkus.org-common;
  include /etc/nginx/include.d/bunkus.org-443;
}

Als Beispiel ist hier die /etc/nginx/include.d/all-commonDatei, die aus beiden serverKontexten enthalten ist:

index index.html index.htm index.php .dirindex.php;
try_files $uri $uri/ =404;

location ~ /\.ht {
  deny all;
}

location = /favicon.ico {
  log_not_found off;
  access_log off;
}

location ~ /(README|ChangeLog)$ {
  types { }
  default_type text/plain;
}
Moritz Bunkus
quelle
1
Gute Idee. Muss ich die Direktiven unter eine andere packen, wie ich es getan habe, was Sie vorschlagen, und nginx beschwert sich, wenn ich ihn neu starte, dass die nginx: [emerg] "location" -Richtlinie hier nicht erlaubt ist
Thomas
Fast meine gesamte Nginx-Konfiguration besteht aus ähnlich enthaltenen Unterkonfigurationsdateien. Ja, es funktioniert. Vielleicht könnten Sie Ihre aktuelle Konfiguration mit den includeAnweisungen veröffentlichen - und auch mit dem Inhalt der enthaltenen Datei. Bearbeiten Sie Ihre ursprüngliche Frage entsprechend.
Moritz Bunkus
Ich habe meine Antwort aktualisiert, um die tatsächlich funktionierenden Serverkonfigurationsdateien einzuschließen.
Moritz Bunkus
3
Funktioniert gut. Mein Fehler. Ich habe diese allgemeine Datei in ein Verzeichnis gestellt, in das jede .conf-Datei automatisch geladen wurde und das die Fehler verursachte. Vielen Dank
Thomas
3
Ja, ich bin selbst auf dieses Problem gestoßen. Aus diesem Grund habe ich alle enthaltenen Dateien abgelegt, /etc/nginx/include.ddie nicht von den üblichen Nginx-Konfigurationsdateien stammen, die auf einem Debian / Ubuntu-System vorhanden sind.
Moritz Bunkus