Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 12114|Antwoord: 3

[Web] nginx knipt automatisch toegangslogboeken

[Link kopiëren]
Geplaatst op 05-01-2015 20:53:57 | | |

Het webtoegangslogboek (access_log) registreert het toegangsgedrag van alle externe clients tot de webserver, inclusief belangrijke informatie zoals het client-IP, toegangsdatum, geraadpleegde URL-bron, HTTP-statuscode die door de server wordt teruggegeven, enzovoort.
Een typisch webtoegangslogboek ziet er als volgt uit:


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, zoals Gecko) Versie/4.0 Mobile Safari/533.1 MicroMessenger/4.5.1.259" -


Planning:

1. Het probleem oplossen:

Wanneer de website veel bezoeken heeft, zal er veel logdata zijn, en als alles in een logbestand wordt geschreven, wordt het bestand steeds groter. De snelheid van grote bestanden zal vertragen, zoals honderden megabytes van een bestand. Bij het schrijven van logs beïnvloedt dit de werksnelheid. Ook, als ik de toegangslogs wil bekijken, is een bestand van enkele honderden megabits traag om te downloaden en te openen. Met een gratis loganalysetool van derden - Log Treasure - kunt u logbestanden uploaden van nginx, apache en iis, die helpen bij het analyseren van websitebeveiligingsaspecten. Specialiseren is immers professioneler. Log Bao heeft ook een limiet op de grootte van geüploade bestanden, niet meer dan 50 meter.


2. Nignx heeft geen mechanisme om bestanden automatisch te scheiden en logs op te slaan. Omdat nginx bestanden niet automatisch voor je opslaat. Daarom moet je je eigen script schrijven om het te implementeren.


Het shell-scriptbestand nginx_log_division.sh de volgende inhoud:


# /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="VORIGE WEEK" +"%Y-%m-d").log


kill -USR1 'cat ${pid_path}'


Het principe van het bovenstaande shell-script is om eerst het vorige logbestand te verplaatsen en te hernoemen naar één, met als doel een back-up.

Volgens de naam van de afgelopen maandag, wanneer het script wordt uitgevoerd op het tijdstip "2013-09-16", is de gegenereerde bestandsnaam "xxx.log_ 20130909.log".

Zelfs als het mv-commando op het bestand is uitgevoerd vóór kill -USR1 'cat ${{pid_path}' wordt uitgevoerdGewijzigde bestandsnaam, nginx zal nog steeds loggegevens schrijven naar het nieuw benoemde bestand "xxx.log_20130909" zoals gewoonlijk. De reden is dat de kernel in Linux-systemen zoekt naar bestanden op basis van bestandsbeschrijvingen.


---------------- begrip van Linux-bestandsdescriptors


Een bestandsdescriptor is een gehele getal-identificatie die de Linux-kernel voor elk geopend bestand benoemt.

De Linux-kernel genereert (of onderhoudt) een "BestandsdescriptortabelDeze bestandsbeschrijvingstabel registreert "het bestand dat door dit proces is geopend (geïdentificeerd)".

In deze omgeving is nginx een lopend proces dat al een logbestand heeft geopend en het bestand registreert in de bestandsdescriptor-tabel.

Zelfs als het pad van het logbestand is veranderd, kan het nog steeds worden gevonden (het kan worden gelokaliseerd volgens de bestandsdescriptor-tabel).

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

Bij het uitvoeren van het commando "kill -USR1 'cat ${pid_path}'", is het opgeslagen bestand in het nginx.pid-bestand eigenlijk een nummer (je kunt het openen en bekijken, ik ben hier 894), en nginx schrijft het pid (procesnummer) van zijn hoofdproces naar het nginx.pid-bestand, zodat je direct het hoofdprocesnummer via het cat-commando kunt krijgen en het opgegeven procesnummer direct kunt bedienen.


kill -USR1 'cat ${pid_path}' is gelijk aan

doe – USR1 894 #指定发信号 (USR1) signaal om dit proces te nummeren.


In Linux-systemen communiceert Linux met "lopende processen" via signalen. In Linux-systemen zijn er ook veel vooraf gedefinieerde signalen, zoals SIGHUP. USR1 is een door de gebruiker gedefinieerd signaal. Het kan worden opgevat als het proces zelf dat bepaalt wat er moet gebeuren wanneer het dit signaal ontvangt (dat wil zeggen, de processchrijver zelf beslist of hij dit signaal ontvangt of niets doet, en laat het volledig aan de ontwikkelaar over om te beslissen). In nginx schrijft het zijn eigen code om de afhandeling te regelen waarbij nginx het logbestand opnieuw opent wanneer ik een USR1-signaal ontvang. Het specifieke principe is als volgt:

1. Het hoofdproces van nginx ontvangt het USR1-signaal en opent het logbestand opnieuw (genoemd naar de lognaam in het nginx-configuratiebestand, de waarde die door het access_log item in het configuratiebestand wordt ingesteld, en als het bestand niet bestaat, wordt er automatisch een nieuw bestand xxx.log aangemaakt).


2. Verander vervolgens de eigenaar van het logbestand naar "worker process", zodat het worker-proces lees- en schrijfrechten heeft voor het logbestand (master en worker draaien meestal als verschillende gebruikers, dus de eigenaar moet worden gewijzigd).


3. Het hoofdproces nginx sluit het duplicaat logbestand (dat wil zeggen, het bestand dat net is hernoemd naar xxx.log_ 20130909.log met het mv-commando),en geeft het werkproces de melding om het nieuw geopende logbestand te gebruiken(xxx.log het net geopende bestand dat door het hoofdproces is geopend). De specifieke implementatie is gedetailleerder: het hoofdproces stuurt het USR1-signaal naar de worker, en na ontvangst van dit signaal opent de worker het logbestand opnieuw (dat wil zeggen, de xxx.log afgesproken in het configuratiebestand)



=================================== Voer scripts uit op regelmatige intervallen


Stel het bovenstaande shell-scriptbestand in om aan de geplande taak toe te voegen. crontab is een gepland taakproces onder Linux. Dit proces begint zodra je het aanzet, en het gaat af en toe naar zijn lijst om te zien of er taken zijn die uitgevoerd moeten worden.


crontab -e


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



Er wordt een bestand geopend met bovenstaande code toegevoegd

Het formaat is "Shell-bestandspad te uitvoeren". * kan worden begrepen als "elke", elke minuut, elk uur, elke maand, enzovoort.

Ik heb een script ingesteld om nginx_log_division.sh om 4 uur 's ochtends op maandag uit te voeren, en de inhoud van het script is om een nieuw logbestand te regenereren.



Bijgevoegd:OprichtennginxHoe logs worden geconfigureerd


log_format site '$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 site

#第二个参数表示使用那个日志格式 wordt voor elk logformaat een naam geïdentificeerd, en de site komt overeen met de naam in de log_format



Bovenstaande betreft het gebruik van de geplande taken van Crontab.



Er zijn ook plekken waar geen volledig begrip is en fouten. Hopelijk kan ik in de toekomst een update geven.






Vorig:2014 Houpu javaoop eindexamenvragen
Volgend:VI/VIM Basis gebruiksmethoden
Geplaatst op 06-01-2015 00:04:30 |
Oh, kan antwoord geld opleveren?
 Huisbaas| Geplaatst op 06-01-2015 00:06:16 |
Johnyoung geplaatst op 2015-1-6 00:04
Oh, kan antwoord geld opleveren?

Het kan prestige hebben
Geplaatst op 06-01-2015 00:13:44 |
admin Geplaatst op 6-1-2015 00:06
Het kan prestige hebben

Waar is prestige voor?
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com