Apache MySQL 網站伺服器 資料庫 Log 日誌

自設Web管理介面提供分析呈現 用MySQL資料庫彙整Apache網站紀錄

2011-09-07
當系統發生異常時,管理員都會立即查看紀錄檔中的紀錄以查明事情發生的源由,但是系統紀錄檔往往都是文字檔,逐行檢視不但費力也可能耽誤時間。有鑑於此,本文利用mod_log_sql的Apache模組來實作,將Apache網站伺服器的網站紀錄集中儲存到遠端的資料庫主機內,並提供一個網頁介面程式,讓管理者能夠快速地利用網頁來管理相關的網站紀錄。
一個有經驗的系統管理者,在遇到系統異常的情況,相信第一個念頭通常就是去查看紀錄檔中的紀錄,看看到底發生什麼事。

系統紀錄檔往往可以透露出許多線索,甚至從中可擷取許多有價值的資訊。但是,一般紀錄檔通常是以文字檔的方式儲存,對於相關資料分析統計的應用總有力有未逮之憾。

況且,紀錄以文字檔案的方式儲存,常容易被修改,甚至於刪除。如果能有一個機制,能將紀錄檔儲存在遠端的資料庫中,不但便於紀錄檔資訊的分析與統計,也可實現紀錄檔中央控管的機制,讓紀錄保存更加地妥善。

本文將以Apache網站伺服器來作為例子,利用mod_log_sql的Apache模組,把Apache網站伺服器的網站紀錄集中儲存到遠端的資料庫主機當中,並且提供網頁介面程式,讓管理者能夠更便利地利用網頁來管理相關的網站紀錄,而本解決方案所需要的套件如下表所示。

以MySQL資料庫彙整Apache網站紀錄所需套件

細說Apache網站紀錄

身為一個網站管理者除了維護網站的正常運作外,相信事後的營運分析也是相當重要的工作,例如查詢那些使用者曾存取網站,或者使用者存取過網站那些網頁,而相關的資訊均可從Apache伺服器的網站紀錄中取得。

在實務上,一般均是藉由網站紀錄分析程式,如有名的AWStatus網站分析程式等等,從相關的網站紀錄中解析出有意義的營運資訊。而這需要一個固定格式的紀錄,才可能解析相關的紀錄。在過去網站紀錄格式統一之前,各家網站伺服器廠商可能使用個各自的網站紀錄格式,例如IIS採用獨家的網站紀錄格式,而Apache也採用自己的網站紀錄格式。

在這種情況下,程式設計師必須根據各廠商的網站紀錄格式來撰寫相關的程式,而無法僅用單一分析程式來解析各個網站伺服器所產生的網站紀錄。為因應此種情況,而有共同紀錄格式(Common Log Format,CLF)的規格提出,其實Apache網站紀錄即預設使用CLF格式。有了CLF,各種不同的網站伺服器即可產生相同格式的紀錄。

這使得網站紀錄分析程式能夠正常地分析相關的網站紀錄資訊,而不會因為網站伺服器的差異而造成不相容的困擾。共同紀錄格式的檔案內容如下所述(如該欄無資訊,即以-來代替):

host ident authuser date request status bytes

host:記錄客戶端的IP或主機位置。
ident:在允許執行indentityCHECK指令且客戶端機器執行identd的情況下,此欄位會記錄客戶端報告的身分資訊。
authuser:如果HTTP的請求需要基礎的HTTP認證,此欄位內容即為用戶名稱。 date:HTTP請求的日期與時間。
request:客戶端所發出的HTTP請求,此欄位會以雙引號括起來。
status:此欄位儲存的是HTTP的狀態碼,例如404表示無法找到網頁。
bytes:網站伺服器傳回給客戶端的位元組數。

Apache網站伺服器就是利用mod_log_config模組來記錄相關的網站紀錄。此模組為Apache預設安裝的模組,讀者不必再自行建立。mod_log_config模組提供下表所列的各種指令來記錄網站紀錄。

mod_log_config模組記錄網站紀錄時所使用指令

接下來,繼續說明httpd.conf中有關於網站紀錄的設定,如下表所示:

httpd.conf中網站紀錄相關設定

網站紀錄分析

當網站上線之後,相關的網站紀錄會不斷地增長,此時就需要相關的分析程式來分析網站紀錄,以擷取相關的資訊顯示。

其實,網站紀錄本身就是一個符合格式(如前文所提到的CLF格式)的文字檔。如果只是想快速地找尋簡單的資訊如來訪的IP,可利用如下列的指令:

此指令會將access_log檔案送往awk程式執行,而print $1即是顯示每列的第一個欄位資訊(在CLF格式定義中,第一個欄位就是表示來訪的IP資訊),因此這個指令會將所有來訪的IP資訊顯示出來。

當然,此種顯示方法無法得到上司的歡心,因為他們總是喜歡觀看漂漂亮亮的圖表與數據。在開源碼社群中其實有不少的網站紀錄分析程式可供選擇。讀者可自行研究下表中的網站紀錄分析程式,從中挑選一個最適合的程式。

開源碼的網站紀錄分析程式

另外,對一個大流量的網站而言,網站紀錄檔會增長很快,通常每日以G為單位來增長,因此可能一不小心就會將硬碟塞爆。

所以,當網站紀錄檔過度龐大時,就需要好好瘦身一下,而Apache預設使用的瘦身工具是rotatelog程式。

網站紀錄維護

rotatelogs程式是Apache網站伺服器預設的維護網站紀錄的程式,主要用來設定固定時間即產生網站紀錄檔,或者當網站紀錄檔成長到預設的大小時再產生網站紀錄檔。其使用方法說明如下:

首先,說明在每個固定時間產生一個網站紀錄檔的方式。先在httpd.conf的設定檔中加入以下的設定:

此行設定表示,每隔86,400秒(即一天)重新產生一個檔案(所使用的紀錄格式即為common,亦即CLF格式),檔名類似access_log.1211414400的格式。但上述的檔名在使用上很不直覺。

Apache2.0之後的版本所提供的rotatelog,開始提供相關的時間參數,讓所產生的網站紀錄檔能夠擁有如同access_log.2009-01-01格式的檔名。相關的常用參數符號如下表所示。

常用參數符號

接著,說明當網站紀錄檔成長到預設的大小時,再產生一個網站紀錄檔的方式。

也就是,在httpd.conf設定檔中加入下述的設定。該行設定的作用是,每當網站紀錄檔成長到5M時再產生一個網站紀錄檔。

安裝mod_log_sql模組

mod_log_sql是Apache網站伺服器的一個模組,主要功能在於將Apache所產生的網站紀錄資料寫入到後端資料庫內,目前僅支援MySQL資料庫。接著,說明如何安裝mod_log_sql。

在安裝mod_log_sq模組之前,必須確認系統上是否已安裝MySQL資料庫,而且根據官方網站的說明,MySQL版本必須高於3.23.15。

這裡將以DSO(Dynamic Shared Object)的方式來編譯mod_log_sql模組,以下先簡單說明Apache伺服器的DSO機制。

Apache網站伺服器是一種高度模組化的系統,除了在編譯階段時期可靜態地將所需要的模組編譯進去,更可以在執行的階段中動態掛載所需的模組以擴充Apache伺服器相關的功能(例如mod_SSL、mod_security等等模組,或者利用在httpd.conf設定檔內加入LoadModule來動態載入相關模組),此種動態掛載的機制即是利用DSO機制完成。

若想使用DSO機制,必須在編譯Apache的時候加上--enable-so參數,亦即掛載mod_so模組,並在編譯階段即將mod_so模組掛載進來。

可利用「httpd -l」指令來檢查是否有支援DSO機制,如果出現mod_so.c等字句,即表示有支援DSO機制。

Apache並提供apxs(APache eXtenSion)程式來編譯Apache動態模組,以提供給Apache伺服器動態載入相關模組。接下來,繼續安裝mod_log_sql模組。

至下列網址「http://www.outoforder.cc/downloads/mod_log_sql/mod_log_sql-1.101.tar.bz2」取得最新的安裝版本(筆者取得的版本為1.101)。

解壓縮後,可至contrib目錄下,取得欲建立的資料庫表格資訊,該檔名為「create_tables.sql」。在此建立資料庫的名稱為「logdb」,並將create_tables.sql檔案內的相關表格建立在此資料庫中。

接下來,即利用apxs程式建立mod_log_sql模組,執行如下指令:

在編譯成功後,應該就可以在「在/usr/local/apache2/modules/」目錄內發現mod_log_sql*等檔案。因為此處的Apache伺服器安裝在「/usr/local/apache2/」目錄下,所以模組會置於「/usr/local/apache2/modules/」目錄下。接著,說明mod_log_sql所提供的相關組態,如下表所示:

mod_log_sql所提供的相關組態

LogSQLTransferLogFormat設定紀錄的格式資訊

在了解mod_log_sql所提供的相關組態後,接下來繼續設定Apache組態檔(httpd.conf),以支援mod_log_sql功能。首先,在httpd.conf檔案內加入如下的設定:

然後,設定VirtualHost區間。

至此,已將相關組態設定完成。重新啟動網站伺服器後,利用網頁瀏覽器瀏覽該網站,應會發現已經將相關access_log檔案內的紀錄儲存至資料庫中,可是對管理者而言,如果能有一個方便的管理介面,而且最好是Web介面,拿來查看相關的網站紀錄資訊就理想了。

幸運的是,在開源碼社群中就有一個Skeith專案是專門用來管理mod_log_sql的Web管理介面,它有點像AWStatus軟體的PHP程式,可根據日期即時統計出瀏覽人次、相關瀏覽網頁等資訊。

先行至Skeith官方網站「http://sourceforge.net/projects/skeith/」取得最新版本。建議使用2.02的穩定版本,而不要用最新的beta版本。

在此不多談如何編譯Apache網站伺服器,假設讀者已建立好Apache伺服器,並已經具備支援PHP、MySQL等相關功能。

下載Skeith軟體後,直接解壓縮並將相關程式置於網站根目錄中,然後修改config.php設定檔內的相關組態資訊,相關組態說明如下:

$skeith_Config['start_year']:設定Log紀錄最早的起始紀錄。預設為2008,即表示顯示2008年以來的Log紀錄。
$skeith_Config['db_host']:設定資料庫主機所在的位址。
$skeith_Config['db_port']:設定資料庫主機所使用的埠資料,預設為3306。
$skeith_Config['db_user']:設定資料庫使用者資訊。
$skeith_Config['db_passwd']:設定資料庫密碼資訊。
$skeith_Config['db_name']:設定所使用的資料庫名稱。
$skeith_Config['tbl_name']:設定所使用的資料庫表格名稱。
$skeith_Config['geoip']:設定使用地理資訊,可直接判別來訪者的國別,而使用此功能,須另外下載geo資料庫並安裝geoip套件,詳細安裝可參考README檔。
$skeith_Config['http_code_section']:設定是否記錄HTTP的狀態碼資訊。
$skeith_Config['browser_section']:設定是否記錄瀏覽器的相關資訊。

設定完成後,開啟瀏覽器瀏覽,即可看到如下所示的畫面。

至此,一個以資料庫儲存Apache網站伺服器之網站紀錄並利用網頁介面管理網站紀錄的管理系統,已經建立完成。

結語

在mod_log_sql模組的討論中,曾經有人質疑利用資料庫來儲存網站紀錄是否會造成網站伺服器效能的下降。但是,將網站紀錄存入檔案所需的系統資源遠低於用資料庫來存網站紀錄。如果網站的流量不高,或許兩者差異不大,但以一個大流量的網站伺服器來說,即可能造成系統因大量的消耗資源而降低效能。

而另一派人士認為,以目前的硬體能力而言,要應付資料庫所需的額外負擔是綽綽有餘,這或許是mod_log_sql模組會持續發展的原因吧!以筆者為例,目前將此模組外掛在對外服務的網站伺服器上,對網站伺服器的效能似乎沒有多大的影響,但這也可能是筆者的網站來訪人數很少的緣故。

不過,將網站紀錄儲存在資料庫中,除了方便於管理外,從資訊安全的角度來看,還可從中挖掘出不少寶貴的資訊。例如,當有人以類似網站弱點掃描軟體進行掃描時,就會在網站紀錄中留下相關特徵的資訊。在過去,以文字檔儲存的方式較難挖掘出相關資訊,若改以資料庫的方式來儲存,即可輕易地取出相關紀錄。

另外,就拒絕服務攻擊(DoS)角度而言,通常短時間內大量不正常的封包即可判定為攻擊。而短時間內大量不正常的HTTP存取,如5分鐘內發生大量的404(網頁找不到)錯誤,通常是Web攻擊程式所造成的現像,即可判別為Web的攻擊事件。這在以利用文字檔儲存的網站紀錄中,很難直接解析相關的事件,但若將網站紀錄儲存在資料庫內,即可輕易地以SQL指令分析出相關的紀錄。


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!