Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 12114|Antwort: 3

[Web] nginx schneidet automatisch Zugriffsprotokolle

[Link kopieren]
Veröffentlicht am 05.01.2015 20:53:57 | | |

Das Webzugriffsprotokoll (access_log) erfasst das Zugriffsverhalten aller externen Clients zum Webserver, einschließlich wichtiger Informationen wie Client-IP, Zugriffsdatum, zugriffene URL-Ressource, vom Server zurückgegebenen HTTP-Statuscode und so weiter.
Ein typisches Web-Access-Protokoll sieht so aus:


112.97.37.90 - - [14/Sep/2013:14:37:39 +0800] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Linux; U; Android 2.3.6; ZH-CN; Lenovo A326 Build/GRK39F) AppleWebKit/533.1 (KHTML, wie Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.1.259" -


Planung:

1. Um das Problem zu lösen:

Wenn die Website viele Besuche hat, gibt es viele Logdaten, und wenn alles in eine Logdatei geschrieben wird, wird die Datei immer größer. Die Geschwindigkeit großer Dateien verlangsamt sich, etwa hunderte Megabyte einer Datei. Beim Schreiben von Logs wirkt sich die Betriebsgeschwindigkeit aus. Außerdem, wenn ich die Zugriffsprotokolle anschauen möchte, ist eine Datei mit mehreren hundert Megabit langsam herunterzuladen und zu öffnen. Mit einem kostenlosen Drittanbieter-Loganalyse-Tool – Log Treasure – können Sie Logdateien von nginx, apache und iis hochladen, die bei der Analyse von Website-Sicherheitsaspekten helfen. Schließlich ist Spezialisierung professioneller. Log Bao hat außerdem eine Größenbegrenzung für hochgeladene Dateien, höchstens 50 m.


2. Nignx verfügt nicht über einen Mechanismus, um Dateien automatisch zu trennen und Logs zu speichern. Da nginx Dateien nicht automatisch für dich speichert. Deshalb musst du dein eigenes Skript schreiben, um es zu implementieren.


Die Shell-Skriptdatei nginx_log_division.sh folgenden Inhalten:


# /bin/bash

logs_path="/data/wwwlogs/"

#以前的日志文件.

log_name="xxx.log"   

pid_path="/usr/local/nginx/logs/nginx.pid"


mv ${logs_path}${log_name} ${logs_path}${log_name}_$(date --date="LETZTE WOCHE" +"%Y-%m-d").log


töten -USR1 'Cat ${pid_path}'


Das Prinzip des obigen Shell-Skripts ist, die vorherige Logdatei zunächst zu verschieben und umzubenennen, mit dem Zweck eines Backups.

Laut dem Namen des letzten Montags, wenn das Skript zum Zeitpunkt "2013-09-16" ausgeführt wird, lautet der generierte Dateiname "xxx.log_ 20130909.log".

Selbst wenn der mv-Befehl auf der Datei ausgeführt wurde, bevor kill -USR1 'cat ${{pid_path}' ausgeführt wirdDateiname geändert, schreibt nginx weiterhin Logdaten wie üblich in die neu benannte Datei "xxx.log_20130909". Der Grund dafür ist, dass der Kernel in Linux-Systemen nach Dateien anhand von Dateideskriptoren sucht.


---------------- Verständnis von Linux-Dateideskriptoren


Ein Dateideskriptor ist eine ganzzahlige Identifikator, die der Linux-Kernel für jede geöffnete Datei benennen.

Der Linux-Kernel erzeugt (oder pflegt) ein "DateibeschreibungstabelleDiese Dateibeschreibungstabelle zeichnet "die von diesem Prozess (identifiziert)" geöffnete Datei auf.

In dieser Umgebung ist nginx ein laufender Prozess, der bereits eine Logdatei geöffnet hat und die Datei in der Dateibeschreibungstabelle protokolliert.

Selbst wenn sich der Pfad der Logdatei geändert hat, kann er dennoch gefunden werden (er kann gemäß der Dateibeschreibungstabelle lokalisiert werden).

----------------------------------------------

Beim Ausführen des Befehls "kill -USR1 'cat ${pid_path}'" ist der gespeicherte Wert in der nginx.pid-Datei tatsächlich eine Zahl (du kannst sie öffnen und nachsehen, ich bin hier 894), und nginx schreibt die PID (Prozessnummer) seines Hauptprozesses in die nginx.pid-Datei, sodass du direkt über den cat-Befehl die Hauptprozessnummer erhalten und die angegebene Prozessnummer direkt bedienen kannst.


kill -USR1 'cat ${pid_path}' entspricht

kill –USR1 894 #指定发信号 (USR1) Signal, um diesen Vorgang zu nummerieren.


In Linux-Systemen kommuniziert Linux über Signale mit "laufenden Prozessen". In Linux-Systemen gibt es auch viele vordefinierte Signale, wie zum Beispiel SIGHUP. USR1 ist ein benutzerdefiniertes Signal. Es kann so verstanden werden, dass der Prozess selbst definiert, was zu tun ist, wenn er dieses Signal empfängt (das heißt, der Prozessautor entscheidet selbst, ob er dieses Signal empfängt oder gar nicht, und überlässt es ganz dem Entwickler zu entscheiden). In nginx schreibt es seinen eigenen Code, um die Behandlung zu übernehmen, wenn nginx die Logdatei wieder öffnet, wenn ich ein USR1-Signal empfange. Das spezifische Prinzip lautet wie folgt:

1. Der Hauptprozess von nginx empfängt das USR1-Signal und öffnet die Logdatei erneut (benannt nach dem Lognamen in der nginx-Konfigurationsdatei, der Wert ist, der vom access_log Element in der Konfigurationsdatei gesetzt wird, und wenn die Datei nicht existiert, wird automatisch eine neue Datei erstellt xxx.log


2. Dann den Besitzer der Logdatei in "Worker process" ändern, sodass der Worker-Prozess Lese- und Schreibrechte für die Logdatei erhält (Master und Worker laufen meist als verschiedene Benutzer, daher muss der Besitzer geändert werden).


3. Der nginx-Hauptprozess schließt die duplizierte Logdatei (also die Datei, die gerade 20130909.log mit dem mv-Befehl in xxx.log_ umbenannt wurde),und benachrichtigt den Worker-Prozess, die neu geöffnete Logdatei zu verwenden(xxx.log die gerade vom Hauptprozess geöffnete Datei). Die spezifische Implementierung ist detaillierter: Der Hauptprozess sendet das USR1-Signal an den Worker, und nach Erhalt dieses Signals öffnet der Worker die Logdatei erneut (also die xxx.log in der Konfigurationsdatei vereinbart)



=================================== Skripte in regelmäßigen Abständen ausführen


Stelle die Shell-Skriptdatei oben so ein, dass sie zur geplanten Aufgabe hinzugefügt wird. Crontab ist ein geplanter Aufgabenprozess unter Linux. Dieser Prozess beginnt, sobald du ihn einschaltest, und es geht ab und zu in seine Liste, um zu sehen, ob Aufgaben erledigt werden müssen.


Crontab -e


* 04 * * 1 /data/wwwlogs/nginx_log_division.sh



Eine Datei wird mit dem oben genannten Code geöffnet

Das Format lautet "Shell file path to be executed". * kann als "jeder", jede Minute, jede Stunde, jeden Monat usw. verstanden werden.

Ich habe ein Skript eingerichtet, das nginx_log_division.sh am Montag um 4 Uhr morgens ausführt, und der Inhalt des Skripts ist, eine neue Logdatei neu zu generieren.



Angehängt:AufstellennginxWie Logs konfiguriert werden


log_format Seite '$remote_addr - $remote_user [$time_local] "$request" '

             '$status $body_bytes_sent "$http_referer" '

             '"$http_user_agent" $http_x_forwarded_for';


access_log /data/wwwlogs/xxxx.com.log Seite /data/wwwlogs/

#第二个参数表示使用那个日志格式 wird für jedes Log-Format ein Name identifiziert, und der Standort entspricht dem Namen im log_format



Das oben Genannte beinhaltet die Verwendung des Crontab Scheduled Task Managers.



Es gibt auch Stellen, an denen kein vollständiges Verständnis und Fehler vorliegen. Ich hoffe, in Zukunft ein Update zu erhalten.






Vorhergehend:2014 Houpu Javaoop Abschlussprüfungsfragen
Nächster:vi/vim Grundlegende Nutzungsmethoden
Veröffentlicht am 06.01.2015 00:04:30 |
Oh, kann man mit der Antwort Geld verdienen?
 Vermieter| Veröffentlicht am 06.01.2015 00:06:16 |
Johnyoung veröffentlicht am 01.1.2015 00:04
Oh, kann man mit der Antwort Geld verdienen?

Es kann Prestige haben
Veröffentlicht am 06.01.2015 00:13:44 |

Wofür ist Prestige da?
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com