Nginx Access Logs: Was jedes Feld bedeutet
Nginx Access Logs zeichnen jede Anfrage auf, die Ihr Webserver verarbeitet. Sie sind die erste Anlaufstelle bei der Fehlersuche von 404s, der Verfolgung langsamer Endpunkte oder der Untersuchung verdächtigen Traffics. Dennoch überfliegen viele Entwickler die rohen Logzeilen, ohne jedes Feld vollständig zu verstehen. Dieser Leitfaden erklärt das Standard-Nginx-Logformat, zeigt, wie Sie es anpassen, und führt durch praktische Analysetechniken mit Standard-Kommandozeilen-Tools.
Standard-Nginx-Access-Log-Format
Standardmäßig verwendet Nginx das combined-Logformat, das so aussieht:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
Eine typische Logzeile:
192.0.2.1 - - [10/Oct/2023:13:55:36 +0000] "GET /api/users HTTP/1.1" 200 1234 "https://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
Feld-für-Feld-Erklärung
| Feld | Variable | Beschreibung |
|---|---|---|
| Remote-Adresse | $remote_addr | IP-Adresse des Clients, der die Anfrage stellt. |
| Remote-Benutzer | $remote_user | Benutzername bei HTTP-Authentifizierung; andernfalls -. |
| Lokale Zeit | $time_local | Lokale Serverzeit im Format [Tag/Monat/Jahr:Stunde:Minute:Sekunde Zone]. |
| Anfrage | $request | Vollständige Anfragezeile: Methode, Pfad und HTTP-Protokoll. |
| Status | $status | HTTP-Response-Statuscode (z. B. 200, 404, 500). |
| Gesendete Body-Bytes | $body_bytes_sent | Größe des Response-Bodys in Bytes, ohne Header. |
| Referer | $http_referer | Die Seite, die auf die Anfrage verlinkt hat (falls vom Client übermittelt). |
| User Agent | $http_user_agent | Client-Software-String (Browser, Bot, Tool). |
Anpassen des Logformats
Sie können ein eigenes Format definieren, um zusätzliche Details wie Anfragezeit, Upstream-Antwortzeit oder Gzip-Ratio zu erfassen. Fügen Sie eine log_format-Direktive im http-Block hinzu und referenzieren Sie sie in access_log.
http {
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log detailed;
}
Häufige zusätzliche Variablen:
$request_time– Gesamtzeit vom Empfang des ersten Bytes bis zum Senden des letzten Bytes.$upstream_response_time– Zeit, die auf den Upstream gewartet wurde (z. B. PHP-FPM, Node.js).$gzip_ratio– Komprimierungsverhältnis, wenn gzip aktiviert ist.$http_x_forwarded_for– ursprüngliche Client-IP hinter einem Proxy oder Load Balancer.
Analysieren von Nginx-Logs mit Kommandozeilen-Tools
Sie benötigen keine teure Software, um Erkenntnisse zu gewinnen. Standard-Unix-Tools wie grep, awk, sort und uniq sind für die meisten Aufgaben leistungsstark genug.
1. Die häufigsten IP-Adressen finden
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Dies hilft, stark frequentierende Quellen oder potenzielle DDoS-Quellen zu identifizieren.
2. Die meistangefragten URLs ermitteln
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Nützlich, um beliebte Inhalte zu verstehen oder ungewöhnliche Muster zu erkennen.
3. HTTP-Statuscodes zählen
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
Sehen Sie schnell, wie viele 404s oder 500s auftreten.
4. Anfragen mit langsamen Antwortzeiten finden
Wenn Sie $request_time zu Ihrem Logformat hinzugefügt haben, können Sie nach langsamen Anfragen filtern:
awk '{ if ($NF > 1) print }' /var/log/nginx/access.log
Passen Sie den Schwellenwert (hier 1 Sekunde) nach Bedarf an.
5. Verdächtige User Agents erkennen
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Achten Sie auf bekannte bösartige Bots oder ungewöhnliche Clients.
Praktische Anwendungsfälle
- Fehlerbehebung: Korrelieren Sie 500-Fehler mit bestimmten Endpunkten oder Upstream-Antwortzeiten.
- Performance-Tuning: Identifizieren Sie langsame Seiten und optimieren Sie Datenbankabfragen oder Caching.
- Sicherheitsüberwachung: Erkennen Sie Brute-Force-Versuche (viele 401/403 von derselben IP) oder SQL-Injection-Muster in URLs.
- Kapazitätsplanung: Verfolgen Sie das Anforderungsvolumen über die Zeit, um Skalierungsbedarf vorherzusehen.
Automatisierung der Analyse mit Log-Parsern
Während Kommandozeilen-Einzeiler für Ad-hoc-Abfragen funktionieren, profitieren regelmäßige Berichte von speziellen Tools. Sie können Open-Source-Log-Analyzer wie GoAccess oder AWStats verwenden oder eigene Skripte erstellen. Für schnelles, browserbasiertes Parsing ohne Installation können Sie mit dem Nginx Log Analyzer Logzeilen einfügen und sofort Zusammenfassungen von Statuscodes, Top-IPs und angefragten Pfaden erhalten.
Best Practices für das Log-Management
- Logs regelmäßig rotieren: Verwenden Sie
logrotate, um Probleme mit dem Speicherplatz zu vermeiden. - Logs zentralisieren: Übertragen Sie sie an ein Log-Management-System (z. B. ELK, Graylog) für langfristige Speicherung und Suche.
- Request-IDs einbeziehen: Fügen Sie
$request_idhinzu, um mit Anwendungslogs zu korrelieren. - Datenschutz beachten: Anonymisieren Sie IPs, falls dies durch die DSGVO oder andere Vorschriften erforderlich ist.
FAQ
Was ist der Unterschied zwischen Access Logs und Error Logs in Nginx?
Access Logs zeichnen jede von Nginx verarbeitete Anfrage auf, einschließlich Client-IP, Anfragemethode, Statuscode und User Agent. Error Logs erfassen Diagnosemeldungen zu Serverproblemen wie fehlgeschlagene Verbindungen, Konfigurationsfehler oder Upstream-Timeouts. Beide sind für verschiedene Fehlerbehebungsszenarien unerlässlich.
Wie kann ich die echte Client-IP sehen, wenn Nginx hinter einem Load Balancer steht?
Wenn Nginx hinter einem Proxy oder Load Balancer steht, zeigt $remote_addr die IP des Balancers. Um die ursprüngliche Client-IP zu protokollieren, konfigurieren Sie das real_ip-Modul so, dass es der IP des Balancers vertraut, und verwenden Sie $http_x_forwarded_for oder $realip_remote_addr in Ihrem Logformat.
Kann ich Nginx-Logs ohne Installation von Software analysieren?
Ja. Sie können Standard-Unix-Befehle wie grep, awk und sort direkt im Terminal verwenden. Für einen grafischen, browserbasierten Ansatz bieten Online-Tools wie der Nginx Log Analyzer schnelle Einblicke ohne Installation.
Bereit, in Ihre Logs einzutauchen? Probieren Sie den Nginx Log Analyzer, um Ihre Access Logs in Sekunden zu parsen und zu visualisieren – ohne Einrichtung.