︿
Top

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 總共五個欄位:
  1. 時間 TimeStamp: 以秒數表達從 1970 年 1 月 1日 GMT 開始計算。
  2. 流入 Incoming: 流入平均值,單位為 bytes per second (Bps)。
  3. 流出 Outgoing: 流出平均值,單位為 bytes per second (Bps)。
  4. 流入 Incoming Maximum: 流入平均值統計中最大值,單位為 bytes per second (Bps)。
  5. 流出 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'
文章標籤: