|
Žiniatinklio prieigos žurnalas (access_log) įrašo visų išorinių klientų prieigos prie žiniatinklio serverio veikimą, įskaitant svarbią informaciją, pvz., kliento IP, prieigos datą, prieigos URL išteklius, serverio grąžintą HTTP būsenos kodą ir pan. Įprastas žiniatinklio prieigos žurnalas atrodo taip: 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, kaip Gecko) Versija / 4.0 Mobile Safari / 533.1 MicroMessenger / 4.5.1.259" -
Planavimas: 1. Norėdami išspręsti problemą: Kai svetainėje apsilankymų bus daug, bus daug žurnalo duomenų, o jei visa tai bus įrašyta į žurnalo failą, failas taps vis didesnis. Didelių failų, pvz., šimtų megabaitų failo, greitis sulėtės. Rašant žurnalus, tai turi įtakos veikimo greičiui. Be to, jei noriu pažvelgti į prieigos žurnalus, kelių šimtų megabitų failas lėtai atsisiunčiamas ir atidaromas. Naudodami trečiosios šalies nemokamą žurnalų analizės įrankį "Log Treasure", galite įkelti žurnalo failus iš nginx, apache ir iis, kurie padeda analizuoti svetainės saugumo aspektus. Juk specializacija yra profesionalesnė. "Log Bao" taip pat turi įkeltų failų dydžio apribojimą, ne daugiau kaip 50 m.
2. Nignx neturi mechanizmo, kuris automatiškai atskirtų failus ir saugotų žurnalus. Kadangi nginx automatiškai neišsaugo failų. Todėl, norėdami jį įgyvendinti, turite parašyti savo scenarijų.
Apvalkalo scenarijaus failą nginx_log_division.sh toks turinys:
# /bin/bash logs_path="/duomenys/wwwlogs/" #以前的日志文件. log_name="xxx.log" pid_path="/usr/local/nginx/logs/nginx.pid"
mv ${logs_path}${log_name} ${logs_path}${log_name}_$(date --date="PASKUTINĖ SAVAITĖ" +"%Y-%m-d").log
kill -USR1 'katė ${pid_path}'
Aukščiau pateikto apvalkalo scenarijaus principas yra pirmiausia perkelti ir pervardyti ankstesnį žurnalo failą į vieną, tikslas yra sukurti atsarginę kopiją. Pagal paskutinio pirmadienio pavadinimą, kai scenarijus paleidžiamas "2013-09-16" laiku, sugeneruotas failo pavadinimas yra "xxx.log_ 20130909.log". Net jei mv komanda buvo įvykdyta faile prieš nužudymą -USR1 'cat ${{pid_path}' yra įvykdytasPakeistas failo vardas, nginx vis tiek rašys žurnalo duomenis į naujai pavadintą failą "xxx.log_20130909", kaip įprasta. Priežastis ta, kad Linux sistemose branduolys ieško failų pagal failų deskriptorius.
---------------- "Linux" failų deskriptorių supratimas
Failo aprašas yra sveikojo skaičiaus identifikatorius, kurį Linux branduolys pavadina kiekvienam atidarytam failui. Linux branduolys generuoja (arba palaiko) "Failo aprašo lentelėŠioje failo aprašo lentelėje įrašomas "šio proceso atidarytas failas (identifikuotas)". Šioje aplinkoje nginx yra veikiantis procesas, kuris jau atidarė žurnalo failą ir užregistruoja failą failo aprašo lentelėje. Net jei žurnalo failo kelias pasikeitė, jį vis tiek galima rasti (jį galima rasti pagal failo aprašo lentelę). ---------------------------------------------- Vykdant komandą "kill -USR1 'cat ${pid_path}'", faile nginx.pid išsaugotas iš tikrųjų yra skaičius (galite jį atidaryti ir pažiūrėti, aš čia esu 894), o nginx įrašo savo pagrindinio proceso pid (proceso numerį) į nginx.pid failą, todėl galite tiesiogiai gauti pagrindinio proceso numerį naudodami cat komandą ir tiesiogiai valdyti nurodytą proceso numerį.
kill -USR1 'cat ${pid_path}' yra lygiavertis kill –USR1 894 #指定发信号 (USR1) signalas šiam procesui numeruoti.
Linux sistemose Linux bendrauja su "veikiančiais procesais" per signalus. Linux sistemose taip pat yra daug iš anksto nustatytų signalų, tokių kaip SIGHUP. USR1 yra vartotojo nustatytas signalas. Tai gali būti suprantama kaip pats procesas, apibrėžiantis, ką daryti, kai jis gauna šį signalą (tai yra, proceso rašytojas pats nusprendžia, ar gauti šį signalą, ar nieko nedaryti, ir palieka visiškai kūrėjui nuspręsti). Nginx jis rašo savo kodą, kad tvarkytų, kaip nginx iš naujo atidaryti žurnalo failą, kai gaunu USR1 signalą. Konkretus principas yra toks: 1. Pagrindinis nginx procesas gauna USR1 signalą ir iš naujo atidarys žurnalo failą (pavadintą pagal žurnalo pavadinimą nginx konfigūracijos faile, kuris yra access_log konfigūracijos failo elemento nustatyta reikšmė, o jei failo nėra, automatiškai bus sukurtas naujas failo xxx.log).
2. Tada pakeiskite žurnalo failo savininką į "darbo procesas", kad darbininkų procesas turėtų žurnalo failo skaitymo ir rašymo teises (pagrindinis ir darbuotojas paprastai veikia kaip skirtingi vartotojai, todėl savininką reikia pakeisti).
3. Pagrindinis nginx procesas uždarys pasikartojantį žurnalo failą (tai yra failą, kuris buvo pervadintas į xxx.log_ 20130909.log naudojant komandą mv),ir praneša darbuotojo procesui naudoti naujai atidarytą žurnalo failą(xxx.log failą, kurį ką tik atidarė pagrindinis procesas). Konkretus įgyvendinimas yra išsamesnis, pagrindinis procesas siunčia darbuotojui USR1 signalą, o gavęs šį signalą darbuotojas iš naujo atidarys žurnalo failą (tai yra konfigūracijos faile sutartą xxx.log)
=================================== Vykdykite scenarijus reguliariais intervalais
Nustatykite, kad aukščiau esantis apvalkalo scenarijaus failas būtų įtrauktas į suplanuotą užduotį. "crontab" yra suplanuotas užduočių procesas sistemoje "Linux". Šis procesas prasidės, kai jį įjungsite, ir karts nuo karto pateks į jo sąrašą, kad pamatytų, ar nėra kokių nors užduočių, kurias reikia atlikti.
Crontab -E
* 04 * * 1 /data/wwwlogs/nginx_log_division.sh
Bus atidarytas failas su pridėtu aukščiau nurodytu kodu Formatas yra "Vykdomas apvalkalo failo kelias". * gali būti suprantamas kaip "kiekvienas", kiekvieną minutę, kiekvieną valandą, kiekvieną mėnesį ir t.t. Aš nustatė scenarijų paleisti nginx_log_division.sh 4 val. pirmadienį, ir scenarijaus turinys yra iš naujo generuoti naują žurnalo failą.
Pridedama:SteigtiNGINXKaip konfigūruojami žurnalai
log_format svetainė '$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 svetainę #第二个参数表示使用那个日志格式 kiekvienam žurnalo formatui nurodomas pavadinimas, o svetainė atitinka pavadinimą log_format
Tai, kas išdėstyta pirmiau, apima "crontab" suplanuotų užduočių tvarkyklės naudojimą.
Taip pat yra vietų, kur nėra visiško supratimo ir klaidų. Tikiuosi atnaujinti ateityje.
|