Nginx Grundkonfiguration
Einstieg in Nginx: Installation, Verzeichnisstruktur, der erste Server-Block und wie man Änderungen übernimmt, ohne den Dienst lahmzulegen. Vertiefung in Nginx Reverse Proxy und Load Balancing. Dazu die Animation Nginx: Grundkonfiguration (einfach).
Installation
# Debian/Ubuntu sudo apt install nginx # Rocky/RHEL (ggf. vorher epel-release) sudo dnf install nginx
sudo systemctl enable --now nginx sudo systemctl status nginx
Erster Verdacht bei "geht nicht von außen": Nginx läuft und antwortet lokal, trotzdem kommt von einem anderen Rechner nichts an – meist blockiert die lokale Firewall (ufw, firewalld) Port 80/443, nicht Nginx selbst.
Verzeichnisstruktur
| Pfad | Zweck |
|---|---|
/etc/nginx/nginx.conf |
Hauptkonfiguration, lädt die anderen Dateien per include
|
/etc/nginx/conf.d/*.conf bzw. sites-available/sites-enabled |
eingebundene Server-Blöcke – sites-* nur bei Debian/Ubuntu üblich, bei Rocky/RHEL meist direkt conf.d
|
/var/www/html |
Standard-Webroot, per root frei änderbar
|
/var/log/nginx/access.log, error.log |
erster Blick bei jeder Störung |
sudo nginx -T gibt die komplette, tatsächlich geladene Konfiguration aus.
Der erste Server-Block
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
try_files $uri $uri/ =404; prüft erst die Datei, dann das Verzeichnis, sonst eine 404-Antwort. Fehlt die Index-Datei und ist kein passender location-Block da, antwortet Nginx mit 403 Forbidden (kein Directory Listing erlaubt) oder 404 – nicht mit einer Meldung über die fehlende Datei selbst.
Sicher ändern
sudo nginx -t && sudo systemctl reload nginx
nginx -t prüft nur die Syntax, ohne etwas zu verändern. systemctl reload übernimmt eine gültige Konfiguration ohne Verbindungsabbruch – anders als restart, der den Dienst kurz komplett beendet: Bei einem Tippfehler in der Konfiguration kommt er danach nicht mehr hoch, und die Seite ist für alle weg. Das && sorgt dafür, dass bei einem Syntaxfehler gar nicht erst neu geladen wird.
Mehrere Sites
Mehrere server-Blöcke können denselben Port teilen. server_name entscheidet anhand des Host-Headers, welcher Block zuständig ist – nicht die Reihenfolge im Config.
server {
listen 80;
server_name a.example.com;
root /srv/a;
}
server {
listen 80;
server_name b.example.com;
root /srv/b;
}
Wichtig: server_name erzeugt keinen DNS-Eintrag. Ohne passenden DNS-Eintrag, der auf diesen Server zeigt, landet eine Anfrage nie hier. listen 80 default_server; fängt alle Anfragen ohne passenden server_name auf.
Fehlerbilder
| Symptom | Ursache | Erster Schritt |
|---|---|---|
| Seite lädt gar nicht | Dienst nicht gestartet oder Firewall blockiert Port | systemctl status nginx, dann Firewall-Regeln prüfen
|
| 403 Forbidden | Dateirechte oder kein Index, kein Directory Listing erlaubt | Rechte und Vorhandensein der Index-Datei prüfen |
| 404 Not Found | falscher root oder Datei liegt woanders |
root im richtigen server-Block prüfen
|
| Dienst nach Änderung ganz weg | restart statt reload bei fehlerhafter Konfiguration |
vor jedem Reload: nginx -t
|
Änderung an sites-available wirkt nicht |
Symlink in sites-enabled fehlt (Debian-Familie) |
ln -s ../sites-available/datei sites-enabled/datei
|