Nginx verstehen und einrichten
nginx webserver reverse-proxy anfänger
Nginx verstehen und einrichten
Nginx (ausgesprochen "Engine-X") ist einer der beliebtesten Webserver der Welt. Dieses Guide erklärt dir, wie Nginx funktioniert und wie du ihn einrichtest.
Was ist Nginx?
Nginx kann drei Dinge besonders gut:
- Webserver: Liefert HTML, CSS, JS und Bilder aus
- Reverse Proxy: Leitet Anfragen an andere Server/Apps weiter
- Load Balancer: Verteilt Last auf mehrere Server
Warum Nginx statt Apache?
| Eigenschaft | Nginx | Apache |
|---|---|---|
| Architektur | Event-basiert | Thread/Prozess |
| RAM-Verbrauch | Niedrig | Höher |
| Statische Dateien | Sehr schnell | Schnell |
| Konfiguration | Zentrale Datei | .htaccess möglich |
| Ideal für | Hohe Zugriffszahlen | Shared Hosting |
Installation
Ubuntu/Debian
# Installieren
sudo apt update
sudo apt install nginx -y
# Status prüfen
sudo systemctl status nginx
# Starten/Stoppen/Neu laden
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl reload nginx # Konfiguration neu laden (ohne Downtime)
sudo systemctl restart nginx # Komplett neu starten
Nach der Installation erreichst du unter http://deine-ip die Nginx-Willkommensseite.
Verzeichnisstruktur verstehen
/etc/nginx/
├── nginx.conf # Hauptkonfiguration
├── sites-available/ # Alle verfügbaren Seiten-Configs
│ ├── default # Standard-Seite
│ └── example.com # Deine Seiten
├── sites-enabled/ # Aktive Seiten (Symlinks!)
│ └── default -> ../sites-available/default
├── snippets/ # Wiederverwendbare Config-Teile
└── mime.types # Dateiendungen → Content-Types
/var/www/
└── html/ # Standard Document Root
└── index.nginx-debian.html
/var/log/nginx/
├── access.log # Alle Zugriffe
└── error.log # Fehler
Grundlegende Konfiguration
Die nginx.conf verstehen
sudo nano /etc/nginx/nginx.conf
# Anzahl der Worker-Prozesse (auto = CPU-Kerne)
worker_processes auto;
events {
# Max. gleichzeitige Verbindungen pro Worker
worker_connections 1024;
}
http {
# MIME-Types laden
include /etc/nginx/mime.types;
# Standard Content-Type
default_type application/octet-stream;
# Logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Performance-Optimierung
sendfile on;
keepalive_timeout 65;
# Gzip-Kompression
gzip on;
gzip_types text/plain text/css application/json application/javascript;
# Server-Blocks (Seiten) laden
include /etc/nginx/sites-enabled/*;
}
Erste eigene Website einrichten
Schritt 1: Verzeichnis erstellen
# Ordner für die Website
sudo mkdir -p /var/www/example.com/html
# Beispiel-Datei erstellen
echo "<h1>Willkommen auf example.com!</h1>" | sudo tee /var/www/example.com/html/index.html
# Berechtigungen setzen
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
Schritt 2: Server-Block erstellen
sudo nano /etc/nginx/sites-available/example.com
server {
# Auf Port 80 hören
listen 80;
listen [::]:80;
# Domain(s) für diese Seite
server_name example.com www.example.com;
# Wo liegen die Dateien?
root /var/www/example.com/html;
# Standard-Datei
index index.html index.htm;
# Anfragen verarbeiten
location / {
try_files $uri $uri/ =404;
}
# Logs für diese Seite
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
}
Schritt 3: Seite aktivieren
# Symlink in sites-enabled erstellen
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# Konfiguration testen
sudo nginx -t
# Wenn OK: Nginx neu laden
sudo systemctl reload nginx
💡 Tipp: Immer nginx -t vor dem Reload ausführen!
Nginx als Reverse Proxy
Ein Reverse Proxy leitet Anfragen an eine Backend-App weiter. Das ist nützlich für: - Node.js, Python, PHP-Apps - Docker-Container - Load Balancing
Beispiel: Flask-App (Port 5000)
server {
listen 80;
server_name app.example.com;
location / {
# Anfragen an Flask weiterleiten
proxy_pass http://127.0.0.1:5000;
# Header für die Backend-App setzen
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Beispiel: Node.js mit WebSocket
server {
listen 80;
server_name node.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
# WebSocket-Unterstützung
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Standard-Header
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
SSL/HTTPS mit Let's Encrypt
Certbot installieren
sudo apt install certbot python3-certbot-nginx -y
Zertifikat holen (automatisch)
# Für eine Domain
sudo certbot --nginx -d example.com -d www.example.com
# Nur Zertifikat holen (manuell einbinden)
sudo certbot certonly --nginx -d example.com
Certbot: 1. Holt das Zertifikat 2. Ändert deine Nginx-Config automatisch 3. Richtet automatische Erneuerung ein
Ergebnis prüfen
# Zertifikate anzeigen
sudo certbot certificates
# Erneuerung testen
sudo certbot renew --dry-run
Manuelle SSL-Config
Falls du es selbst konfigurieren willst:
server {
listen 443 ssl http2;
server_name example.com;
# SSL-Zertifikate
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL-Einstellungen (modern)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
root /var/www/example.com/html;
index index.html;
}
# HTTP → HTTPS Redirect
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
Nützliche location-Blöcke
Statische Dateien cachen
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
PHP mit PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
}
Verzeichnis schützen (Basic Auth)
# Passwort-Datei erstellen
sudo apt install apache2-utils -y
sudo htpasswd -c /etc/nginx/.htpasswd admin
location /admin {
auth_basic "Admin-Bereich";
auth_basic_user_file /etc/nginx/.htpasswd;
}
Bestimmte IPs blockieren
location / {
deny 192.168.1.100;
deny 10.0.0.0/8;
allow all;
}
Debugging und Logs
Konfiguration testen
# Syntax prüfen
sudo nginx -t
# Detaillierte Infos
sudo nginx -T
Logs lesen
# Zugriffs-Log live
sudo tail -f /var/log/nginx/access.log
# Fehler-Log live
sudo tail -f /var/log/nginx/error.log
# Nach Fehlern suchen
sudo grep -i error /var/log/nginx/error.log
Häufige Fehler
| Fehler | Ursache | Lösung |
|---|---|---|
| 502 Bad Gateway | Backend nicht erreichbar | Backend-App prüfen |
| 403 Forbidden | Keine Berechtigung | chown www-data:www-data |
| 404 Not Found | Datei existiert nicht | root und Pfade prüfen |
| 413 Entity Too Large | Upload zu groß | client_max_body_size erhöhen |
client_max_body_size erhöhen
# In server oder http Block
client_max_body_size 100M;
Performance-Tipps
Gzip aktivieren
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_types
text/plain
text/css
text/javascript
application/json
application/javascript
application/xml;
Worker optimieren
# In nginx.conf
worker_processes auto;
events {
worker_connections 2048;
use epoll;
multi_accept on;
}
Keepalive für Upstreams
upstream backend {
server 127.0.0.1:5000;
keepalive 32;
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
Zusammenfassung
| Aufgabe | Befehl/Datei |
|---|---|
| Installieren | sudo apt install nginx |
| Status | sudo systemctl status nginx |
| Config testen | sudo nginx -t |
| Neu laden | sudo systemctl reload nginx |
| Seite erstellen | /etc/nginx/sites-available/name |
| Seite aktivieren | ln -s sites-available/x sites-enabled/ |
| SSL holen | sudo certbot --nginx -d domain.com |
| Logs | /var/log/nginx/ |
Nächste Schritte
- Load Balancing – Mehrere Backend-Server
- Rate Limiting – DDoS-Schutz
- Security Headers – XSS, Clickjacking verhindern
- Nginx + Docker – Container als Backend