NGINX Performance Tuning

6 Kernkonzepte
Die wichtigsten NGINX-Direktiven für Performance-Optimierung: worker_processes · worker_connections · gzip · caching · buffer · keepalive Diese Direktiven optimieren die Leistung von NGINX – von der Worker-Prozess-Konfiguration über Komprimierung und Caching bis hin zu Verbindungsmanagement und Buffering.

Worker Processes – worker_processes & worker_connections

worker_processes auto · worker_connections 1024
worker_processes auto; worker_connections 1024; worker_rlimit_nofile 65536; use epoll;

Worker Processes steuern, wie viele NGINX-Arbeitsprozesse laufen. worker_connections begrenzt die Anzahl gleichzeitiger Verbindungen pro Worker.

Wichtige Direktiven

Direktive Beschreibung Empfehlung
worker_processes Anzahl der Worker-Prozesse auto (entspricht CPU-Kernen)
worker_connections Max. Verbindungen pro Worker 1024 - 4096 (je nach RAM)
worker_rlimit_nofile Max. offene Dateien pro Worker 65536 (oder höher)
use Event-Methode epoll (Linux), kqueue (BSD)
multi_accept Mehrere Verbindungen gleichzeitig on (für hohe Last)
Beispiele
# Optimale Worker-Konfiguration
worker_processes auto;
worker_connections 4096;
worker_rlimit_nofile 65536;
use epoll;
multi_accept on;
# Maximale Verbindungen berechnen
# max_connections = worker_processes * worker_connections
# Bei 4 Workers * 4096 = 16.384 gleichzeitige Verbindungen
# CPU-Affinität (welche CPU-Kerne genutzt werden)
worker_cpu_affinity auto;
Tipp: Mit worker_processes auto nutzt NGINX automatisch alle verfügbaren CPU-Kerne. Die maximale Anzahl Verbindungen ist worker_processes * worker_connections.

gzip – Komprimierung aktivieren

gzip on · gzip_types · gzip_comp_level
gzip on; gzip_types text/plain text/css application/json; gzip_comp_level 6; gzip_min_length 1000;

gzip komprimiert Antworten, bevor sie an den Client gesendet werden – das reduziert die Bandbreitennutzung und verbessert die Ladezeit.

Wichtige gzip-Direktiven

Direktive Beschreibung Empfehlung
gzip on Komprimierung aktivieren on
gzip_types MIME-Typen, die komprimiert werden text/*, application/json, application/javascript
gzip_comp_level Komprimierungsstufe (1-9) 5-6 (gute Balance)
gzip_min_length Mindestgröße für Komprimierung 1000 (Bytes)
gzip_proxied Komprimierung für Proxy-Antworten any
gzip_disable Deaktivierung für bestimmte User-Agents "msie6"
gzip_vary Vary-Header setzen on
Beispiele
# Optimale gzip-Konfiguration
gzip on;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
gzip_proxied any;
gzip_vary on;
gzip_disable "msie6";
# Zusätzlich: Static Assets vorkomprimieren
gzip_static on;
Tipp: Die Komprimierungsstufe 6 bietet eine gute Balance zwischen CPU-Last und Komprimierungsrate. Für statische Assets empfiehlt sich gzip_static on, um vorkomprimierte .gz-Dateien auszuliefern.

Caching – Cache-Konfiguration

proxy_cache · expires · cache-control
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m; proxy_cache mycache; expires 1d;

Caching reduziert die Last auf Backend-Server und verbessert die Antwortzeiten erheblich. NGINX kann sowohl Proxy-Caching als auch Browser-Caching steuern.

Beispiele
# Proxy-Cache einrichten
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:100m inactive=60m max_size=1g;
# Cache nutzen
location /api/ {
proxy_cache mycache;
proxy_cache_key $scheme$proxy_host$request_uri;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
proxy_pass http://backend;
}
# Browser-Caching für statische Assets
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
# Cache-Status-Header (Debugging)
add_header X-Cache-Status $upstream_cache_status;
Tipp: Der Cache-Status-Header (X-Cache-Status) hilft beim Debugging – mögliche Werte: HIT, MISS, BYPASS, EXPIRED.

Buffer & Timeouts – proxy_buffer, client_header_timeout

client_body_buffer_size · proxy_buffers · keepalive_timeout
client_header_timeout 60; proxy_buffers 8 16k; keepalive_timeout 65;

Buffer und Timeouts steuern, wie NGINX mit eingehenden und ausgehenden Daten umgeht – sie verhindern Speicherprobleme und hängende Verbindungen.

Wichtige Direktiven

Direktive Beschreibung Empfehlung
client_header_timeout Timeout für Header 60s
client_body_timeout Timeout für Body 60s
client_body_buffer_size Buffer für Body 128k
client_max_body_size Maximale Body-Größe 1m-100m (je nach Anwendung)
proxy_buffers Anzahl/Größe der Proxy-Buffer 8 16k oder 32 16k
proxy_buffer_size Größe für Proxy-Header 16k
proxy_busy_buffers_size Buffer für aktive Verbindungen 32k
send_timeout Timeout für Senden 60s
Beispiele
# Buffer-Konfiguration für große Uploads
client_body_buffer_size 128k;
client_max_body_size 100m;
client_header_timeout 60;
client_body_timeout 60;
# Proxy-Buffer für schnelle Backends
proxy_buffers 32 16k;
proxy_buffer_size 16k;
proxy_busy_buffers_size 32k;
# Keep-Alive und Timeouts
keepalive_timeout 65;
keepalive_requests 100;
Tipp: Für Proxy-Setups mit langsamen Backends können Sie proxy_buffering off verwenden, um Daten direkt an den Client zu streamen (z.B. für große Dateien oder Server-Sent Events).

Keepalive & Connections – Verbindungen optimieren

keepalive · keepalive_requests · keepalive_timeout
keepalive_timeout 65; keepalive_requests 100; upstream backend { keepalive 32; }

Keepalive reduziert den Overhead durch den Aufbau neuer Verbindungen, indem bestehende Verbindungen wiederverwendet werden – sowohl für Client-Verbindungen als auch für Upstream-Verbindungen.

Beispiele
# Client Keep-Alive
keepalive_timeout 65;
keepalive_requests 100;
# Upstream Keep-Alive (Proxy)
upstream backend_servers {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
keepalive 32;
}
# Proxy-Konfiguration mit Keep-Alive
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://backend_servers;
}
Tipp: Für Upstream-Keepalive muss proxy_http_version 1.1 und proxy_set_header Connection "" gesetzt werden. Die Anzahl der Keepalive-Verbindungen sollte der Anzahl der Worker-Prozesse entsprechen.

Limits & Security – Ratenbegrenzung & Schutz

limit_req · limit_conn · client_max_body_size
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s; limit_req zone=mylimit burst=20 nodelay; client_max_body_size 10m;

Limits schützen Ihren Server vor Überlastung und Missbrauch – durch Ratenbegrenzung, Verbindungslimits und maximale Body-Größen.

Beispiele
# Ratenbegrenzung (Rate Limiting)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;
# Ratenbegrenzung anwenden
location /api/ {
limit_req zone=api_limit burst=10 nodelay;
proxy_pass http://backend;
}
# Verbindungslimit pro IP
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 10;
# Maximale Body-Größe (Uploads)
client_max_body_size 20m;
# Logging von limit-Überschreitungen
limit_req_log_level warn;
limit_conn_log_level warn;
# Statuscode bei Ablehnung
limit_req_status 429;
limit_conn_status 503;
Tipp: limit_req mit burst und nodelay ermöglicht eine sanftere Ratenbegrenzung – kurze Spitzen werden erlaubt, langfristig wird die Rate begrenzt.

Performance-Tuning im Überblick

worker Worker-Prozesse
worker_processes, worker_connections
gzip Komprimierung
Bandbreite sparen
cache Caching
proxy_cache, expires
buffer Buffer & Timeouts
proxy_buffers, keepalive_timeout
keepalive Connection-Management
keepalive, keepalive_requests
limit Ratenbegrenzung
limit_req, limit_conn

Quick Summary

worker
Worker-Prozesse
gzip
Komprimierung
cache
Caching
buffer
Buffer
keepalive
Verbindungen
limit
Ratenbegrenzung
worker_processes auto · gzip on · proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m