Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 12114|Odpoveď: 3

[Web] nginx automaticky prerezáva prístupové záznamy

[Kopírovať odkaz]
Zverejnené 5. 1. 2015 20:53:57 | | |

Webový prístupový log (access_log) zaznamenáva správanie prístupu všetkých externých klientov k webovému serveru, vrátane dôležitých informácií ako IP klienta, dátum prístupu, prístup k URL zdroju, HTTP stavový kód vrátený serverom a podobne.
Typický záznam prístupu na web vyzerá takto:


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, podobne ako Gecko) verzia/4.0 Mobile Safari/533.1 MicroMessenger/4.5.1.259" -


Plánovanie:

1. Na vyriešenie problému:

Keď má webová stránka veľký počet návštev, bude tam veľa logových dát, a ak je všetko zapísané do log súboru, súbor sa zväčšuje a zväčšuje. Rýchlosť veľkých súborov sa spomalí, napríklad stovky megabajtov súboru. Pri zapisovaní logov to ovplyvňuje rýchlosť prevádzky. Tiež, ak chcem pozrieť prístupové záznamy, súbor s niekoľkými stovkami megabitov sa sťahuje a otvára pomaly. Pomocou bezplatného nástroja na analýzu logov od tretej strany – Log Treasure – môžete nahrávať logové súbory z nginx, apache a ii, ktoré pomáhajú analyzovať bezpečnostné aspekty webu. Veď špecializácia je profesionálnejšia. Log Bao má tiež limit veľkosti pre nahrané súbory, maximálne 50 m.


2. Nignx nemá mechanizmus na automatické oddelenie súborov a ukladanie logov. Keďže nginx automaticky neukladá súbory za vás. Preto musíte napísať vlastný skript, aby ste to implementovali.


Shell skriptový súbor nginx_log_division.sh nasledujúci obsah:


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


zabiť -USR1 'mačka ${pid_path}'


Princíp vyššie uvedeného shell skriptu je najprv presunúť a premenovať predchádzajúci log súbor na jeden, pričom účelom je zálohovať.

Podľa názvu posledného pondelka, keď sa skript spustí v časovom bode "2013-09-16", generovaný názov súboru je "xxx.log_ 20130909.log".

Aj keď bol príkaz mv vykonaný na súbore pred zabitím -USR1, 'cat ${{pid_path}' sa vykonáZmenený názov súboru, nginx bude stále zapisovať logovacie dáta do novo pomenovaného súboru "xxx.log_20130909" ako obvykle. Dôvodom je, že v Linuxových systémoch jadro hľadá súbory na základe popisov súborov.


---------------- pochopenie popisov súborov v Linuxe


Descriptor súboru je celočíselný identifikátor, ktorý jadro Linuxu pomenuje pre každý otvorený súbor.

Jadro Linuxu generuje (alebo udržiava) "Tabuľka deskriptorov súborovTáto tabuľka deskriptora súboru zaznamenáva "súbor otvorený týmto procesom (identifikovaný)".

V tomto prostredí je nginx bežiaci proces, ktorý už otvoril logovací súbor a zaznamenáva ho v tabuľke descriptorov súboru.

Aj keď sa cesta log súboru zmenila, stále ho možno nájsť (môže byť lokalizovaný podľa tabuľky deskriptorov súboru).

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

Pri spustení príkazu "kill -USR1 'cat ${pid_path}'" je uložené číslo v súbore nginx.pid vlastne číslo (môžete ho otvoriť a pozrieť sa, ja som tu 894) a nginx zapíše pid (číslo procesu) svojho hlavného procesu do súboru nginx.pid, takže môžete priamo získať jeho hlavné číslo procesu cez príkaz cat a priamo spracovať zadané číslo procesu.


kill -USR1 'cat ${pid_path}' je ekvivalent

kill – signál USR1 894 #指定发信号 (USR1) na číslo tohto procesu.


V linuxových systémoch Linux komunikuje s "bežiacimi procesmi" prostredníctvom signálov. V Linuxových systémoch existuje tiež mnoho preddefinovaných signálov, ako napríklad SIGHUP. USR1 je používateľom definovaný signál. Dá sa chápať ako samotný proces, ktorý definuje, čo má robiť, keď tento signál prijme (teda samotný pisateľ procesu sa rozhodne, či tento signál prijme alebo nič neurobí, a rozhodnutie ponecháva výlučne na vývojárovi). V nginx píše vlastný kód, ktorý zvláda spracovanie opätovného otvorenia log súboru nginx, keď dostanem signál USR1. Konkrétny princíp je nasledovný:

1. Hlavný proces nginx prijíma signál USR1 a znovu otvorí logovací súbor (pomenovaný podľa logového mena v konfiguračnom súbore nginx, čo je hodnota nastavená access_log položkou v konfiguračnom súbore, a ak súbor neexistuje, nový súbor xxx.log sa automaticky vytvorí).


2. Potom zmeniť vlastníka logovacieho súboru na "worker process", aby pracovný proces mal oprávnenia na čítanie a zápis do log súboru (master a worker zvyčajne bežia ako rôzni používatelia, takže vlastníka je potrebné zmeniť).


3. Hlavný proces nginx zatvorí duplicitný log súbor (teda súbor, ktorý bol premenovaný na xxx.log_ 20130909.log práve teraz pomocou príkazu mv),a upozorňuje pracovný proces, aby použil novo otvorený log súbor(xxx.log súbor, ktorý práve otvoril hlavný proces). Konkrétna implementácia je podrobnejšia, hlavný proces posiela USR1 signál pracovníkovi a po jeho prijatí pracovník znovu otvorí logovací súbor (teda xxx.log dohodnutý v konfiguračnom súbore)



=================================== Spúšťajte skripty v pravidelných intervaloch


Nastavte shell skriptový súbor vyššie, aby sa pridal do plánovanej úlohy. crontab je plánovaný úlohový proces pod Linuxom. Tento proces sa spustí, keď ho zapnete, a občas sa otvorí vo svojom zozname, aby zistil, či je potrebné vykonať nejaké úlohy.


crontab -e


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



Súbor sa otvorí s pridaným vyššie uvedeným kódom

Formát je "Shell file path to be executed". * možno chápať ako "každý", každú minútu, každú hodinu, každý mesiac a podobne.

Nastavil som skript, ktorý nginx_log_division.sh spustí v pondelok o 4:00 ráno, a obsahom skriptu je regenerovať nový log súbor.



Priložené:PripraviťnginxAko sa logy konfigurujú


log_format stránka '$remote_addr - $remote_user [$time_local] "$request" '

             '$status $body_bytes_sent "$http_referer" '

             '"$http_user_agent" $http_x_forwarded_for';


access_log stránka /data/wwwlogs/xxxx.com.log

#第二个参数表示使用那个日志格式 sa pre každý formát logu identifikuje názov a lokalita zodpovedá názvu v log_format



Vyššie uvedené zahŕňa použitie plánovaného správcu úloh crontab.



Sú aj miesta, kde nie je úplné pochopenie a sú chyby. Dúfam, že v budúcnosti budem aktualizovať.






Predchádzajúci:Otázky na záverečnú skúšku Houpu javaoop 2014
Budúci:Základné metódy použitia vi/vim
Zverejnené 6. 1. 2015 0:04:30 |
Och, môže odpoveď zarábať peniaze?
 Prenajímateľ| Zverejnené 6. 1. 2015 0:06:16 |
Johnyoung zverejnené 6.1.2015 00:04
Och, môže odpoveď zarábať peniaze?

Môže mať prestíž
Zverejnené 6. 1. 2015 0:13:44 |

Na čo je prestíž?
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com