← Zurück

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:

  1. Webserver: Liefert HTML, CSS, JS und Bilder aus
  2. Reverse Proxy: Leitet Anfragen an andere Server/Apps weiter
  3. 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