Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 12114|Odgovoriti: 3

[Web] NGinx samodejno prekine dostopne dnevnike

[Kopiraj povezavo]
Objavljeno na 5. 01. 2015 20:53:57 | | |

Dnevnik spletnega dostopa (access_log) beleži vedenje dostopa vseh zunanjih odjemalcev do spletnega strežnika, vključno z pomembnimi informacijami, kot so IP odjemalca, datum dostopa, dostop do URL-ja, ki ga strežnik vrne, HTTP statusna koda, ki jo strežnik vrne, in podobno.
Tipičen dnevnik spletnega dostopa izgleda takole:


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 sestava/GRK39F) AppleWebKit/533.1 (KHTML, kot Gecko) različica/4.0 Mobile Safari/533.1 MicroMessenger/4.5.1.259" -


Načrtovanje:

1. Za rešitev problema:

Ko ima spletna stran veliko obiskov, bo veliko podatkov o dnevniku, in če je vse zapisano v dnevnik, bo datoteka postajala vedno večja. Hitrost velikih datotek se bo upočasnila, na primer stotine megabajtov datoteke. Pri zapisovanju dnevnikov to vpliva na hitrost delovanja. Prav tako, če želim pogledati dnevnike dostopa, je datoteka z več sto megabiti počasna za prenos in odpiranje. Z uporabo brezplačnega orodja za analizo dnevnikov tretje strani – Log Treasure, lahko naložite dnevnike iz nginx, apache in iis, ki pomagajo analizirati varnostne vidike spletne strani. Navsezadnje je specializacija bolj profesionalna. Log Bao ima tudi omejitev velikosti za naložene datoteke, ki ne presega 50 m.


2. Nignx nima mehanizma za samodejno ločevanje datotek in shranjevanje dnevnikov. Ker nginx samodejno ne shranjuje datotek namesto vas. Zato morate napisati svoj skript, da to implementirate.


Shell skriptna datoteka nginx_log_division.sh naslednjo vsebino:


# /smeti/udarec

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}_$(datum --date="LAST WEEK" +"%Y-%m-d").log


kill -USR1 'cat ${pid_path}'


Načelo zgornjega shell skripta je najprej premakniti in preimenovati prejšnjo datoteko dnevnika v eno, namen je varnostno kopiranje.

Po imenu zadnjega ponedeljka, ko se skripta zažene ob času "2013-09-16", je generirano ime datoteke "xxx.log_ 20130909.log".

Tudi če je bil ukaz mv izveden na datoteki pred ukinitvijo -USR1, se izvede 'cat ${{pid_path}'Spremenjeno ime datoteke, nginx bo še vedno zapisoval podatke o logu v novo poimenovano datoteko "xxx.log_20130909" kot običajno. Razlog je v tem, da jedro v Linux sistemih išče datoteke na podlagi deskriptorjev datotek.


---------------- razumevanje Linux opisov datotek


Deskriptor datoteke je celoštevilski identifikator, ki ga Linux jedro poimenuje za vsako odprto datoteko.

Linux jedro generira (ali vzdržuje) "Tabela opisovanja datotekTa tabela opisa datoteke beleži "datoteko, odprto s tem procesom (identificirano)".

V tem okolju je nginx tekoči proces, ki je že odprl dnevniško datoteko in jo beleži v tabeli opisnikov datotek.

Tudi če se je pot dnevniške datoteke spremenila, jo je še vedno mogoče najti (lahko jo najdemo glede na tabelo opisnikov datotek).

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

Ko izvedete ukaz "kill -USR1 'cat ${pid_path}'", je shranjeno v datoteki nginx.pid dejansko številka (lahko jo odprete in pogledate, jaz sem tukaj 894), nginx pa zapiše pid (številko procesa) svojega glavnega procesa v datoteko nginx.pid, tako da lahko neposredno pridobite njegovo glavno številko procesa preko ukaza cat in neposredno upravljate določeno številko procesa.


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

kill – signal USR1 894 #指定发信号 (USR1) za oštevilčenje tega postopka.


V Linux sistemih Linux komunicira z "tekočimi procesi" preko signalov. V Linux sistemih obstaja tudi veliko vnaprej določenih signalov, kot je SIGHUP. USR1 je uporabniško definiran signal. Razumemo ga lahko kot proces, ki sam določa, kaj storiti, ko prejme ta signal (to pomeni, da pisec procesa sam odloči, ali bo ta signal prejel ali nič ne storil, in odločitev prepusti razvijalcu). V nginx napiše svojo lastno kodo za upravljanje ponovnega odpiranja dnevnika nginx, ko prejmem signal USR1. Specifično načelo je naslednje:

1. Glavni proces nginx prejme signal USR1 in ponovno odpre datoteko dnevnika (poimenovano po imenu dnevnika v konfiguracijski datoteki nginx, ki je vrednost, ki jo določi access_log element v konfiguracijski datoteki, in če datoteka ne obstaja, se samodejno ustvari xxx.log nova datoteka).


2. Nato spremenite lastnika dnevnika v "delavski proces", tako da ima delovni proces dovoljenja za branje in pisanje v dnevnik datoteko (glavni in delavec običajno delujeta kot različni uporabniki, zato je treba lastnika spremeniti).


3. Glavni proces nginx bo zaprl podvojeno datoteko dnevnika (torej datoteko, ki je bila preimenovana v xxx.log_ 20130909.log z uporabo ukaza mv pravkar zdaj),in obvesti delavski proces, naj uporabi na novo odprto datoteko dnevnika(xxx.log datoteko, ki jo je pravkar odprl glavni proces). Specifična izvedba je bolj podrobna, glavni proces pošlje signal USR1 delavcu, in po prejemu tega signala delavec ponovno odpre datoteko dnevnika (torej xxx.log, dogovorjeno v konfiguracijski datoteki)



=================================== Izvajanje skript v rednih intervalih


Nastavite zgornjo shell script datoteko, da se doda v načrtovano nalogo. crontab je načrtovan proces nalog pod Linuxom. Ta postopek se začne, ko ga vklopite, in občasno gre na svoj seznam, da preveri, ali je treba opraviti kakšne naloge.


crontab -e


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



Odprla se bo datoteka z dodano zgornjo kodo

Format je "Shell file path to be executed". * lahko razumemo kot "vsako", vsako minuto, vsako uro, vsak mesec itd.

Nastavil sem skripto, ki nginx_log_division.sh zažene ob 4. uri zjutraj v ponedeljek, vsebina skripte pa je za ponovno generiranje nove dnevniške datoteke.



Priloženo:PripravitinginxKako so dnevniki konfigurirani


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

             '$status $body_bajti_poslani "$http_referer" '

             '"$http_user_agent" $http_x_posredovano_za';


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

#第二个参数表示使用那个日志格式 se za vsak format dnevnika določi ime, lokacija pa ustreza imenu v log_format



Zgoraj navedeno vključuje uporabo upravljalnika načrtovanih opravil crontab.



Obstajajo tudi kraji, kjer ni popolnega razumevanja in napak. Upam, da bom v prihodnosti posodobil.






Prejšnji:Vprašanja za zaključni izpit Houpu javaoop 2014
Naslednji:Osnovne metode uporabe vi/vim
Objavljeno na 6. 01. 2015 00:04:30 |
Oh, ali lahko odgovor prinese denar?
 Najemodajalec| Objavljeno na 6. 01. 2015 00:06:16 |
Johnyoung objavljeno 6. 1. 2015, 00:04
Oh, ali lahko odgovor prinese denar?

Lahko ima prestiž
Objavljeno na 6. 01. 2015 00:13:44 |

Za kaj je prestiž?
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com