1、前言
實作完 Apache mod_cband 流量限制 功能後雖然可以即時看到流量,但也希望為流量留下歷史記錄,因此安裝文字模式網頁瀏覽器 lynx 去抓取 cband-status 成果網頁中 Limit 及 Current 的流量數值來畫出 MRTG 圖,在開始玩本次實作以前請先確定您的 MRTG 已安裝並正確定設定。文章目錄
1、前言2、實作環境
3、安裝及設定
步驟1.安裝 lynx 套件
步驟2.建立 MRTG 設定檔 weithenn.cfg
步驟3.產生檔案
步驟4.寫入排程
4、補充:如何快速分析 MRTG Log
5、參考
6、Me FAQ
Q1.ERROR: Targetefg_IN_ ' $target->0{$mode} ' did not eval into defined data?
2、實作環境
- FreeBSD 7.2-RELEASE-p3
- mrtg-2.16.2_1,1
- lynx-2.8.6.5_5,1
3、安裝及設定
有關於如何設定 Apache mod_cband 請參考站內文章 Apache mod_cband 頻寬限制。步驟 1. 安裝 lynx 套件
安裝文字模式網頁瀏覽器 lynx 已便屆時可順利抓取需要的欄位值。# cd /usr/ports/www/lynx //切換至安裝路徑
# make install clean //安裝套件並清除暫存檔案
以 lynx 文字模式網頁瀏覽器,測試抓取 Limit 及 Current 欄位值,環境說明如下:
- -dump:抓取指定 URL 頁面資料
- -nolist:不要 URL (以利抓取相關資料)
- -width=150:指定寬度 (因為預設寬度為 80 會使抓取的 cband-status 欄位數值拆成二列不利抓取相關數值)
- cband-status URL: http://www.weithenn.org/cband-status
- VirtualHost: http://www.weithenn.org
將 cband-status 網頁資料 Dump 出來後再利用 grep 及 cut 指定來過濾出我們要抓取目前流量中的 Limit、Current 欄位值,如下為抓取 Limit 數值
# lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f1
建立 jiakai.sh 內容就是抓取目前流量中 Limit、Current 欄位值 (編輯完後記得權限要設為 755 哦)
# vi /usr/local/etc/mrtg/weithenn.sh
#!/bin/sh
CURRENT=`/usr/local/bin/lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f2`
LIMIT=`/usr/local/bin/lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f1`
echo $CURRENT
echo $LIMIT
echo '0'
echo '0'
步驟 2. 建立 MRTG 設定檔 weithenn.cfg
抓取 Limit、Current 欄位值後便利用 MRTG 把抓取的數值畫出圖來了,MRTG 設定檔 weithenn.cfg 內容如下:Targetapache: `/usr/local/etc/mrtg/weithenn.sh` //抓取 Limit、Current 欄位值
Optionsapache: growright,gauge //流量圖由右向左、 數值不累加
Titleapache: Bandwidth Traffic Status -- www.weithenn.org //網頁的 title
PageTopapache: <H1>Bandwidth Traffic Status -- www.weithenn.org</H1> //網頁標題
MaxBytesapache: 1024 //流量圖表的最大值
YLegendapache: Limit(1024 kbps) //流量圖的 Y 軸顯示名稱
ShortLegendapache: kbps //流量圖數值說明文字 (單位)
LegendIapache: Current //流量圖表中顯示的綠色字體
LegendOapache: Limit //每個流量圖表中顯示的藍色字體
Legend1apache: Current Bandwidth //綠色字體說明文字 (最下面)
Legend2apache: Limit Bandwidth //藍色字體說明文字 (最下面)
WorkDir:/home/web/mrtg //指定存放流量圖檔的路徑
Language:big5 //使用語系
步驟 3. 產生檔案
產生檔案,下列指令執行 2 ~ 3 次到沒錯誤訊息後就代表完成了,因為我的環境為 zh_TW.UTF-8 所以必須加上 env LANG=C 才可順利執行,並於執行後將結果寫入 mrtg.log 中。# env LANG=C /usr/local/bin/mrtg /usr/local/etc/mrtg/weithenn.cfg --logging /var/log/mrtg.log
步驟 4. 寫入排程
將如下指令寫入排程內以便達成自動產生流量圖表 (每五分鐘執行一次)。# crontab -e
*/5 * * * * `env LANG=C /usr/local/bin/mrtg /usr/local/etc/mrtg/weithenn.cfg --logging /var/log/mrtg.log`
4、補充:如何快速分析 MRTG Log
當執行 MRTG Log 後會產生執行後的記錄檔,其實也是用這個記錄檔來比較前後的量並畫出流量圖的,若您想直接把數據做成報告可利用如下指令快速達成,MRTG Log 總共五個欄位:- 時間 TimeStamp: 以秒數表達從 1970 年 1 月 1日 GMT 開始計算。
- 流入 Incoming: 流入平均值,單位為 bytes per second (Bps)。
- 流出 Outgoing: 流出平均值,單位為 bytes per second (Bps)。
- 流入 Incoming Maximum: 流入平均值統計中最大值,單位為 bytes per second (Bps)。
- 流出 Outgoing Maximum: 流出平均值統計中最大值,單位為 bytes per second (Bps)。
了解各欄位值後比較麻煩的大概就只有時間 TimeStamp 的部份而以,我們可以利用如下 Perl 指令來將 TimeStamp 轉換成 Localtime,若 MRTG Log 名稱為 weithenn.log 如下指令即可轉換欄位一 TimeStamp 為 Localtime。
# perl -p -e 's/^\d+/localtime $&/e' < weithenn.log
Wed Sep 9 14:40:03 2009 6557273 5389256 6557273 5389256
Wed Sep 9 14:35:04 2009 7343261 5728073 7343261 5728073
Wed Sep 9 14:35:00 2009 7343199 5729406 7343261 5808085
Wed Sep 9 14:30:00 2009 7350242 5810427 8140328 5983772
Wed Sep 9 14:25:00 2009 8139665 5984683 8140328 6052102
...略...
5、參考
6、Me FAQ
Q1.ERROR: Targetefg_IN_ ' $target->0{$mode} ' did not eval into defined data?
Error Message:建立 jiakai.sh 內容就是抓取目前流量中 Limit、Current 欄位值的 weithenn.sh 直接執行可以正確抓到流量數值,但透過 crontab 執行後無法畫出正確的流量圖,且查看 /var/log/mrtg.log 出現如下錯誤訊息說 MRTG 抓不到我們給的 IN、OUT 數值?
# tail /var/log/mrtg.log
2009-09-09 11:10:00: WARNING: Problem with External get '/usr/local/etc/mrtg/weithenn.sh': Expected a Number for 'in' but got ''
2009-09-09 11:10:00: WARNING: Problem with External get '/usr/local/etc/mrtg/weithenn.sh': Expected a Number for 'out' but got ''
2009-09-09 11:10:00: ERROR: Targetefg_IN_ ' $target->0{$mode} ' did not eval into defined data
2009-09-09 11:10:00: ERROR: Targetefg_OUT_ ' $target->0{$mode} ' did not eval into defined data
Answer:
原因在於 lynx 指令沒有採用絕對路徑且 weithenn.sh 內也沒有指定 PATH,因為 weithenn.sh 是用 sh shell 而預設載入的 PATH 只有 /usr/bin 及 /bin 而以,但 lynx 指令路徑在 /usr/local/bin/lynx 所以就造成直接執行該 script 可以抓到數值 (因為預設會把 /usr/local/bin 載入至 PATH) 但透過 crontab 時會無法載入,就造成上述的錯誤訊息了。解決方式請將 weithenn.sh 的 lynx 指令改為絕對路徑或宣告路徑。
將 lynx 指令改為絕對路徑
# cat /usr/local/etc/mrtg/weithenn.sh
#!/bin/sh
CURRENT=`/usr/local/bin/lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f2`
LIMIT=`/usr/local/bin/lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f1`
echo $CURRENT
echo $LIMIT
echo '0'
echo '0'
在 sh shell 中宣告 PATH
# cat /usr/local/etc/mrtg/weithenn.sh
#!/bin/sh
export PATH=/usr/bin:/bin:/usr/local/bin
CURRENT=`lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f2`
LIMIT=`lynx -dump -nolist -width=150 'http://www.weithenn.org/cband-status' | grep 'www.weithenn.org' | cut -d" " -f11 | cut -d/ -f1`
echo $CURRENT
echo $LIMIT
echo '0'
echo '0'