Web 訪問日志 (access_log) 記錄了所有外部客戶端對Web服務(wù)器的訪問行為,包含了客戶端IP,訪問日期,訪問的URL資源,服務(wù)器返回的HTTP狀態(tài)碼等重要信息。
規(guī)劃: 1、 要解決問題: 當(dāng)網(wǎng)站訪問量大后,日志數(shù)據(jù)就會很多,如果全部寫到一個日志文件中去,文件會變得越來越大。文件大速度就會慢下來,比如一個文件幾百兆。寫入日志的時候,會影響操作速度。另外,如果我想看看訪問日志,一個幾百兆的文件,下載下來打開也很慢。使用第三方免費的日志分析工具-日志寶,可以上傳nginx、apache、iis的日志文件,它們幫助分析網(wǎng)站安全方面。畢竟專攻,更加專業(yè)。日志寶對上傳的文件也是做了大小限制的,不超過50m。
2、nignx沒有自動分開文件存儲日志的機(jī)制。由于nginx它不會幫你自動分文件保存。所以,需要自己編寫腳本來實現(xiàn)。
shell腳本文件nginx_log_division.sh內(nèi)容如下:
# /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
kill -USR1 `cat ${pid_path}`
上面shell腳本的原理是:先把以前的日志文件移動重命名成一個,目的是就是備份。 按照上個周一的本日來命名,運行腳本的時候時間點是”2013-09-16”,那么生成文件名稱是”xxx.log_ 20130909.log”。 在沒有執(zhí)行kill -USR1 `cat ${pid_path}`之前,即便已經(jīng)對文件執(zhí)行了mv命令而改變了文件名稱,nginx還是會向新命名的文件” xxx.log_ 20130909”照常寫入日志數(shù)據(jù)的。原因在于:linux系統(tǒng)中,內(nèi)核是根據(jù)文件描述符來找文件的。
----------------對linux文件描述符的理解
文件描述符是linux內(nèi)核為每個打開的文件命名的一個整數(shù)標(biāo)識。 linux內(nèi)核為每一個進(jìn)程生成(或者說維護(hù))一個”文件描述符表”,這個文件描述符表記錄的是“此進(jìn)程所打開的文件(進(jìn)行標(biāo)識)”。 在這里的環(huán)境中,nginx就是一個運行中的進(jìn)程,這個進(jìn)程早就打開了一個日志文件,在文件描述符表是記錄了文件的。 即便日志文件的路徑改變了,但是還是能夠找到(根據(jù)文件描述符表可以定位)。 ---------------------------------------------- 當(dāng)執(zhí)行命令“kill -USR1 `cat ${pid_path}`”的時候,nginx.pid文件中保存的其實就是一個數(shù)字(自己可以打開看一下,我這里是894),nginx 將其主進(jìn)程的 pid (進(jìn)程號)寫入到了nginx.pid 文件中,所以可以通過cat命令直接拿到其主進(jìn)程號,直接操作指定的進(jìn)程號。
kill -USR1 `cat ${pid_path}` 就等同于 kill –USR1 894 #指定發(fā)信號(USR1)信號給這個進(jìn)程編號。
在linux系統(tǒng)中,linux是通過信號與”正在運行的進(jìn)程”進(jìn)行通信的。linux系統(tǒng)中,也很多預(yù)定義好的信號,像SIGHUP。USR1是用戶自定義信號。可以理解為:進(jìn)程自己定義接到這個信號該干嘛(也就是進(jìn)程編寫者自己確定收到這個信號干嘛還是什么都不做都行,完全交給開發(fā)人員自己決定)。而在nginx中,它自己編寫了代碼處理當(dāng)我接到USR1信號的時候,讓nginx重新打開日志文件。具體原理如下: 1、nginx 的主進(jìn)程收到USR1信號,會重新打開日志文件(以nginx配置文件中的日志名稱命名,就是配置文件中access_log項所設(shè)置的值,如果文件不存在,會自動創(chuàng)建一個新的文件xxx.log)。
2、然后把日志文件的擁有者改為“工作進(jìn)程(worker進(jìn)程)”,目的是讓worker進(jìn)程就具備了對日志文件的讀寫權(quán)限(master和worker通常以不同用戶運行,所以需要改變擁有者)。
3、nginx主進(jìn)程會關(guān)閉重名的日志文件(也就是剛才使用mv命令重命名成xxx.log_ 20130909.log的文件),并通知工作進(jìn)程使用新打開的日志文件(剛才主進(jìn)程打開的文件xxx.log)。具體實現(xiàn)上更細(xì)化點就是,主進(jìn)程把USR1信號發(fā)給worker,worker接到這個信號后,會重新打開日志文件(也就是配置文件中約定的xxx.log)
===================================定時執(zhí)行腳本
設(shè)置上面的shell腳本文件加入到定時任務(wù)中去。crontab是linux下面一個定時任務(wù)進(jìn)程。開機(jī)此進(jìn)程會啟動,它每隔一定時間會去自己的列表中看是否有需要執(zhí)行的任務(wù)。
crontab -e
* 04 * * 1 /data/wwwlogs/nginx_log_division.sh
會打開一個文件,加入上面的代碼 格式為 "分 時 日 月 星期幾 要執(zhí)行的shell文件路徑"。用*可以理解成“每”,每分鐘,每個小時,每個月等等。 我設(shè)置是在周一凌晨4點運行nginx_log_division.sh腳本,腳本的內(nèi)容就是重新生成一個新的日志文件。
附:設(shè)置nginx日志的配置方法
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 #第二個參數(shù)表示使用那個日志格式,為每一個日志格式標(biāo)識了一個名稱,site對應(yīng)的就是log_format中的名稱
以上涉及到crontab定時任務(wù)管理器的使用知識。
還有沒完全理解透徹和錯誤的地方。希望以后更新。 |
|