So fügen Sie das Protokollmodul zu Nginx unter Ubuntu 16.04 hinzu

Einführung

Bei der Serveradministration geht es nicht nur um die Erstkonfiguration von Diensten. Dazu gehört auch, diese Dienste zu überwachen und sicherzustellen, dass sie so reibungslos wie möglich funktionieren. Eine der wichtigsten Wissensquellen für Administratoren sind Protokolldateien, die Informationen zu Systemereignissen enthalten.

Bei einem Webserver wie Nginx enthalten Protokolle wertvolle Informationen zu jedem Versuch, über den Webserver auf Ressourcen zuzugreifen. Jeder Besucher der Website und jedes heruntergeladene Bild oder jede heruntergeladene Datei wird sorgfältig in den Protokollen registriert. Wenn Fehler auftreten, werden diese auch in den Protokollen gespeichert. Es ist viel einfacher, mit gut strukturierten Protokolldateien zu arbeiten.

In diesem Handbuch wird die Verwendung des Protokollierungsmoduls von Nginx erläutert. Wir richten separate Protokolldateien für verschiedene Serverblöcke ein und passen dann die Protokollausgabe an. Darüber hinaus werden dem Zugriffsprotokoll zusätzliche Informationen zu Anforderungen (im Beispiel dieses Lernprogramms die Zeit, die zum Bereitstellen einer Anforderung benötigt wird) hinzugefügt, die über die Standardeinstellungen von Nginx hinausgehen.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

Schritt 1 - Testdateien erstellen

In diesem Schritt erstellen wir mehrere Testdateien im Standardverzeichnis der Nginx-Website. Wir werden diese verwenden, um unsere Protokollierungskonfiguration zu testen.

Wenn Nginx (oder ein anderer Webserver) eine HTTP-Anforderung für eine Datei empfängt, wird diese Datei geöffnet und dem Benutzer zur Verfügung gestellt, indem der Inhalt über das Netzwerk übertragen wird. Je kleiner die Datei, desto schneller kann sie übertragen werden. Wenn die Datei vollständig übertragen wurde, wird die Anforderung als vollständig betrachtet und erst dann wird die Übertragung protokolliert.

Später in diesem Lernprogramm werden wir die Protokollierungskonfiguration ändern, um nützliche Informationen darüber zu erhalten, wie viel Zeit jede Anforderung in Anspruch genommen hat. Der einfachste Weg, um die geänderte Konfiguration zu testen und den Unterschied zwischen verschiedenen Anforderungen festzustellen, besteht darin, mehrere Testdateien unterschiedlicher Größe zu erstellen, die in unterschiedlicher Zeit übertragen werden.

Erstellen Sie eine 1-Megabyte-Datei mit dem Namen "+ 1mb.test " im Standardverzeichnis von Nginx, indem Sie " truncate +" verwenden.

sudo truncate -s 1M /var/www/html/1mb.test

In ähnlicher Weise erstellen wir zwei weitere Dateien unterschiedlicher Größe, zuerst 10 und dann 100 Megabyte, und benennen sie entsprechend.

sudo truncate -s 10M /var/www/html/10mb.test
sudo truncate -s 100M /var/www/html/100mb.test

Zu guter Letzt erstellen wir auch eine leere Datei:

sudo touch /var/www/html/empty.test

Wir werden diese Dateien im nächsten Schritt verwenden, um die Protokolldatei mit der Standardkonfiguration zu füllen, und später im Lernprogramm, um die angepasste Konfiguration zu demonstrieren.

Schritt 2 - Grundlegendes zur Standardkonfiguration

Das Protokollmodul ist ein zentrales Nginx-Modul, das heißt, es muss nicht separat installiert werden, um verwendet zu werden. Die Standardkonfiguration ist jedoch ein absolutes Minimum. In diesem Schritt sehen wir, wie die Standardkonfiguration funktioniert.

Bei einer Neuinstallation protokolliert Nginx alle Anforderungen in zwei separaten Dateien: dem Zugriffsprotokoll und dem Fehlerprotokoll. Das Fehlerprotokoll in "+ / var / log / nginx / error.log +" speichert Informationen zu ungewöhnlichen Serverfehlern oder Fehlern bei der Verarbeitung der Anforderung.

Das Zugriffsprotokoll in "+ / var / log / nginx / access.log +" wird häufiger verwendet. Hier werden Informationen zu allen Anfragen an Nginx gespeichert. In diesem Protokoll sehen Sie unter anderem, auf welche Dateien Benutzer zugreifen, welche Webbrowser sie verwenden, welche IP-Adressen sie haben und mit welchem ​​HTTP-Statuscode Nginx auf jede Anfrage geantwortet hat.

Lassen Sie uns sehen, wie eine Beispielzeile der Zugriffsprotokolldatei aussieht. Fordern Sie zunächst die in Schritt 1 erstellte leere Datei bei Nginx an, damit die Protokolldatei nicht leer ist.

curl -i http://localhost/empty.test

Als Antwort sollten mehrere HTTP-Antwortheader angezeigt werden:

Nginx-Antwortheader

HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Thu, 30 Jun 2016 18:10:15 GMT
Content-Type: application/octet-stream
Content-Length: 0
Last-Modified: Thu, 30 Jun 2016 18:10:07 GMT
Connection: keep-alive
ETag: "5775607f-0"
Accept-Ranges: bytes

Aus dieser Antwort können Sie mehrere Dinge lernen:

  • "+ HTTP / 1.1 200 OK +" gibt an, dass Nginx mit dem Statuscode "+200 OK +" geantwortet hat und uns mitteilt, dass kein Fehler aufgetreten ist.

  • + Content-Length: 0 + bedeutet, dass das zurückgegebene Dokument die Länge Null hat.

  • Die Anfrage wurde am + The, 30. Juni 2016 18:10:15 GMT bearbeitet.

Sehen wir uns an, ob dies mit dem übereinstimmt, was Nginx in seinem Zugriffsprotokoll gespeichert hat. Die Protokolldateien können nur von Administratoren gelesen werden, daher muss "+ sudo +" verwendet werden, um darauf zuzugreifen.

sudo tail /var/log/nginx/access.log

Das Protokoll enthält eine Zeile wie diese, die der zuvor ausgegebenen Testanforderung entspricht.

Zugriffsprotokolleintrag

127.0.0.1 - - [30/Jun/2016:14:10:15 -0400] "GET /empty.test HTTP/1.1" 200 0 "-" "curl/7.47.0"

Nginx verwendet das Combined Log Format, ein standardisiertes Format für Zugriffsprotokolle, das von Webservern häufig für die Interoperabilität verwendet wird. In diesem Format wird jede Information durch ein einzelnes Leerzeichen begrenzt. Bindestriche stehen für fehlende Informationen.

Von links nach rechts sind die Kategorien:

  • Die * IP-Adresse des Benutzers *, der die Ressource angefordert hat. Da Sie "+ curl " lokal verwendet haben, zeigt die Adresse auf den lokalen Host " 127.0.0.1 +".

  • * Remote-Protokollierung * Informationen. Dies ist hier immer ein Bindestrich, da Nginx diese Informationen nicht unterstützt.

  • Der * Benutzername eines angemeldeten Benutzers * gemäß HTTP Basic Authentication. Dies ist für alle anonymen Anfragen leer.

  • Das * Anfragedatum *. Sie können sehen, dass dieses Datum mit dem Datum in unseren Antwortköpfen übereinstimmt.

  • Der * Anforderungspfad *, der die Anforderungsmethode (+ GET +), den Pfad zur angeforderten Datei (+ / empty.text +) sowie das verwendete Protokoll (+ HTTP / 1.1 +) enthält.

  • Der * Antwortstatuscode *, der "+200 OK +" lautete, bedeutet Erfolg.

  • Die * Länge der übertragenen Datei *, die hier + 0 + ist, weil die Datei leer war.

  • Der * HTTP-Referer-Header *, der die Adresse des Dokuments enthält, aus dem die Anforderung stammt. In diesem Beispiel ist es leer. Wenn es sich jedoch um eine Bilddatei handelt, verweist der Verweis auf die Seite, auf der das Bild verwendet wurde. + Der HTTP-Referer-Header ist ein Rechtschreibfehler des Wortes "Referer", der auf die Ursprünge von HTTP zurückgeht und Teil des HTTP-Standards ist.

  • Der * User Agent *, der hier "+ curl +" ist.

Selbst ein einzelner Protokolleintrag im Zugriffsprotokoll enthält viele wertvolle Informationen zu einer Anforderung. Es fehlt jedoch eine wichtige Information. Während wir den genauen Speicherort von "+ http: // localhost / empty.test " angefordert haben, befindet sich nur der Pfad zur " / empty.test " - Datei im Protokolleintrag. Informationen über den Hostnamen (hier das ` localhost +`) gehen verloren.

Schritt 3 - Konfigurieren eines separaten Zugriffsprotokolls

Als Nächstes überschreiben wir die Standardprotokollierungskonfiguration (in der Nginx eine Zugriffsprotokolldatei für alle Anforderungen speichert) und veranlassen, dass Nginx stattdessen eine separate Protokolldatei für den Standardserverblock speichert, der mit der sauberen Nginx-Installation geliefert wird. Informationen zu Nginx-Serverblöcken finden Sie unter https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04 [So richten Sie Nginx-Serverblöcke (virtuelle Hosts) unter Ubuntu 16.04 ein] Tutorial.

Es wird empfohlen, für jeden Serverblock separate Protokolldateien zu speichern, um die Protokolle von verschiedenen Websites effektiv voneinander zu trennen. Dies verkleinert nicht nur die Protokolldateien, sondern erleichtert auch die Analyse von Protokollen, um Fehler und verdächtige Aktivitäten zu erkennen.

Um die standardmäßige Nginx-Serverblockkonfiguration zu ändern, öffnen Sie die Nginx-Serverblockkonfigurationsdatei in "+ nano +" oder Ihrem bevorzugten Texteditor.

sudo nano /etc/nginx/sites-available/default

Suchen Sie den Konfigurationsblock "+ server +", der folgendermaßen aussieht:

/ etc / nginx / sites-available / default

. . .
# Default server configuration
#

server {
   listen 80 default_server;
   listen [::]:80 default_server;

. . .

und füge die zwei rot markierten Zeilen zur Konfiguration hinzu:

/ etc / nginx / sites-available / default

. . .
# Default server configuration
#

server {
   listen 80 default_server;
   listen [::]:80 default_server;



. . .

Die Direktive "+ access_log " legt den Pfad zu der Datei fest, in der die Zugriffsprotokolle gespeichert werden, und " error_log " macht dasselbe für das Fehlerprotokoll. Wir verwenden dasselbe Verzeichnis wie die Standard-Nginx-Protokolle (` / var / log / nginx +`), jedoch mit unterschiedlichen Dateinamen. Wenn Sie mehrere Serverblöcke haben, ist es eine gute Idee, Protokolldateien auf konsistente und aussagekräftige Weise zu benennen, z. B. indem Sie den Domänennamen im Dateinamen verwenden.

Speichern und schließen Sie die Datei, um sie zu beenden.

Starten Sie Nginx neu, um die neue Konfiguration zu aktivieren.

sudo systemctl restart nginx

Führen Sie zum Testen der neuen Konfiguration dieselbe Anforderung für unsere leere Testdatei wie zuvor aus.

curl -i http://localhost/empty.test

Überprüfen Sie, ob die Protokollzeile, die mit der zuvor angezeigten identisch ist, in die separate Datei geschrieben wurde, die wir gerade konfiguriert haben.

sudo tail /var/log/nginx/default-access.log

Im nächsten Schritt passen wir das Format der Protokolle in dieser neuen Datei an und fügen zusätzliche Informationen hinzu.

Schritt 4 - Konfigurieren eines benutzerdefinierten Protokollformats

Hier richten wir ein benutzerdefiniertes Protokollierungsformat ein, damit Nginx zusätzliche Informationen protokolliert (wie lange die Verarbeitung der Anforderung gedauert hat), und konfigurieren den Standardserverblock für die Verwendung dieses neuen Formats.

Wir müssen das neue Protokollformat definieren, bevor es verwendet werden kann. In Nginx hat jedes Protokollformat einen eindeutigen Namen, der für den gesamten Server global ist. Einzelne Serverblöcke können so konfiguriert werden, dass sie diese Formate später verwenden, indem Sie einfach auf ihre Namen verweisen.

Um das neue Protokollierungsformat zu definieren, erstellen Sie eine neue Konfigurationsdatei mit dem Namen "+ timed-log-format.conf +" im zusätzlichen Konfigurationsverzeichnis von Nginx.

sudo nano /etc/nginx/conf.d/timed-log-format.conf

Fügen Sie den folgenden Inhalt hinzu:

/etc/nginx/conf.d/timed-log-format.conf

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

Speichern und schließen Sie die Datei, um sie zu beenden.

Die Anweisung + log_format + definiert das neue Protokollformat. Das nächste Element ist die eindeutige Kennung dieses Formats. hier verwenden wir * timed *, aber Sie können einen beliebigen Namen wählen.

Als nächstes folgt das Protokollformat selbst, das zur besseren Lesbarkeit in drei Zeilen unterteilt ist. Nginx macht die Informationen zu allen Anforderungen in benannten Systemvariablen verfügbar, denen das Dollarzeichen vorangestellt ist. Diese werden durch die tatsächlichen Informationen zu der Anfrage ersetzt, während die Anfragedetails in das Zugriffsprotokoll geschrieben werden (z. B. wird "+ $ request_addr +" durch die IP-Adresse des Besuchers ersetzt).

Das obige Format ist identisch mit dem oben erläuterten Common Log Format, mit dem Unterschied, dass ganz am Ende die Systemvariable "+ $ request_time +" hinzugefügt wird. Nginx verwendet diese Variable, um zu speichern, wie lange die Anforderung in Millisekunden gedauert hat. Wenn wir diese Variable in unserem Protokollformat verwenden, weisen wir Nginx an, diese Informationen in die Protokolldatei zu schreiben.

Jetzt haben wir ein benutzerdefiniertes Protokollformat mit dem Namen * timed * in der Nginx-Konfiguration definiert, aber der Standard-Serverblock verwendet dieses Format noch nicht. Öffnen Sie als Nächstes die Nginx-Konfigurationsdatei für den Serverblock.

sudo nano /etc/nginx/sites-available/default

Suchen Sie den Konfigurationsblock "+ server ", den wir zuvor geändert haben, und fügen Sie den Namen " timed " für das Protokollformat zur Einstellung " access_log +" hinzu, wie unten rot hervorgehoben:

/ etc / nginx / sites-available / default

. . .
# Default server configuration
#

server {
   listen 80 default_server;
   listen [::]:80 default_server;

   access_log /var/log/nginx/default-access.log ;
   error_log /var/log/nginx/default-error.log;
. . .

Speichern und schließen Sie die Datei, um sie zu beenden.

Starten Sie Nginx neu, um die neue Konfiguration zu aktivieren.

sudo systemctl restart nginx

Nachdem alles eingerichtet ist, überprüfen wir, ob es funktioniert.

Schritt 5 - Überprüfen der neuen Konfiguration

Wir können die neue Konfiguration testen, indem wir einige Anfragen an Nginx mit "+ curl +" aufrufen, wie wir es in Schritt 2 getan haben. Dieses Mal werden wir die in Schritt 1 erstellten Beispieldateien verwenden:

curl -i http://localhost/empty.test
curl -i http://localhost/1mb.test
curl -i http://localhost/10mb.test
curl -i http://localhost/100mb.test

Sie werden feststellen, dass die Ausführung jedes nachfolgenden Befehls länger dauert, da die Dateien größer werden und die Übertragung länger dauert.

Lassen Sie uns das Zugriffsprotokoll anzeigen, nachdem Sie diese Anforderungen ausgeführt haben.

sudo tail /var/log/nginx/default-access.log

Das Protokoll enthält jetzt mehr Zeilen, aber die letzten vier entsprechen den Testanforderungen, die Sie gerade ausgeführt haben.

Zugriff auf Protokolleinträge

127.0.0.1 - - [04/Jul/2016:14:57:02 -0400] "GET /empty.test HTTP/1.1" 200 0 "-" "curl/7.47.0"
127.0.0.1 - - [04/Jul/2016:14:57:51 -0400] "GET /1mb.test HTTP/1.1" 200 1048576 "-" "curl/7.47.0"
127.0.0.1 - - [04/Jul/2016:14:57:57 -0400] "GET /10mb.test HTTP/1.1" 200 10485760 "-" "curl/7.47.0"
127.0.0.1 - - [04/Jul/2016:14:58:52 -0400] "GET /100mb.test HTTP/1.1" 200 104857600 "-" "curl/7.47.0"

Sie werden feststellen, dass sich die Pfade jedes Mal unterscheiden und den richtigen Dateinamen anzeigen. Die Anforderungsgröße nimmt jedes Mal zu. Der wichtige Teil ist die zuletzt hervorgehobene Zahl. Hierbei handelt es sich um die Verarbeitungszeit für Anforderungen in Millisekunden, die wir gerade in unserem benutzerdefinierten Protokollformat konfiguriert haben. Wie zu erwarten ist, dauert die Übertragung umso länger, je größer die Datei wird.

In diesem Fall haben Sie das benutzerdefinierte Protokollformat in Nginx erfolgreich konfiguriert!

Fazit

Obwohl es nicht besonders nützlich ist, festzustellen, dass die Übertragung größerer Dateien länger dauert, kann die Verarbeitungszeit für Anforderungen sehr nützlich sein, wenn Nginx für die Bereitstellung dynamischer Websites verwendet wird. Es kann verwendet werden, um Engpässe auf der Website zu verfolgen und Anfragen zu finden, die länger als nötig gedauert haben.

+ $ request_time + ist nur eine von vielen Systemvariablen, die Nginx in benutzerdefinierten Protokollierungskonfigurationen verwendet. Andere umfassen beispielsweise den Wert von Antwort-Headern, die mit der Antwort an den Client gesendet werden. Das Hinzufügen anderer Variablen zum Protokollformat ist so einfach wie das Einfügen in die Protokollformatzeichenfolge, genau wie bei + $ request_time +. Es ist ein leistungsstarkes Tool, mit dem Sie die Protokollierung für Ihre Websites zu Ihrem Vorteil konfigurieren können.

Die Liste der Variablen, die mit Nginx-Protokollformaten verwendet werden können, finden Sie unter Nginxs Protokollmoduldokumentation.