Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 12114|Svar: 3

[Web] nginx tar automatiskt bort åtkomstloggar

[Kopiera länk]
Publicerad på 2015-01-05 20:53:57 | | |

Webbåtkomstloggen (access_log) registrerar åtkomstbeteendet för alla externa klienter till webbservern, inklusive viktig information som klientens IP, åtkomstdatum, URL-resurs som åtkoms, HTTP-statuskod som returneras av servern och så vidare.
En typisk webbåtkomstlogg ser ut så här:


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


Planering:

1. För att lösa problemet:

När webbplatsen har många besök kommer det att finnas mycket loggdata, och om allt skrivs in i en loggfil blir filen större och större. Hastigheten på stora filer kommer att sakta ner, till exempel hundratals megabyte av en fil. När man skriver loggar påverkar det drifthastigheten. Dessutom, om jag vill titta på åtkomstloggarna, är en fil på flera hundra megabit långsam att ladda ner och öppna. Med ett tredjeparts gratis logganalysverktyg – Log Treasure – kan du ladda upp loggfiler från nginx, apache och iis, som hjälper till att analysera webbplatsens säkerhetsaspekter. Specialisering är ju trots allt mer professionellt. Log Bao har också en storleksgräns för uppladdade filer, högst 50 m.


2. Nignx har ingen mekanism för att automatiskt separera filer och lagra loggar. Eftersom nginx inte automatiskt sparar filer åt dig. Därför behöver du skriva ditt eget skript för att implementera det.


Shell-skriptfilen nginx_log_division.sh följande innehåll:


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


döda -USR1 'katt ${pid_path}'


Principen för ovanstående shell-skript är att först flytta och byta namn på den tidigare loggfilen till ett, syftet är att säkerhetskopiera.

Enligt namnet på den senaste måndagen, när skriptet körs vid tidpunkten "2013-09-16", är det genererade filnamnet "xxx.log_ 20130909.log".

Även om mv-kommandot har körts på filen innan kill -USR1 'cat ${{pid_path}' körsÄndrat filnamn, kommer nginx fortfarande att skriva loggdata till den nynamngivna filen "xxx.log_20130909" som vanligt. Anledningen är att i Linux-system söker kärnan efter filer baserat på filbeskrivningar.


---------------- förståelse av Linux-filbeskrivningar


En filbeskrivare är en heltalsidentifierare som Linux-kärnan namnger för varje öppen fil.

Linux-kärnan genererar (eller underhåller) en "FilbeskrivningstabellDenna filbeskrivningstabell registrerar "filen som öppnats av denna process (identifierad)".

I denna miljö är nginx en pågående process som redan har öppnat en loggfil och loggar filen i filbeskrivningstabellen.

Även om vägen för loggfilen har ändrats kan den fortfarande hittas (den kan lokaliseras enligt filbeskrivningstabellen).

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

När du kör kommandot "kill -USR1 'cat ${pid_path}'" är det sparade i nginx.pid-filen faktiskt ett nummer (du kan öppna det och titta, jag är 894 här), och nginx skriver pid (processnummer) för sin huvudprocess till nginx.pid-filen, så du kan direkt få dess huvudprocessnummer via cat-kommandot och direkt använda det angivna processnumret.


döda -USR1 'cat ${pid_path}' motsvarar

döda –USR1 894 #指定发信号 (USR1) signalen för att numrera denna process.


I Linux-system kommunicerar Linux med "löpande processer" via signaler. I Linux-system finns det också många fördefinierade signaler, såsom SIGHUP. USR1 är en användardefinierad signal. Det kan förstås som att processen själv definierar vad som ska göras när den tar emot denna signal (det vill säga, processförfattaren själv bestämmer om signalen ska tas emot eller inget, och lämnar det helt till utvecklaren att avgöra). I nginx skriver den sin egen kod för att hantera hanteringen av att nginx öppnar loggfilen igen när jag tar emot en USR1-signal. Den specifika principen är följande:

1. Huvudprocessen nginx tar emot USR1-signalen och öppnar loggfilen igen (namngiven efter loggnamnet i nginx-konfigurationsfilen, vilket är värdet som sätts av access_log punkt i konfigurationsfilen, och om filen inte finns kommer en ny fil xxx.log automatiskt att skapas).


2. Byt sedan ägaren till loggfilen till "worker process", så att worker-processen har läs- och skrivbehörigheter till loggfilen (master och worker körs vanligtvis som olika användare, så ägaren måste ändras).


3. nginx huvudprocess stänger den dubbla loggfilen (det vill säga filen som just nu bytte namn till xxx.log_ 20130909.log med mv-kommandot),och meddelar arbetsprocessen att använda den nyöppnade loggfilen(xxx.log filen som just öppnades av huvudprocessen). Den specifika implementationen är mer detaljerad, huvudprocessen skickar USR1-signalen till arbetaren, och efter att ha mottagit denna signal öppnar arbetaren loggfilen igen (det vill säga den xxx.log överenskommen i konfigurationsfilen)



=================================== Kör skript med regelbundna intervaller


Ställ in shell-skriptfilen ovan att läggas till i den schemalagda uppgiften. crontab är en schemalagd uppgiftsprocess under Linux. Denna process startar när du slår på den, och den går då och då till sin lista för att se om det finns några uppgifter som behöver utföras.


Crontab -e


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



En fil öppnas med koden ovanstående tillagd

Formatet är "Shell file path to be executed". * kan förstås som "varje", varje minut, varje timme, varje månad, osv.

Jag satte upp ett skript för att köra nginx_log_division.sh klockan 4 på måndagen, och innehållet i skriptet är att återskapa en ny loggfil.



Bifogat:FörberedanginxHur loggar konfigureras


log_format sidan '$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 webbplats

#第二个参数表示使用那个日志格式 identifieras ett namn för varje loggformat, och platsen motsvarar namnet i log_format



Ovanstående innebär användning av Crontab Scheduled Task Manager.



Det finns också platser där det inte finns fullständig förståelse och misstag. Hoppas kunna uppdatera i framtiden.






Föregående:2014 års Houpu Javaoop slutprovsfrågor
Nästa:VI/VIM:s grundläggande användningsmetoder
Publicerad på 2015-01-06 00:04:30 |
Åh, kan svar tjäna pengar?
 Hyresvärd| Publicerad på 2015-01-06 00:06:16 |
Johnyoung publicerade den 2015-1-6 00:04
Åh, kan svar tjäna pengar?

Det kan ha prestige
Publicerad på 2015-01-06 00:13:44 |

Vad är prestige till för?
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com