Zurück zum Blog

So lesen Sie Nginx-Zugriffsprotokolle

2025-08-2012 min read

Wenn etwas fehlschlägt, erzählt das Zugriffsprotokoll eine Geschichte. Wer die Seite aufgerufen hat. Was sie angefordert haben. Welche URLs fehlgeschlagen sind. Wann ein Anstieg begann. Ich habe diese Schritte in einem realen Projekt angewendet und sie haben funktioniert. Die folgenden Beispiele sind sicher zu kopieren und auszuführen und können dann für Ihre Einrichtung angepasst werden.

Was sind Nginx-Zugriffsprotokolle?

Nginx-Zugriffsprotokolle sind Textdateien, die jede HTTP-Anfrage aufzeichnen, die Ihr Webserver empfängt. Jede Zeile stellt eine Anfrage dar und enthält Details wie die IP-Adresse des Clients, den Zeitstempel, die HTTP-Methode, den URL-Pfad, den Statuscode, die Antwortgröße und mehr.

Diese Protokolle werden automatisch von Nginx generiert, während es Anfragen verarbeitet. Jedes Mal, wenn jemand Ihre Website besucht, auf einen Link klickt, ein Formular absendet oder sogar eine fehlerhafte URL aufruft, schreibt Nginx eine Zeile in das Zugriffsprotokoll. Dies geschieht in Echtzeit, sodass die Protokolldatei ständig wächst.

Wie Zugriffsprotokolle funktionieren

Nginx verwendet ein konfigurierbares Protokollformat, das in Ihrer nginx.conf-Datei definiert ist. Das Standardformat sieht so aus:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent"';

Dies erstellt Protokolleinträge wie:

192.168.1.100 - - [20/Aug/2025:10:30:45 +0000] "GET /blog/post HTTP/1.1" 200 1234 "https://example.com/" "Mozilla/5.0..."

Viele moderne Setups verwenden ein detaillierteres JSON-ähnliches Format mit Schlüssel=Wert-Paaren, was die Beispiele in diesem Beitrag voraussetzen.

CDN vs. Ursprungsserver: Wo man nach Protokollen sucht

Wenn Sie ein CDN (wie Cloudflare, CloudFront oder Fastly) verwenden, gibt es zwei verschiedene Protokollsätze zu berücksichtigen:

CDN-Edge-Protokolle: Zeigen Anfragen von tatsächlichen Benutzern, die das CDN aufrufen. Diese enthalten die echten Client-IPs, User-Agents und geografischen Standorte.

Ursprungsserver-Protokolle (was dieser Beitrag abdeckt): Zeigen Anfragen, die es durch das CDN zu Ihrem Nginx-Server geschafft haben. Diese Protokolle zeigen oft die IP-Adresse des CDNs als Client und nicht die IP des Endbenutzers.

Zur Fehlerbehebung möchten Sie normalerweise zuerst die CDN-Protokolle. Überprüfen Sie die Ursprungsserver-Protokolle nur, wenn Sie sehen müssen, was Ihren Server tatsächlich erreicht hat, oder wenn Sie serverseitige Probleme beheben.

Alle Beispiele gehen von Schlüssel=Wert-Protokollen aus (Felder wie status="404" und request="GET /path HTTP/1.1") und Dateien unter /var/log/nginx/. Passen Sie die Namen nach Bedarf an.

Was Sie lernen werden

  • Wie man Live- und Gzip-Protokolle auf einmal liest
  • Wie man Top-IPs und Top-fehlerhafte URLs findet
  • Wie man alles von einer IP abruft
  • Wie man in ein kurzes Zeitfenster hineinzoomt
  • Wie man Zugriffsprotokolle mit WAF-Blocks verknüpft
  • Wie man Ergebnisse schnell und nützlich hält

Schnellstart

Lesen Sie alles, egal ob die Datei .log oder .gz ist:

zgrep -h . /var/log/nginx/ssl-*.access.log*

Dieser zgrep-Trick verarbeitet sowohl normale als auch rotierte Dateien. Fügen Sie danach Filter hinzu.

Verwendete Werkzeuge

zgrep: Wie grep, aber funktioniert sowohl mit regulären Dateien als auch mit komprimierten (.gz) Dateien. Perfekt für Protokolldateien, die rotiert und komprimiert werden.

awk: Ein leistungsstarkes Textverarbeitungswerkzeug, das Zeilen nach Trennzeichen aufteilen und bestimmte Felder extrahieren kann. Großartig zum Parsen strukturierter Protokollformate.

cut: Extrahiert bestimmte Spalten oder Felder aus Text. Verwenden Sie -d, um ein Trennzeichen (wie Anführungszeichen oder Kommas) anzugeben, und -f, um auszuwählen, welche Feldnummer Sie möchten.

Finden Sie Top-IPs hinter 404-Stürmen

Wenn Redakteure "viele defekte Links" melden, beginnen Sie hier.

zgrep -h . /var/log/nginx/ssl-*.access.log* \
| awk -F'status="' '$2 ~ /^404"/' \
| awk -F'x_forwarded_for="' '{print $2}' \
| cut -d'"' -f1 | cut -d',' -f1 \
| LC_ALL=C sort | uniq -c | sort -nr | head

Warum es hilft. Sie sehen zuerst die schlimmsten Übeltäter. Wenn eine IP zufällige Pfade scannt, werden Sie sie schnell erkennen.

Sehen Sie alles, was eine einzelne IP getan hat

Nützlich, wenn Sie einen Block oder einen Anstieg von einer Quelle erklären müssen.

IP="112.134.209.112"
zgrep -h . /var/log/nginx/ssl-*.access.log* \
| grep -F 'x_forwarded_for="'$IP

Tipp. In einigen Stacks kann die Client-IP in src oder src_ip stehen. Wenn ja, tauschen Sie den Feldnamen im grep aus.

Top-URLs, die von dieser IP aufgerufen wurden (Ignorieren Sie Abfragezeichenfolgen)

IP="112.134.209.112"
zgrep -h . /var/log/nginx/ssl-*.access.log* \
| grep -F 'x_forwarded_for="'$IP \
| awk -F'request="' '{print $2}' | cut -d'"' -f1 \
| awk '{print $2}' | cut -d'?' -f1 \
| LC_ALL=C sort | uniq -c | sort -nr | head

Warum es hilft. Das Weglassen der Abfragezeichenfolge gruppiert "dieselbe Seite mit unterschiedlichen Parametern" zusammen, was Muster offensichtlich macht.

Top-fehlerhafte URLs nach Status

404er:

zgrep -h . /var/log/nginx/ssl-*.access.log* \
| awk -F'status="' '$2 ~ /^404"/' \
| awk -F'request="' '{print $2}' | cut -d'"' -f1 \
| awk '{print $2}' | cut -d'?' -f1 \
| LC_ALL=C sort | uniq -c | sort -nr | head

5xxer:

zgrep -h . /var/log/nginx/ssl-*.access.log* \
| awk -F'status="' '{split($2,a,"\""); if (a[1] ~ /^5[0-9][0-9]$/) print}' \
| awk -F'request="' '{print $2}' | cut -d'"' -f1 \
| awk '{print $2}' | cut -d'?' -f1 \
| LC_ALL=C sort | uniq -c | sort -nr | head

Warum es hilft. Dies gibt Ihnen eine Rangliste der Problem-Pfade. Wenn Sie die Top Fünf beheben, beheben Sie oft den Großteil der Probleme.

Zoomen Sie in ein kurzes Zeitfenster hinein

Wenn ein Anstieg zu einer bekannten Zeit auftritt, möchten Sie davor und danach sehen.

Einfach und schnell (gut genug für ein 10-Minuten-Fenster innerhalb derselben Stunde):

# Beispiel: 09/Aug/2025 23:15–23:25
zgrep -h 'time_local="' /var/log/nginx/ssl-*.access.log* \
| egrep '09/Aug/2025:23:1[5-9]|09/Aug/2025:23:2[0-5]'

Leiten Sie das Ergebnis in eine der obigen Zählungen weiter.

Warum es hilft. Sie vergleichen den Datenverkehr direkt vor und direkt nach einem Ereignis, was oft alles ist, was Sie brauchen, um zu sehen, was sich geändert hat.

Formular-Posts und große Körper

Große POSTs an ein Formular können WAF-Regeln auslösen. Messen Sie sie.

PATH_RE="/about/.*speaker-request-form"
zgrep -h . /var/log/nginx/ssl-*.access.log* \
| awk -F'request="' -v r="$PATH_RE" '
  { split($2,a,"\""); split(a[1],b," "); m=b[1]; u=b[2];
    if (m=="POST" && u ~ r) print }' \
| awk -F'request_length="' '{print $2}' | cut -d'"' -f1 \
| awk '{sum+=$1; c++} END{print "POST count="c, "avg_request_length=" (c?sum/c:0)}'

Warum es hilft. Wenn die durchschnittliche Anfragengröße hoch ist, blockiert Ihre WAF möglicherweise die Inspektion. Sie haben jetzt Beweise und Zahlen.

Zugriffsprotokolle mit WAF-Blocks verknüpfen

  1. Erfassen Sie die genaue Zeit und Regel aus Ihrem WAF-Ereignis.
  2. Filtern Sie die Zugriffsprotokolle für dieses Fenster mit dem "Zeitfenster"-Trick.
  3. Suchen Sie nach demselben Pfad, derselben IP oder einer großen request_length.
  4. Wenn die WAF-Regel die Körpergröße oder Inspektionsgrenzen erwähnt, bestätigen Sie dies mit der obigen POST-Analyse.

Dies schließt den Kreis. Sie können sagen, was passiert ist und warum es passiert ist.

Geschwindigkeitstipps, die wichtig sind

  • Früh filtern. Fügen Sie grep 'status="404"' hinzu, bevor Sie sortieren.
  • Verwenden Sie LC_ALL=C sort für schnelleres und stabileres Sortieren.
  • Lassen Sie Abfragezeichenfolgen fallen, um Seiten nach Pfaden zu gruppieren.
  • Zuerst stichprobenartig prüfen. Führen Sie head in einer Pipeline aus, um zu überprüfen, ob Sie das richtige Feld auswählen.
  • Dokumentieren Sie Ihr log_format im Repository. Ihr zukünftiges Ich wird es Ihnen danken.

Häufige Fallstricke

  • Zählen nach remote_addr, wenn Ihre Anwendung hinter einem Proxy sitzt. Verwenden Sie x_forwarded_for oder Ihr echtes Client-IP-Feld.
  • Annahme, dass alle Protokolldateien das gleiche Format verwenden. Überprüfen Sie Ihr nginx.conf log_format vor dem Parsen.
  • Vergessen, dass rotierte Protokolle (.gz-Dateien) zgrep und nicht grep benötigen.
  • Verwendung komplexer Regex-Muster, die bei Änderungen des Protokollformats fehlschlagen. Halten Sie es einfach.

Fazit

Protokolle beantworten reale Fragen schnell. Beginnen Sie mit einer klaren Frage, leiten Sie nur das weiter, was Sie brauchen, und zählen Sie. Verknüpfen Sie das, was Sie in Nginx sehen, mit dem, was Ihre WAF meldet. Sie werden von "etwas fühlte sich langsam an" zu "diese URL ist zehn Minuten lang 2.379 Mal von einer IP fehlgeschlagen, und hier ist die Lösung" übergehen.

Bleiben Sie auf dem Laufenden

Erhalten Sie die neuesten Beiträge und Einblicke in Ihren Posteingang.

Unsubscribe anytime. No spam, ever.