Nginx Virtual Hosts: Mehrere Websites auf einem Server hosten

Entfesseln Sie die Leistung von Nginx Virtual Hosts (Server-Blöcken), um mehrere Websites oder Subdomains effizient auf einem einzigen Server zu hosten. Dieser Leitfaden bietet ein umfassendes Schritt-für-Schritt-Tutorial, das die Verzeichniseinrichtung, die Erstellung von Konfigurationsdateien, die Aktivierung von Server-Blöcken und Nginx-Tests abdeckt. Erfahren Sie Best Practices für Subdomains, Standard-Server-Blöcke, HTTPS-Integration und dedizierte Protokollierung. Praktische Beispiele und wichtige Tipps zur Fehlerbehebung helfen Ihnen, Multi-Site-Nginx-Hosting zu meistern, die Ressourcennutzung zu optimieren und die Webserververwaltung zu rationalisieren.

42 Aufrufe

Nginx Virtual Hosts: Mehrere Websites auf einem Server hosten

Moderne Web-Infrastrukturen erfordern oft die Fähigkeit, mehrere Websites oder Webanwendungen von einer einzigen Serverinstanz aus zu bedienen. Dies optimiert nicht nur die Ressourcennutzung, sondern vereinfacht auch die Verwaltung und reduziert die Betriebskosten. Nginx, bekannt für seine hohe Leistung, Stabilität, seinen Funktionsumfang und seinen geringen Ressourcenverbrauch, erreicht dies durch sogenannte Server-Blöcke, die in der Apache-Welt oft als virtuelle Hosts bezeichnet werden.

Diese umfassende Anleitung führt Sie durch den Prozess der Einrichtung von Nginx Virtual Hosts, um mehrere verschiedene Domainnamen oder Subdomains effektiv von einem einzigen Nginx-Server aus zu verwalten und bereitzustellen. Egal, ob Sie example.com und anothersite.org hosten oder eine Hauptseite mit Subdomains wie blog.example.com und shop.example.com, die Beherrschung von Nginx Server-Blöcken ist eine grundlegende Fähigkeit für jeden Systemadministrator oder Entwickler. Am Ende dieses Artikels werden Sie ein klares Verständnis und praktische Beispiele haben, um Ihren Nginx-Server für das Hosting mehrerer Websites zu konfigurieren.

Nginx Server-Blöcke (Virtuelle Hosts) verstehen

Im Kern ist ein Nginx Server-Block eine Konfigurationsdirektive, die innerhalb der Nginx-Konfigurationsdatei (nginx.conf oder eingebundener Dateien) definiert ist. Jeder server-Block definiert die Konfiguration für einen bestimmten virtuellen Host und legt fest, wie Nginx auf Anfragen für eine bestimmte Domain oder eine Gruppe von Domains reagieren soll. Nginx verwendet die listen-Direktive, um die IP-Adresse und den Port anzugeben, auf dem es lauschen soll, und die server_name-Direktive, um zu identifizieren, auf welche Domainnamen oder Hostnamen dieser Server-Block reagieren soll.

Wenn eine Anfrage eingeht, analysiert Nginx den Host-Header der HTTP-Anfrage und vergleicht ihn mit den server_name-Direktiven seiner konfigurierten Server-Blöcke. Anschließend liefert es den Inhalt aus, der im übereinstimmenden Server-Block definiert ist. Wenn kein server_name übereinstimmt, greift Nginx normalerweise auf den Standard-Server-Block zurück (den ersten server-Block oder einen, der explizit als default_server markiert ist).

Voraussetzungen

Stellen Sie vor Beginn sicher, dass Sie Folgendes haben:

  1. Nginx installiert: Nginx sollte auf Ihrem Server installiert und ausgeführt werden. Wenn nicht, können Sie es normalerweise über den Paketmanager Ihres Systems installieren (z. B. sudo apt update && sudo apt install nginx unter Ubuntu/Debian, sudo yum install nginx unter CentOS/RHEL).
  2. Domainnamen: Sie benötigen mindestens zwei Domainnamen (z. B. example1.com und example2.com) oder Subdomains (z. B. blog.example.com und app.example.com), die Sie hosten möchten. Die DNS-A/AAAA-Einträge dieser Domains müssen auf die öffentliche IP-Adresse Ihres Servers verweisen.
  3. Grundlegende Verzeichnisstruktur: Ein Plan, wo Ihre Website-Dateien gespeichert werden. Eine gängige Praxis ist /var/www/ihredomain.com/html.
  4. Sudo-Berechtigungen: Sie benötigen sudo-Zugriff, um Nginx-Konfigurationsdateien zu ändern.

Schritt-für-Schritt-Einrichtungsanleitung

Lassen Sie uns zwei virtuelle Hosts einrichten: example1.com und example2.com.

Schritt 1: Verzeichnisstruktur für Websites erstellen

Erstellen Sie zuerst die Stammverzeichnisse für jede Ihrer Websites. Hier werden deren HTML-, CSS-, JavaScript- und andere statische Dateien gespeichert. Ein üblicher Speicherort ist /var/www/.

sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/html

# Besitz an Ihren Benutzer übergeben (ersetzen Sie $USER durch Ihren Benutzernamen), um Bearbeitungen zu ermöglichen
sudo chown -R $USER:$USER /var/www/example1.com/html
sudo chown -R $USER:$USER /var/www/example2.com/html

# Leseberechtigungen für den Webserver festlegen
sudo chmod -R 755 /var/www

Erstellen Sie als Nächstes eine einfache index.html-Datei in jedem Verzeichnis, um die Einrichtung zu testen:

Für /var/www/example1.com/html/index.html:

<!-- /var/www/example1.com/html/index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Willkommen bei Example1.com!</title>
</head>
<body>
    <h1>Erfolg! Dies ist Example1.com.</h1>
    <p>Dieser virtuelle Host funktioniert korrekt.</p>
</body>
</html>

Für /var/www/example2.com/html/index.html:

<!-- /var/www/example2.com/html/index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Willkommen bei Example2.com!</title>
</head>
<body>
    <h1>Erfolg! Dies ist Example2.com.</h1>
    <p>Dieser virtuelle Host funktioniert ebenfalls!</p>
</body>
</html>

Schritt 2: Nginx Server-Block-Konfigurationsdateien erstellen

Nginx lädt Server-Block-Konfigurationen normalerweise aus Dateien im Verzeichnis /etc/nginx/sites-enabled/. Diese Dateien sind in der Regel symbolische Links zu Konfigurationen, die in /etc/nginx/sites-available/ gespeichert sind. Diese Trennung ermöglicht es Ihnen, Konfigurationen zu speichern, die noch nicht aktiv sind, oder Websites einfach zu aktivieren/deaktivieren.

Erstellen Sie eine neue Konfigurationsdatei für example1.com:

sudo nano /etc/nginx/sites-available/example1.com.conf

Fügen Sie den folgenden Inhalt hinzu:

# /etc/nginx/sites-available/example1.com.conf
server {
    listen 80;
    listen [::]:80;

    root /var/www/example1.com/html;
    index index.html index.htm index.nginx-debian.html;

    server_name example1.com www.example1.com;

    location / {
        try_files $uri $uri/ =404;
    }

    access_log /var/log/nginx/example1.com_access.log;
    error_log /var/log/nginx/example1.com_error.log;
}

Erläuterung der Direktiven:

  • listen 80;: Nginx lauscht auf Port 80 (Standard-HTTP). listen [::]:80; ist für IPv6.
  • root /var/www/example1.com/html;: Gibt das Dokumentenverzeichnis für diesen Server-Block an. Nginx sucht nach Dateien in diesem Verzeichnis.
  • index index.html ...;: Definiert die Standarddatei, die Nginx bereitstellen soll, wenn ein Verzeichnis angefordert wird (z. B. wenn jemand example1.com/ besucht).
  • server_name example1.com www.example1.com;: Dies ist entscheidend. Es weist Nginx an, auf Anfragen für example1.com oder www.example1.com mit der Konfiguration dieses Server-Blocks zu reagieren.
  • location / { ... }: Ein Block, der definiert, wie Anfragen für bestimmte URIs behandelt werden. try_files versucht, eine Datei direkt ($uri), dann ein Verzeichnis ($uri/) bereitzustellen und gibt schließlich einen Fehler 404 Not Found zurück.
  • access_log und error_log: Gibt separate Protokolldateien für diese spezifische Website an, was eine bewährte Methode für einfacheres Debugging und Analysen ist.

Erstellen Sie nun eine ähnliche Konfigurationsdatei für example2.com:

sudo nano /etc/nginx/sites-available/example2.com.conf

Fügen Sie den folgenden Inhalt hinzu:

# /etc/nginx/sites-available/example2.com.conf
server {
    listen 80;
    listen [::]:80;

    root /var/www/example2.com/html;
    index index.html index.htm index.nginx-debian.html;

    server_name example2.com www.example2.com;

    location / {
        try_files $uri $uri/ =404;
    }

    access_log /var/log/nginx/example2.com_access.log;
    error_log /var/log/nginx/example2.com_error.log;
}

Schritt 3: Server-Blöcke aktivieren

Um diese Konfigurationen zu aktivieren, erstellen Sie symbolische Links vom Verzeichnis sites-available zum Verzeichnis sites-enabled. Dies teilt Nginx mit, diese Dateien beim Start einzuschließen.

sudo ln -s /etc/nginx/sites-available/example1.com.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com.conf /etc/nginx/sites-enabled/

Schritt 4: Nginx-Konfiguration testen

Es ist entscheidend, Ihre Nginx-Konfiguration auf Syntaxfehler zu testen, bevor Sie sie neu laden. Dies verhindert, dass Nginx aufgrund eines Tippfehlers nicht neu gestartet werden kann.

sudo nginx -t

Sie sollten eine Ausgabe ähnlich dieser sehen, die einen Erfolg anzeigt:

nginx: die Konfigurationsdatei /etc/nginx/nginx.conf Syntax ist ok
nginx: Konfigurationsdatei /etc/nginx/nginx.conf Test ist erfolgreich

Wenn Sie Fehler sehen, beheben Sie diese in den entsprechenden Konfigurationsdateien und führen Sie sudo nginx -t erneut aus, bis es erfolgreich ist.

Schritt 5: Nginx neu starten

Wenden Sie die neue Konfiguration an, indem Sie Nginx neu starten oder neu laden. reload wird im Allgemeinen bevorzugt, da es Nginx ermöglicht, neue Konfigurationen zu laden, ohne aktive Verbindungen zu unterbrechen.

sudo systemctl reload nginx
# Oder, wenn reload nicht funktioniert oder für Neuinstallationen:
sudo systemctl restart nginx

Schritt 6: DNS-Einträge aktualisieren

Stellen Sie sicher, dass die DNS-A-Einträge für example1.com, www.example1.com, example2.com und www.example2.com alle auf die IP-Adresse Ihres Nginx-Servers zeigen. Ohne korrekte DNS-Einträge weiß Ihr Browser nicht, wo er Ihre Websites finden kann.

Sobald die DNS-Propagation abgeschlossen ist (was einige Minuten bis mehrere Stunden dauern kann), sollten Sie in der Lage sein, http://example1.com und http://example2.com in Ihrem Webbrowser aufzurufen und die jeweiligen index.html-Seiten zu sehen.

Fortgeschrittene Szenarien und bewährte Praktiken

Subdomains hosten

Das Hosten von Subdomains (z. B. blog.example.com, shop.example.com) funktioniert genau wie das Hosten separater Domains. Sie definieren einfach einen neuen Server-Block mit der Subdomain als server_name.

Beispiel für blog.example.com:

# /etc/nginx/sites-available/blog.example.com.conf
server {
    listen 80;
    listen [::]:80;

    root /var/www/blog.example.com/html;
    index index.html;

    server_name blog.example.com;

    location / {
        try_files $uri $uri/ =404;
    }
}

Denken Sie daran, das Verzeichnis (/var/www/blog.example.com/html) zu erstellen, eine index.html zu erstellen, den Symlink zu erstellen und Nginx neu zu laden.

Der Standard-Server-Block

Es ist eine gute Praxis, einen Standard-Server-Block zu haben, der Anfragen für Domainnamen abfängt, die nicht mit anderen server_name-Direktiven auf Ihrem Server übereinstimmen. Dies verhindert, dass unbekannte Anfragen vom "ersten" virtuellen Host bedient werden, den Nginx findet, oder ermöglicht es Ihnen, eine generische "Seite nicht gefunden"-Seite anzuzeigen.

Normalerweise ist der erste server-Block in Ihrer nginx.conf oder sites-enabled implizit der Standard. Sie können einen explizit mit default_server festlegen:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;
    # Der Unterstrich `_` ist ein nicht existierender Domainname, der niemals mit einer echten Anfrage übereinstimmt.
    # Sie können auch localhost verwenden.

    root /var/www/default_site/html;
    index index.html;

    location / {
        return 444; # Gibt einen Nginx-spezifischen 444-Fehler (keine Antwort) für unbekannte Hosts zurück
        # Oder stellen Sie eine generische Landingpage bereit:
        # try_files $uri $uri/ =404;
    }
}

Warnung: Wenn Sie einen default_server-Block definieren, stellen Sie sicher, dass nur ein server-Block für einen bestimmten listen-Port das default_server-Flag hat, sonst protokolliert Nginx eine Warnung.

Virtuelle Hosts mit HTTPS (SSL/TLS) sichern

Für Produktionswebsites ist die Aktivierung von HTTPS unerlässlich. Dies beinhaltet das Abrufen eines SSL/TLS-Zertifikats (z. B. über Let's Encrypt mit Certbot) und die Konfiguration von Nginx, um auf Port 443 mit dem Zertifikat zu lauschen.

Ein typischer HTTPS-Server-Block sieht so aus (nach dem Abrufen der Zertifikate):

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name example1.com www.example1.com;

    root /var/www/example1.com/html;
    index index.html;

    ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;

    # Andere SSL-Konfigurationen einbeziehen (Ciphers, Protokolle usw.)
    include /etc/nginx/snippets/ssl-params.conf;
    include /etc/nginx/snippets/force-ssl.conf; # Optional: leitet HTTP auf HTTPS um

    location / {
        try_files $uri $uri/ =404;
    }
}

# Optional: HTTP-zu-HTTPS-Umleitung für diese Domain
server {
    listen 80;
    listen [::]:80;
    server_name example1.com www.example1.com;
    return 301 https://$host$request_uri;
}

Es ist üblich, einen separaten HTTP-Server-Block zu haben, dessen einziger Zweck darin besteht, den gesamten Datenverkehr an sein HTTPS-Gegenstück weiterzuleiten.

Protokollierung für jede Website

Wie in den Beispielen gezeigt, ist die Zuweisung separater access_log- und error_log-Dateien für jeden virtuellen Host eine bewährte Methode. Dies erleichtert die Fehlersuche und die Analyse des Datenverkehrs für einzelne Websites erheblich, ohne sich durch kombinierte Protokolle wühlen zu müssen.

Konfigurationsdateistruktur

Erwägen Sie für größere Bereitstellungen, Ihre Nginx-Konfigurationsdateien wie folgt zu organisieren:

  • nginx.conf: Hauptkonfiguration, enthält conf.d/*.conf und sites-enabled/*.
  • conf.d/: Serverweite allgemeine Einstellungen (z. B. Gzip, Caching).
  • snippets/: Wiederverwendbare Nginx-Konfigurationsausschnitte (z. B. SSL-Parameter, gängige location-Blöcke).
  • sites-available/: Einzelne server-Blöcke für jede Website.
  • sites-enabled/: Symbolische Links zu aktiven Konfigurationen in sites-available/.

Häufige Probleme beheben

  • 403 Forbidden Error: Dies bedeutet normalerweise, dass Nginx keine Leseberechtigung für die Dateien oder Verzeichnisse Ihrer Website hat. Überprüfen Sie die Datei- und Verzeichnisberechtigungen (z. B. sudo chmod -R 755 /var/www/ihredomain.com/html und stellen Sie sicher, dass der Nginx-Benutzer, normalerweise www-data oder nginx, diese lesen kann).
  • 404 Not Found Error: Stellen Sie sicher, dass die root-Direktive in Ihrem Server-Block auf das richtige Verzeichnis zeigt und dass Ihre index.html-Datei an diesem Speicherort vorhanden ist. Stellen Sie außerdem sicher, dass try_files korrekt konfiguriert ist.
  • Falsche Website wird geladen: Dies deutet oft auf ein Problem mit der server_name-Direktive hin. Stellen Sie sicher, dass der server_name exakt mit dem Domainnamen übereinstimmt, den Sie aufrufen möchten (einschließlich www. oder Subdomains). Überprüfen Sie auch Ihre DNS-Einträge.
  • Nginx lässt sich nicht starten/neu laden: Verwenden Sie immer sudo nginx -t, um Ihre Konfiguration zu testen, bevor Sie versuchen, Nginx neu zu laden oder neu zu starten. Fehlermeldungen weisen auf die Zeile und Datei hin, in der der Syntaxfehler aufgetreten ist.
  • DNS-Probleme: Wenn Sie auf Ihre Website über die IP-Adresse zugreifen können, aber nicht über den Domainnamen, handelt es sich fast mit Sicherheit um ein DNS-Problem. Verwenden Sie dig oder nslookup, um zu überprüfen, ob die A-Einträge Ihrer Domain auf die richtige Server-IP zeigen.

Fazit

Nginx Virtual Hosts (Server-Blöcke) bieten eine leistungsstarke und flexible Möglichkeit, mehrere Websites auf einem einzigen Server zu hosten. Durch die korrekte Konfiguration von server-Blöcken mit geeigneten listen-, server_name-, root- und location-Direktiven können Sie vielfältige Web-Assets effizient verwalten. Dieser Ansatz spart nicht nur Ressourcen, sondern zentralisiert auch die Serververwaltung.

Mit dem in dieser Anleitung dargelegten grundlegenden Wissen und den praktischen Schritten sind Sie nun in der Lage, mehrere Domains auf Ihrem Nginx-Server einzurichten und zu verwalten. Denken Sie daran, Ihre Konfigurationen immer zu testen, Ihre Websites mit HTTPS zu sichern und bewährte Praktiken für Protokollierung und Verzeichnisstruktur für eine robuste und wartungsfreundliche Web-Umgebung zu befolgen. Von hier aus können Sie weitere Nginx-Funktionen wie Reverse-Proxying, Lastverteilung und Caching untersuchen, um die Leistung und Zuverlässigkeit Ihres Webservers zu verbessern.