作者:ideal 本文選自:LinuxAID 2003年04月04日 | |||||||||||||||||||||||||
關鍵字:web服務器 日誌 統計分析 crontab cronolog apache 摘要:對於所有的ICP來說,除了保證網站穩定正常運行以外,一個重要的問題就是網站訪問量的統計和分析報表,這對於瞭解和監控網站的運 行狀態,對提高各個網站的服務能力和服務水平是必不可少的。通過對Web服務器的日誌文件進行分析和統計,能夠有效掌握系統運行情況以及網站內容的受訪問 情況、加強對整個網站及其內容的維護與管理。本文對Web服務器日誌分析的原理和技術進行討論。 文章相關軟件:
一、 前言 隨著Internet上Web服務的發展,幾乎各個政府部門、公司、大專院校、科研院所等都在構建或正在建設自己的網站。而與此同 時,在構建網站建設中各個單位都會遇到各種各樣的問題,那麼對web服務器的運行和訪問情況進行詳細和周全的分析對於瞭解網站運行情況,發現網站存在的不 足,促進網站的更好發展重要性是不言而喻的。 管理Web網站不只是監視Web的速度和Web的內容傳送,它要求不僅僅關注服務器每天的吞吐量,還要瞭解對這些Web網站的外來 訪問,瞭解網站各頁面的訪問情況,根據各頁面的點擊頻率來改善網頁的內容和質量、提高內容的可讀性,跟蹤包含有商業交易的步驟以及管理Web網站「幕後」 的數據等。 為了更好地提供WWW服務,監控WEB服務器的運行情況、瞭解網站內容的詳細訪問狀況就越來越顯得重要和迫切了。而這些要求都可以通過對web服務器的日誌文件的統計和分析來做到。 二、WEB日誌分析的原理 網站服務器日誌記錄了web服務器接收處理請求以及運行時錯誤等各種原始信息。通過對日誌進行統計、分析、綜合,就能有效地掌握服務器的運行狀況,發現和排除錯誤原因、瞭解客戶訪問分布等,更好的加強系統的維護和管理。 在WWW服務模型是非常簡單的(見圖1): 1) 客戶端(瀏覽器)和web服務器建立tcp連接,連接建立以後,向web 服務器發出訪問請求(如:get),根據HTTP協議該請求中包含了客戶端的IP地址、瀏覽器的類型、請求的URL等一系列信息。 圖1 web訪問機制 2) web服務器收到請求後,將客戶端要求的頁面內容返回到客戶端。如果出現錯誤,那麼返回錯誤代碼。 3) 服務器端將訪問信息和錯誤信息紀錄到日誌文件裡。下面是客戶端發送給web服務器請求的數據報的內容:
可以看到,在客戶機的請求裡包含了很多有用的信息,例如:客戶端類型等等。而web服務器就會將請求的web頁內容發送返回給客戶機。 目前最常用的web服務器有Apache、Netscape enterprise server、MS IIS等。而目前互聯網上最常用的web服務器就是apache,因此我們這裡的討論都以Linux+apache環境討論,其他的應用環境類似。對於 Apache來說,支持多種日誌文件格式,最常見的是common和combined兩種模式,其中combined方式比common方式的日誌的信息 要多Referer(該請求來自於哪裡,例如來自於yahoo的蒐索引擎)和User-agent(用戶客戶端類型,如mozilla或IE)。我們這裡 討論combined類型。下面是common類型的日誌示例:
從上面的日誌文件可以看出日誌記錄會記錄客戶端的IP地址、訪問發生的時間、訪問請求的頁面、web服務器對於該請求返回的狀態信息、返回給客戶端的內容的大小(以字節為單位)、該請求的引用地址、客戶瀏覽器類型等信息。 三、apache日誌的配置和管理 本文中我們假設我們的apache運行有兩個虛擬主機:www.secfocus.com和www.tomorrowtel.com。我們需要對這兩個虛擬主機分別進行訪問日誌分析和統計。 Apache配置文件中,我們需要關心的和日誌相關的配置有兩個:
CustomLog用來指示apache的訪問日誌的存放位置(這裡保存在/www/logs/access_log中)和格式(這裡為common);ErrorLog用來指示apache錯誤信息日誌的存放位置。 對於不配置虛擬主機的服務器來說,只需要直接在httpd.conf中查找CustomLOg的配置進行修改即可;而對於具有多個虛 擬服務器的web服務器來說,需要分離各個虛擬服務器的訪問日誌,以便對各個虛擬服務器進行訪問統計和分析。因此這就需要在虛擬服務器配置中進行獨立的日 誌配置,示例:
這裡需要注意的是每個虛擬主機的定義都有一個CustomLog命令,用來指定該虛擬主機訪問日誌的存放文件;而Alias命令用來讓日誌分析生成的報表能通過www.secfocus.com/usage/的方式來訪問。通過上面的配置就完成了日誌文件的保存。 但是下來遇到的一個問題就是日誌文件的輪循,因為日誌是一直在增大的,如果不進行處理那麼日誌文件會越來越大,會影響web服務器運 行效率;速率,還可能過大耗盡服務器硬盤空間,導致服務器無法正常運行,另外如果單個日誌文件大於操作系統單文件尺寸的的限制,從而更進一步影響web服 務的運行。而且日誌文件如果不進行輪循也不變於日誌統計分析程序的運行,因為日誌統計分析都是以天為單位進行統計分析的,跨越很長時間日誌會使得日誌統計 分析程序運行特別慢。因此這裡就需要對web服務器日誌文件每天進行輪循。 四、web服務器日誌輪循 web服務器日誌輪循比較好的方式有三種:第一種方法是利用Linux系統自身的日誌文件輪循機制:logrotate;第二種方法 是利用apache自帶的日誌輪循程序rotatelogs;第三種是使用在apache的FAQ中推薦發展已經比較成熟的一個日誌輪循工具 cronolog。 對於大型的WEB服務來說,其往往使用實用負載均衡技術提高web站點服務能力,這樣後台有多個服務器提供WEB服務,這大大方便 了服務的分布規劃和擴展性,但多個服務器的分布就需要對日誌進行合併統一進行統計分析。因此為了保證統計的精確性就需要嚴格按照每天的時段來自動生成日誌 文件。 4.1 logrotate實現日誌輪循 首先我們討論採用Linux系統自身的日誌文件輪循機制:logrotate的方法。Logrotate是Linux系統自身帶的一 個日誌輪循程序,是專門對各種系統日誌(syslogd,mail)進行輪循的程序。該程序是由運行程序的服務crond來每天凌晨4:02運行的,可以 在/etc/cron.daily目錄下可以看到logrotate文件,其內容如下:
可以看到每天清晨crond都會啟動/etc/cron.daily目錄下的logrotate腳本來進行日誌輪循。 而在/etc/logrorate.conf中可以看到內容如下:
從logrotate的配置文件中可以看到除了wtmp以外,需要滾動的日誌的配置都保存在/etc/logroate.d目錄下。 因此我們只需要在該目錄下創建一個名為apache的配置文件,來指示logrotate如何輪循web服務器的日誌文件即可,下面是一個示例:
這裡「rotate 2」表示輪循時只包括兩個備份文件,也就是只有:access_log、access_log.1、access_log.2三個日誌備份文件。就這樣就 實現了對兩個虛擬主機的日誌文件的輪循。後面我們會討論如何使用日誌統計分析軟件對日誌文件進行處理。 這種方法的優點是不需要其他第三方工具就可以實現日誌輪循,但是對於重負載的服務器和使用負載均衡技術的web服務器來說這種方法就不是很實用。因為它是對相應服務進程發出一個-HUP重啟命令來實現日誌的截斷歸檔的,這樣會影響服務的連續性。 4.2 使用apache自帶的rotatelogs實現日誌輪循 apache提供了將不把日誌直接寫入文件,而是通過管道發送給另外一個程序的能力,這樣就大大的加強了對日誌進行處理的能力,這個 通過管道得到的程序可以是任何程序:如日誌分析,壓縮日誌等。要實現將日誌寫到管道只需要將配置中日誌文件部分的內容替換為「|程序名「即可,例如:
這樣就可以實用apache自帶的輪循工具:rotatelogs來對日誌文件進行輪循。rotatelogs基本是用來按時間或按大小控制日誌的。
上面的示例中apache訪問日誌被發送給程序rotatelogs,rotatelogs將日誌寫入 /www/logs/secfocus/access_log,並每隔86400秒(一天)對日誌進行一次輪循。輪循以後的文件名為 /www/logs/secfocus/access_log.nnnn,這裡nnn是開始記錄日誌的時間。因此為了將日誌按天對齊就需要在凌晨00: 00啟動服務,使得每天輪循得到的日誌剛好是完整一天的日誌,以提供給訪問統計分析程序進行處理。如果是00:00開始生成新的日誌,那麼輪循得到的日誌 就是access_log.0000。 4.3 使用cronolog實現日誌輪循 首先需要下載和安裝cronolog,可以到http://www.cronolog.org下載最新版本的cronolog。下載完畢以後,解壓安裝即可,方法如下所示:
這就完成了cronolog的配置和安裝,默認情況下cronolog是安裝在/usr/local/sbin下。 修改apache日誌配置命令如下所示:
這裡%w表示按照日期星期幾在不同的目錄下保存日誌,這種方式會保存一週的日誌。為了進行日誌分析,需要每天將該日誌文件拷貝(或移動,如果不希望保存一週的日誌)到一個固定的位置以方便日誌分析統計文件進行處理,實用crontab –e,如下添加定時任務:
這樣再使用日誌統計分析程序的對文件access_log_yesterday進行處理。 對於使用負載均衡技術的大型站點,就存在多個服務器的訪問日誌的合併處理問題.對於這種情況,各個服務器定義或移動日誌文件時就不能 使用access_log_yesterday了,就應該帶上服務器編號了,例如服務器IP地址等信息以區分。然後在各個服務器上運行網站鏡像和備份服務 rsyncd(參考文章」 用rsync實現網站鏡像和備份」,ttp: //www.linuxaid.com.cn/engineer/ideal/article/rsync.htm),然後將每個服務器每天的安裝配置文 件通過rsync下載到專門進行訪問統計分析的服務器上進行合併。 合併多個服務器的日誌文件,例如:log1 log2 log3並輸出到log_all中的方法是:
五、日誌統計分析程序webalizer的安裝和配置 webalizer是一個高效的、免費的web服務器日誌分析程序。其分析結果是HTML文件格式,從而可以很方便的通過web服務器進行瀏覽。Internet上的很多站點都使用webalizer進行web服務器日誌分析。Webalizer具有以下一些特性: 1、是用C寫的程序,所以其具有很高的運行效率。在主頻為200Mhz的機器上,webalizer每秒鐘可以分析10000條記錄,所以分析一個40M大小的日誌文件只需要15秒。 2、webalizer支持標準的一般日誌文件格式(Common Logfile Format);除此之外,也支持幾種組合日誌格式(Combined Logfile Format)的變種,從而可以統計客戶情況以及客戶操作系統類型。並且現在webalizer已經可以支持wu-ftpd xferlog日誌格式以及squid日誌文件格式了。 3、支持命令行配置以及配置文件。 4、可以支持多種語言,也可以自己進行本地化工作。 5、支持多種平台,比如UNIX、linux、NT, OS/2 和 MacOS等。 上圖是webalizer生成的訪問統計分析報表第一頁的內容,這裡包含每個月的平均訪問量的表格和條形圖統計分析情況。點擊每個月分,可以得到這個月每天的詳細統計信息。 5.1 安裝 在安裝以前首先需要確保系統已經安裝有gd庫,可以使用:
來確認系統已經安裝有gd-deve和gd兩個rpm包。 安裝webalizer有兩種方式,一種是下載源代碼來安裝,一種是直接使用rpm包來安裝。 使用rpm包方式安裝非常簡單,從rpmfind.net找到webalizer包,下載以後:
即可實現安裝。 對於源代碼方式首先需要從http://www.mrunix.net/webalizer/下載,然後安裝,首先解開源代碼包:
在生成的目錄中有個lang目錄,該目錄中保存了各種語言文件,但是只有繁體中文版本,可以自己轉換成簡體,或者自己重新翻譯一下。然後進入生成的目錄:
編譯成功後,會在/usr/local/bin/目錄下安裝一個webalizer可執行文件。 5.2 配置和運行 對webalizer運行的控制可以通過配置文件或者在命令行指定參數的兩種方式進行。而使用配置文件方式是比較簡單和靈活的,適用於自動web服務器日誌統計分析的應用環境。 webalizer的默認配置文件為/etc/webalizer.conf,當啟動Webalizer時沒有使用「-f「選項時, Webalizer就會尋找文件/etc/webalizer.conf,也可以使用「-f」來指定配置文件(當服務器有虛擬主機時,就需要配置多份不同 的webalizer配置文件,不同的虛擬主機的webalizer使用不同的配置文件。Webalizer.conf配置文件中需要修改的配置選項如 下:
用來指示配置文件的路徑信息,webalizer會將該日誌文件作為輸入進行統計分析;
用來指示生成的統計報表的保存目錄,在前面我們使用alias,使得用戶可以使用http://www.secfocus.com/usage/來訪問統計報表。
用來指示主機名,統計報表中會引用該主機名。 其他選項就無需修改,配置文件修改完畢以後,就需要在定時webalizer,每天生成當日的統計分析。 以root身份運行:crontab –e 進入定時運行任務編輯狀態,加入如下任務:
我們這裡假設系統運行有兩個虛擬主機,並分別定義了日誌分析配置文件secfocus.webalizer.conf和 tomorrowtel.webalizer.conf。這樣我們定義在凌晨00:05對secfocus的日誌進行統計分析;在凌晨00:15對 tomorrowtel的日誌進行統計分析。 然後第二天分別使用http://www.secfocus.com/usage/和http://www.tomorrowtel.com/usage來察看各自的日誌分析報表。 六、保護日誌統計分析報告不被未授權用戶訪問 我們肯定不會希望自己網站訪問統計信息隨意被別人瀏覽,因此需要將usage目錄保護起來,只允許合法用戶訪問。這裡可以採用apache自帶的基本的認證機制,配置以後再連接這個地址就會需要用戶提供密碼才能訪問該頁面: 1、條件 在配置文件中對目錄"/"應該設置為:
2、需求 需求:限制對http://www.secfocus.com/usage/的訪問,要求用戶認證才能訪問。這裡設置用戶為"admin",口令為"12345678"。 3、使用htpasswd建立用戶文件 htpasswd -c /www/.htpasswd admin 此程序會詢問用戶"admin"的口令,你輸入"12345678",兩次生效。 4、建立.htaccess文件 用vi在/www/logs/secfocus/usage/目錄下建立一個文件.htaccess,寫入以下幾行:
5、測試 這時候通過瀏覽器訪問http://www.secfocus.com/usage就會彈出框請求輸入用戶名和口令,這時候輸入admin、12345678就可以才可以訪問訪問日誌統計分析報表。 |