Dieser Artikel behandelt wichtige Konfigurationen für die Optimierung der Leistung des nginx-Webservers, darunter gzip-Komprimierung, proxy_buffer-Einstellungen, Worker- und Keep-Alive-Einstellungen.
Besonders hervorgehoben werden die gzip-Komprimierung und die proxy_buffer-Pufferung zur Reduzierung des Datenverkehrs und Minimierung der Serverlast sowie die Bedeutung der Verwaltung von Verbindungen durch Worker-Prozesse und Keep-Alive-Einstellungen.
Es werden verschiedene Tests vorgestellt, um die optimalen Einstellungen für die jeweilige Serverumgebung zu finden und Hinweise für einen stabilen Serverbetrieb gegeben.
Nginx ist eine Open-Source-Software, die häufig als Webserver oder Webproxyserver verwendet wird.
Mit der richtigen Konfiguration kann es statische Inhalte effizient bereitstellen.
In diesem Beitrag möchte ich einige wichtige Konfigurationseinstellungen dokumentieren.
Wichtige Konfigurationseinstellungen für die Leistung
1. gzip-Komprimierung
Beim Laden einer Website werden viele Dateien wie JavaScript, Bilder, HTML und CSS vom Webserver heruntergeladen.
Anstatt diese Inhalte unkomprimiert zu übertragen, kann die gzip-Komprimierung die Datenmenge deutlich reduzieren.
Die Vorteile der gzip-Komprimierung sind:
- Reduzierung der Datenmenge und somit Einsparung von Bandbreite.
- Einsparung von Serverressourcen.
- Schnellere Ladezeiten für den Benutzer.
Allerdings kann die gzip-Komprimierung, da der Server die Komprimierung vor dem Senden der Inhalte durchführen muss, zu einer höheren CPU-Auslastung führen.
Es ist daher wichtig, vor der Implementierung in der Produktion zu testen, welche Dateitypen komprimiert werden sollen, welche Komprimierungsstufe verwendet werden soll und welche Dateigrößen komprimiert werden sollen.
Im Folgenden sind einige gzip-relevante Konfigurationseinstellungen aufgeführt:
gzip on; # Aktiviert die gzip-Komprimierung.
gzip_vary on; # Fügt den Header Vary: Accept-Encoding hinzu.
gzip_proxied any; # Komprimiert Antworten vom Backend, wenn Nginx als Proxyserver verwendet wird (Komprimierung von proxierten Anfragen).
gzip_min_length 256; # Komprimiert nur Dateien größer als 256 Byte.
gzip_comp_level 5; # Setzt die Komprimierungsstufe von 1 bis 9. Höhere Werte erhöhen die CPU-Auslastung. 5 entspricht einer Komprimierung von etwa 50%.
gzip_types text/plain text/css text/xml application/json application/javascript;
// Legt die zu komprimierenden Content-Types fest.
* `gzip_vary` sorgt dafür, dass der Client sowohl die komprimierte als auch die unkomprimierte Version der Inhalte erhält, je nachdem ob er gzip unterstützt oder nicht. (Es wird angegeben, dass abhängig vom Client-Request-Header (Accept-Encoding) verschiedene Versionen des Inhalts bereitgestellt werden können.)
2. proxy_buffer-Einstellungen
Nginx speichert die Antwort in einem Puffer, bevor er sie an den Client sendet.
Wenn der Webserver eine Antwort an einen Client sendet und der Client langsam ist, muss der Server auf die Datenübertragung warten (Netzwerk-Engpass).
Da dabei Serverressourcen verbraucht werden, wird ein Puffer verwendet, um die Antwort unabhängig von der Geschwindigkeit des Clients vorübergehend zu verarbeiten. Dies bietet folgende Vorteile:
- Optimierung der Serverauslastung
- Reduzierung von Netzwerk-Engpässen
location / {
proxy_pass Server-URL;
# Proxy-Puffer-Einstellungen proxy_buffering on; # Aktiviert die Pufferung.proxy_buffer_size 4k; # Legt die Größe des Puffersfest(meist für Header).proxy_buffers8 4k; # Anzahl und Größe der Puffer pro Verbindung(8Puffer à 4kb).proxy_busy_buffers_size 8k; # MaximalePuffergröße, die während des Sendens der Antwort an den Client verwendet werden kann.}
※ Eine zu große Puffergröße kann zu Verzögerungen bei der Übertragung von Echtzeitdaten wie Text-Streaming führen. Daher sind Tests unerlässlich. Dies ist besonders wichtig für neuere KI-Dienste. Wenn Text-Streaming nicht funktioniert, überprüfen Sie unbedingt diese Einstellung.
3. worker- und http-Einstellungen
Worker sind Prozesse, die Client-Anfragen bearbeiten. Man kann festlegen, wie viele Worker pro CPU-Kern verwendet werden sollen.
HTTP besteht normalerweise aus Anfrage - Verbindung - Antwort - Verbindungsende. Um die Ressourcen für mehrere Anfragen zu reduzieren, kann die Client-Verbindung aufrechterhalten werden. Dies ist die Keep-Alive-Einstellung.
worker_processes auto; # Automatische Einstellung basierend auf der Anzahl der verfügbaren CPU-Kerne
worker_connections 1024; # Anzahl der Verbindungen, die jeder Worker gleichzeitig verarbeiten kann
# Keep-Alive-Einstellungen
keepalive_timeout 65;
keepalive_requests 100;
server {
listen 80;
location / {
proxy_pass Server-URL;
}
}
Die beiden Einstellungen werden aus folgenden Gründen zusammengefasst:
Wenn der Server beispielsweise 4 Kerne hat, beträgt die theoretische Anzahl der möglichen Verbindungen 1.024 * 4 = 4.096.
(Dies kann je nach Ressourcen und Traffic-Situation ungenau sein)
Wenn 4.096 Clients gleichzeitig eine Verbindung herstellen und 65 Sekunden lang alle Keep-Alive-Verbindungen belegen,
kann der 4.097. Benutzer keine Verbindung herstellen, was zu Verzögerungen führen kann.
Wenn man also von stabilen Serverressourcen durch Auto-Scaling ausgeht, können diese Einstellungen bei Ereignissen indirekt zu Antwortverzögerungen beitragen.
4. Sonstiges - location-Block
Einige Einstellungen wie der Proxy-Puffer können pro angeforderter URL angewendet werden.
* Einige Einstellungen wie Keep-Alive werden auf HTTP/Server-Ebene angewendet und können nicht pro Block konfiguriert werden.
Mit diesen Einstellungen kann die Web-Performance optimiert werden. Führen Sie ausreichend Tests mit verschiedenen Testfällen durch, um die Serverleistung zu optimieren!
* Die Änderungen an der Nginx-Konfiguration können in der Regel ohne Server-Ausfallzeiten angewendet werden und sind daher sehr zuverlässig.