管理Web網站不只是監視Web的速度和Web的內容傳送。它不但要關注服務器每天的吞吐量,還要了解這些Web網站的外來訪問,了解網站各頁面的訪問情況。根據各頁面的點擊頻率來改良網頁的內容和質量,提高內容的可讀性,和跟蹤包括有商業交易的步驟及管理Web網站“幕后”的數據等。
為了更好地提供WWW服務,監控Web服務器的運行情況、了解網站內容的詳細訪問狀態就顯得愈來愈重要和迫切了。而這些要求都可以通過對Web服務器日志文件的統計和分析來實現。本文將對Web服務器日志分析的原理和技術進行討論。
文章內相干工具軟件下載地址以下:
Webalizerhttp://www.mrunix.net/webalizer/
Cronolog http://www.cronolog.org/
Apache http://www.apache.org/
網站服務器日志記錄了Web服務器接收處理要求及運行時毛病等各種原始信息。通過對日志進行統計、分析和綜合,就可以有效地掌握服務器的運行狀態、發現和排除毛病緣由、了解客戶訪問散布等,更好地加強系統的保護和管理。
WWW服務模型非常簡單:
1.客戶端(閱讀器)和Web服務器建立TCP連接,連接建立以后,向Web服務器發出訪問要求(如get)。根據HTTP協議,該要求中包括了客戶真個IP地址、閱讀器的類型、要求的URL等1系列信息。
2. Web服務器收到要求后,將客戶端要求的頁面內容返回到客戶端。如果出現毛病,那末返回毛病代碼。
3. 服務器端將訪問信息和毛病信息記錄到日志文件里。
下面是客戶端發送給Web服務器要求的數據報的內容:
GET /engineer/ideal/list.htm HTTP/1.1
Accept: image/gif, image/x-xbitmap,image/jpeg, image/pjpeg,
application/vnd.ms-powerpoint,application/vnd.ms-excel, application/msword, */*
Referer:http://www.linuxaid.com.cn/engineer/ideal/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible;MSIE 6.0; Windows NT 5.0)
Host: www.linuxaid.com.cn
Connection: Keep-Alive
從代碼中可以看到,在客戶機的要求里包括了很多有用的信息,如客戶端類型等。Web服務器會將要求的Web頁內容發送返回給客戶機。
目前經常使用的Web服務器有Apache、Netscape Enterprise Server、MS IIS等。而現在互聯網上經常使用的Web服務器就是Apache,因此本文所做的討論都將以Linux+Apache環境討論(其它的利用環境與此類似)。對Apache來講,支持多種日志文件格式,最多見的是common和combined兩種模式。其中,combined方式比common方式日志信息中的Referer(表示該要求來自于哪里,例如來自于yahoo的搜索引擎)和User-agent(用戶客戶端類型,如Mozilla或IE)多。下面是common類型的日志示例:
218.242.102.121 - -[06/Dec/2002:00:00:00 +0000] "GET
/2/face/shnew/ad/via20020915logo.gifHTTP/1.1" 304 0 "http://www.mpsoft.net/"
"Mozilla/4.0 (compatible; MSIE6.0; Windows 98)"
61.139.226.47 - - [06/Dec/2002:00:00:00+0000] "GET /cgi-bin/guanggaotmp.cgi?1
HTTP/1.1" 200 178"http://www3.beareyes.com.cn/1/index.php" "Mozilla/4.0
(compatible; MSIE 5.0; Windows 98;DigExt)"
218.75.41.11 - - [06/Dec/2002:00:00:00+0000] "GET
/2/face/shnew/ad/via20020915logo.gifHTTP/1.1" 304 0 "http://www.mpsoft.net/"
"Mozilla/4.0 (compatible; MSIE5.0; Windows 98; DigExt)"
61.187.207.104 - -[06/Dec/2002:00:00:00 +0000] "GET /images/logolun1.gif
HTTP/1.1" 304 0"http://www2.beareyes.com.cn/bbs/b.htm" "Mozilla/4.0(compatible;
MSIE 6.0; Windows NT 5.1)"
211.150.229.228 - -[06/Dec/2002:00:00:00 +0000] "GET /2/face/pub/image_top_l.gif
HTTP/1.1" 200 260"http://www.beareyes.com/2/lib/200201/12/20020112004.htm"
"Mozilla/4.0 (compatible; MSIE5.5; Windows NT 5.0)"
從上面的日志文件可以看出,日志記錄會記錄客戶真個IP地址、訪問產生的時間、訪問要求的頁面、Web服務器對該要求返回的狀態信息、返回給客戶真個內容的大小(以字節為單位)、該要求的援用地址、客戶閱讀器類型等信息。
本文中假定Apache運行有兩個虛擬主機:www.secfocus.com和www.tomorrowtel.com。我們需要對這兩個虛擬主機分別進行訪問日志分析和統計。
Apache配置文件中,需要關心的和日志相干配置有兩個:
$ CustomLog /www/logs/access_log common
$ ErrorLog /www/logs/error_log
CustomLog用來唆使Apache的訪問日志寄存的位置(這里保存在/www/logs/access_log中)和格式(這里為common);ErrorLog用來唆使Apache毛病信息日志寄存的位置。
對不配置虛擬主機的服務器來講,只需直接在httpd.conf中查找CustomLog配置進行修改便可。而對具有多個虛擬服務器的Web服務器來講,需分離各個虛擬服務器的訪問日志,以便對各個虛擬服務器進行訪問統計和分析。因此就需要在虛擬服務器配置中進行獨立的日志配置,示例以下:
NameVirtualHost 75.8.18.19
ServerName www.secfocus.com
ServerAdmin secfocus@secfocus.com
DocumentRoot /www/htdocs/secfocus/
CustomLog "/www/log/secfocus"combined
Alias /usage/"/www/log/secfocus/usage/"
ServerName www.tomorrowtel.com
ServerAdmin tomorrowtel @tomorrowtel.com
DocumentRoot /www/htdocs/ tomorrowtel
CustomLog "/www/log/tomorrowtel" combined
Alias /usage/"/www/log/tomorrowtel/usage/"
這里需要注意的是,每一個虛擬主機的定義都有1個CustomLog命令,用來指定該虛擬主機訪問日志的寄存文件;而Alias命令用來讓日志分析生成的報表能通過www.secfocus.com/usage/的方式來訪問。通過上面的配置就完成了日志文件的保存。
接下來遇到的1個問題就是日志文件的輪循。由于日志1直在增大,如果不進行處理那末日志文件愈來愈大,就會影響Web服務器運行效力、速率,還可能耗盡服務器硬盤空間,致使服務器沒法正常運行。另外,如果單個日志文件大于操作系統單文件尺寸的的限制,從而會進1步影響Web服務的運行。而且,日志文件如果不進行輪循,也不便于日志統計分析程序的運行。由于日志統計分析都是以天為單位進行統計分析的,逾越很長時間日志會使得統計分析程序運行特別慢。因此這里就需要對Web服務器日志文件每天進行輪循。
Web服務器日志輪循比較好的方式有3種:第1種方法是利用Linux系統本身的日志文件輪循機制logrotate;第2種方法是利用Apache自帶的日志輪循程序rotatelogs;第3種是使用在Apache的FAQ中推薦發展已比較成熟的1個日志輪循工具 cronolog。
對大型的Web服務來講,常常使用實用負載均衡技術提高Web站點服務能力,這樣后臺有多個服務器提供Web服務,大大方便了服務的散布計劃和擴大性。如果有多個服務器的散布需要對日志進行合并,統1進行統計分析。因此為了保證統計的精確性,需要嚴格依照每天的時段來自動生成日志。
首先討論采取Linux系統本身的日志文件輪循機制logrotate的方法。logrotate是Linux系統本身帶的1個日志輪循程序,是專門對各種系統日志(syslogd、mail)進行輪循的程序。該程序是由運行程序的服務crond每天清晨4:02運行的。在/etc/cron.daily目錄下可以看到logrotate文件,其內容以下:
#!/bin/sh/
$ usr/sbin/logrotate/etc/logrotate.conf
每天清晨crond都會啟動/etc/cron.daily目錄下的logrotate腳本來進行日志輪循。
在/etc/logrorate.conf中可以看到以下內容:
# see "man logrotate" fordetails
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files afterrotating old ones
create
# uncomment this if you want your logfiles compressed
#compress
# RPM packages drop log rotationinformation into this directory
include /etc/logrotate.d
# no packages own wtmp -- we'll rotatethem here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
# system-specific logs may be also beconfigured here.
從 logrotate的配置文件中可以看到,除wtmp之外,需要轉動的日志的配置都保存在/etc/logroate.d目錄下。因此只需要在該目錄下創建1個名為apache的配置文件,來唆使logrotate如何輪循Web服務器的日志文件便可。下面是1個示例:
/www/log/secfocus {
rotate 2
daily
missingok
sharedscripts
postrotate
/usr/bin/killall -HUP httpd 2>/dev/null || true
endscript
}
/www/log/tomorrowtel {
rotate 2
daily
missingok
sharedscripts
postrotate
/usr/bin/killall -HUP httpd 2>/dev/null || true
endscript
}
這里“rotate 2”表示輪循時只包括兩個備份文件,也就是只有access_log、access_log.1和access_log.23個日志備份文件。這樣就實現了對兩個虛擬主機的日志文件的輪循。本文后面會討論如何使用日志統計分析軟件對日志文件進行處理。
這類方法的優點是不需要其它第3方工具就能夠實現日志輪循。但是對重負載的服務器和使用負載均衡技術的Web服務器來講,這類方法不是很實用。由于它是對相應服務進程發出1個-HUP重啟命令來實現日志的截斷歸檔的,這樣會影響服務的連續性。
用rotatelogs實現日志輪循
Apache 提供了不把日志直接寫入文件,而是通過管道發送給另外1個程序的能力。這樣就大大加強了對日志進行處理的能力。這個通過管道得到的程序可以是任何程序,如日志分析、緊縮日志等。要實現將日志寫到管道的操作,只需要將配置中日志文件部份的內容替換為“|程序名”便可,例如:
# compressed logs
$ CustomLog "|/usr/bin/gzip -c>> /var/log/access_log.gz" common
這樣就能夠使用Apache自帶的輪循工具rotatelogs來對日志文件進行輪循。rotatelogs基本是按時間或大小來控制日志的。
$ CustomLog "|/www/bin/rotatelogs/www/logs/secfocus/access_log 86400" common
上面的示例中,Apache訪問日志被發送給程序rotatelogs;rotatelogs將日志寫入 /www/logs/secfocus/access_log,并每隔86400秒(1天)對日志進行1次輪循。輪循以后的文件名為 /www/logs/secfocus/access_log.nnn,這里nnn是開始記錄日志的時間。因此,為了將日志按天對齊需要在清晨00:00 啟動服務,使得每天輪循得到的日志恰好是完全1天的日志,以提供給訪問統計分析程序進行處理。如果是00:00開始生成新的日志,那末輪循得到的日志就是 access_log.0000。
首先需要下載和安裝cronolog,可以到http://www.cronolog.org下載最新版本的cronolog。下載終了以后,解壓安裝便可。方法以下所示:
tar xvfz cronolog⑴.6.2.tar.gz
cd cronolog⑴.6.2
./configure
make
make check
make install
這樣就完成了cronolog的配置和安裝,默許情況下cronolog是安裝在/usr/local/sbin下。
修改Apache日志配置命令以下所示:
$ CustomLog"|/usr/local/sbin/cronolog /www/logs/secfocus/%w/access_log" combined
這里%w表示依照日期在不同的目錄下保存日志,這類方式會保存1周的日志。
為了進行日志分析,需要每天將該日志文件拷貝(或移動,如果不希望保存1周的日志)到1個固定的位置,以方便日志分析統計文件進行處理(使用crontab -e)。添加定時任務以下:
$ 5 0 * * * /bin/mv/www/logs/secfocus/`date -v⑴d +\%w`/access_log
/www/logs/secfocus/access_log_yesterday
再使用日志統計分析程序,對文件access_log_yesterday進行處理。
對使用負載均衡技術的大型站點,就存在多個服務器的訪問日志的合并處理問題。對這類情況,各個服務器定義或移動日志文件時就不能使用 access_log_yesterday了,而應當帶上服務器編號(例如服務器IP地址等信息)加以辨別。然后在各個服務器上運行網站鏡像和備份服務 rsyncd,再將每一個服務器每天的安裝配置文件通過rsync下載到專門進行訪問統計分析的服務器上進行合并。
合并多個服務器的日志文件(如log1、log2、log3),并輸出到log_all中的方法是:
$ sort -m -t " " -k 4 -olog_all log1 log2 log3
-m表示使用merge優化算法;-k 4表示根據時間進行排序;-o表示將排序結果寄存到指定的文件中。
webalizer是1個高效、免費的Web服務器日志分析程序。其分析結果是HTML文件格式的,從而可以很方便地通過Web服務器進行閱讀。Internet上的很多站點都使用webalizer進行Web服務器日志分析。Webalizer具有以下1些特性。
◆ 它是用C語言寫的程序,具有很高的運行效力。在CPU主頻為200MHz的機器上,webalizer每秒鐘可以分析1萬條記錄,所以分析1個40MB大小的日志文件只需要15秒。
◆ webalizer支持標準的1般日志文件格式(Common Logfile Format)。除此以外,也支持幾種組合日志格式的變種,從而可以統計客戶情況及客戶操作系統類型。現在webalizer已可以支持wu-ftpd xferlog日志格式及squid日志文件格式。
◆ 支持命令行配置及配置文件。
◆ 可以支持多種語言,也能夠自己進行本地化工作。
◆ 支持多種平臺,比如Unix、Linux、NT、OS/2和MacOS等。
webalizer生成的訪問統計分析報表里面包括每月的平均訪問量的表格和條形圖統計分析情況。點擊每月份,可以得到這個月每天的詳細統計信息。
1.安裝
在安裝之前,首先需要確保系統已安裝有gd庫,可使用下段代碼:
# rpm -qa|grep gd
# gd-devel⑴.8.4⑷
# gdbm-devel⑴.8.0⑴4
# gdbm⑴.8.0⑴4
# sysklogd⑴.4.1⑻
# gd⑴.8.4⑷
用來確認系統已安裝有gd-deve和gd兩個RPM包。
安裝webalizer有兩種方式:1種是下載源代碼來安裝;1種是直接使用RPM包來安裝。
使用RPM包方式安裝非常簡單,從rpmfind.net找到webalizer包,下載以后運行以下代碼,便可實現安裝:
$ rpm -ivh webalizer⑵.01_10⑴.i386.rpm
對源代碼方式需要從http://www.mrunix.net/webalizer/下載,然后安裝。首先解開源代碼包:
$ tar xvzf webalizer⑵.01⑴0-src.tgz
在生成的目錄中有個lang目錄。該目錄中保存了各種語言文件,但是只有繁體中文版本,可以自己轉換成簡體,或重新翻譯1下,然落后入生成的目錄:
$ cd webalizer⑵.01⑴0
$ ./configure
$ make --with-language=Chinese
$ make install
編譯成功后,會在/usr/local/bin/目錄下安裝1個webalizer可履行文件。
2.配置和運行
對webalizer運行的控制可以通過配置文件或在命令行指定參數的兩種方式進行。使用配置文件方式比較簡單和靈活,適用于自動Web服務器日志統計分析的利用環境。
webalizer 的默許配置文件為/etc/webalizer.conf,當啟動webalizer時沒有使用“-f“選項時,webalizer就會尋覓文件 /etc/webalizer.conf,也能夠使用“-f”來指定配置文件(當服務器有虛擬主機時,需要配置多份不同的webalizer配置文件。不同的虛擬主機的webalizer使用不同的配置文件。webalizer.conf配置文件中需要修改的配置選項以下:
LogFile /www/logs/secfocus/access_log
用來唆使配置文件的路徑信息,webalizer會將該日志文件作為輸入進行統計分析:
OutputDir /www/htdocs/secfocus/usage
用來唆使生成的統計報表的保存目錄,在前面使用alias,使用戶可使用http://www.secfocus.com/usage/來訪問統計報表。
HostName www.secfocus.com
上述代碼用來唆使主機名,統計報表中會援用該主機名。
其它選項無需修改。配置文件修改終了以后,需要定時webalizer,每天生成當日的統計分析。
以root身份運行crontab -e進入定時運行任務編輯狀態,加入以下任務:
$ 5 0 * * * /usr/local/bin/webalizer -f/etc/secfocus.webalizer.conf
$ 15 0 * * * /usr/local/bin/webalizer-f /etc/tomorrowtel.webalizer.conf
這里假定系統運行有兩個虛擬主機,并分別定義了日志分析配置文件secfocus.webalizer.conf和 tomorrowtel.webalizer.conf。這樣定義在清晨00:05對secfocus的日志進行統計分析;在清晨00:15對 tomorrowtel的日志進行統計分析。
第2天分別使用http://www.secfocus.com/usage和http://www.tomorrowtel.com/usage來查看各自的日志分析報表。
保護日志統計分析報告不被未授權用戶訪問
我們都不希望自己網站訪問統計信息隨便被他人閱讀,因此需要將usage目錄保護起來,只允許合法的用戶訪問。這里可以采取Apache自帶的基本認證機制。配置以后再連接這個地址需要用戶提供密碼才能訪問該頁面(如圖3所示)
1.條件
在配置文件中對目錄“/”應當設置為:
DocumentRoot /www/htdocs/secfocus/
AccessFileName .htaccess
AllowOverride All
2.需求
需求是限制對http://www.secfocus.com/usage/的訪問,要求用戶認證才能訪問。這里設置用戶為“admin”,口令為“12345678”。
使用htpasswd建立用戶文件:
$ htpasswd -c /www/.htpasswd admin
此程序會詢問用戶“admin”的口令,輸入“12345678”兩次生效。
3.建立.htaccess文件
用vi在/www/logs/secfocus/usage/目錄下建立1個文件.htaccess,寫入以下幾行代碼:
AuthName admin-only
AuthType Basic
AuthUserFile /www/.htpasswd
require user admin
測試
通過閱讀器訪問http://www.secfocus.com/usage,就會彈出框要求輸入用戶名和口令,輸入“admin”、“12345678”就能夠訪問訪問日志統計分析報表。
http://server.it168.com/a2009/0624/595/000000595027_3.shtml