利用 MRTG 監控 Nginx 的運行狀態

本文只對Linux系統。別看本文長,其實就那麼幾步,5個手指頭都不夠。只是我把原理說清楚了,大家日後好再幹點厲害的。
之前成功把 NginxStatus  的 connections  數據在 Cacti 中生成曲線。
但Cacti 的運行要依靠的東西比較太多了,環境不好配是首要,再就要要跑多個PHP動態應用這對於許多站長都只有單臺服務器來說可真費勁。
MRTG 因爲已經延用已久,圍繞它的插件也好多。把原本單一就是網卡流量監控擴展到有 CPU,內存,硬盤空間,Apache Http connections........
但不知是不是選擇多,用的人少了,彷彿 MRTG 的更新已經停止了許久,連同圍繞着它的插件也一塊停着。很多新出的軟件,都未能被其納入“法眼”。 Nginx 就是一個例子。
好久之前已經有作者爲 MRTG 量身訂造了一個監控 Apache HTTP 併發數的小插件。這插件是通過獲取系統中80端口的訪問數來得出總的併發數,是一個小小的Perl程序。
新手或者還沒弄明白,曾經爲 MRTG 添加了 Apache 併發數曲線圖的哥們就肯定是有印象。
首先,安裝好 MRTG後,在其 *.cfg 配置文件中加入
Target[apache_conn]: `/opt/mrtg/mrtg.http`
Options[apache_conn]: gauge,nopercent,growright
Directory[apache_conn]: apache_conn
MaxBytes[apache_conn]: 4000
YLegend[apache_conn]: apache_conn
ShortLegend[apache_conn]:
LegendI[apache_conn]: apache all coonn:
LegendO[apache_conn]: apache now conn
Title[apache_conn]: apache conn
PageTop[apache_conn]:http conn

然後把以下perl代碼創建爲 mrtg.http 存於 mrtg 根目錄中並賜予可執行權限(chmod +x mrtg.http)
#!/usr/bin/perl
$hostname=`hostname`;
$hostname=~s/\s+$//;
$apache_all_conn=`netstat -an|grep 127.0.0.1:80|wc -l`;
$apache_conn=`netstat -an|grep 127.0.0.1|grep ESTABLISHED|wc -l`;  
$apache_all_conn=~s/\n$//;
$apache_conn=~s/\n$//;
$apache_all_conn=~s/^\s+|\s+$//;
$apache_conn=~s/^\s+|\s+$//;
$gettime=`uptime|awk '{print \$1" "\$3" "\$4}'`;
$gettime=~s/\,|\n$//g;
print("$apache_all_conn\n");
print("$apache_conn\n");
print("$gettime\n");
print("$hostname\n");
以上代碼就是一個負責獲取系統中80端口訪問數的perl小軟件,加入後MRTG就會爲其在HTML目錄底下生成一個 apache_conn 的目錄以及html跟統計圖表供瀏覽器訪問。最關鍵的是程序的第四跟第五行,用於獲取數值。
該方法同樣能用在 Nginx 上,因爲一樣都是80端口。
但該方法有個弊端,如果你有另外一個後端。例如 Nginx 反向代理 proxy 到後端 apache。 這時 apache 是 8080 端口的話 這麼數值就有重複了。
然而,就算你使用 8181 這樣的端口號來避開重複,也不是萬全之計。畢竟這不是Nginx 或者 apache 原生的併發數獲知方式。
Nginx 的 Status  狀態頁(編譯時加上--with-http_stub_status_module) 才能最準確得知當前併發數。
而 相對應 Apache 其實也有相類似的 狀態頁,是已mod 形式加載的,在本文就不多做介紹了。
Cacti 的做法,就是通過腳本,獲取到 NginxStatus 上 特定的數值轉化成生成圖表的數據。
而 MRTG,也行!!!之前網上找偏東南西北都沒有一篇寫這內容的,最後還是自己研究。今天我就要好好給大家分享分享!
就是基於修改上邊 獲取 appche 80端口併發數的perl小腳本。可原理不一樣!
我們需要像 Cacti 那樣,抓取到 NginxStatus 上特定的數值,然後給 MRTG 轉化成圖表。
怎麼抓呢? Curl 是一個不錯的選擇!!! 只需在本機命令行中運行 curlhttp://127.0.0.1/NginxStatus (前提是狀態頁已經配上並能通過瀏覽器訪問) 就能白字黑底地顯示出瀏覽器打開的相同內容:
Active connections: 54 
server accepts handled requests 
60085 60085 175930 
Reading: 0 Writing: 1 Waiting: 53

好了,內容中,不單有數據,還有解析。我們的構想是! 只要數據,不要解析。而且要的還只是指定的數據。
# curl http://127.0.0.1/NginxStatus | grep Active     這樣! 我們就能緊緊獲取到包含有 Active 字樣的內容:
Active connections: 54      
 
可還沒行!我們要純數值。
# curl http://127.0.0.1/NginxStatus |grep Active |awk '{print $3 }'    這樣!我們就能緊緊獲取到內容中第三列的內容。即純數值 :54
好了!這下就成功了一半!!生下來,我們必須把獲取到的數值輸入 MRTG中。於是:
curl http://127.0.0.1/NginxStatus |grep Active |awk '{print $3 }'  > /opt/mrtg/ngx.active   把獲取到的數據值輸出到指定的文本,用於一會的導入,把這行命令保存爲 shell 腳本,一陣子讓MRTG調用。/opt/mrtg/ngx.active 是個文本文件,存放於服務器的mrtg根目錄。不同配置的朋友留意其路徑請自行修改。
因爲 NginxStatus 中最爲人關心的狀態有2個,Active connections 跟 Waiting 。恰和能對上 MRTG 與生俱來 I/O 的2條曲線。
於是乎,我們的 shell 腳本就有2行:
curl http://127.0.0.1/NginxStatus |grep Active |awk '{print $3 }'  > /opt/mrtg/ngx.active
curl http://127.0.0.1/NginxStatus |grep Waiting |awk '{print $6 }' > /opt/mrtg/ngx.waiting
保存爲 nginx_status 並賜予可執行權限(chmod+x nginx_status)
然後修改perl的小程序,當然你也能像我這樣,乾脆把原來的複製一份,重命名爲 mrtg.ngx 內容如下
#!/usr/bin/perl -w
`/opt/mrtg/nginx_status`;                                                 #調用剛纔的shell腳本從 NginxStatus 中獲取數值到文本。
$hostname=`hostname`;
$hostname=~s/\s+$//;
$apache_all_conn=`tail /opt/mrtg/ngx.active`;           #數值文本路徑按照不同配置自行修改
$apache_conn=`tail /opt/mrtg/ngx.waiting`;               #數值文本路徑按照不同配置自行修改
$apache_all_conn=~s/\n$//;
$apache_conn=~s/\n$//;
$apache_all_conn=~s/^\s+|\s+$//;
$apache_conn=~s/^\s+|\s+$//;
$gettime=`uptime|awk '{print \$1" "\$3" "\$4}'`;
$gettime=~s/\,|\n$//g;
print("$apache_all_conn\n");
print("$apache_conn\n");
print("$gettime\n");
print("$hostname\n");
然後修改 *.cfg 的配置,找到原來 apache_conn 修改路徑以及各項名稱,改好如下:
Target[apache_conn]: `/opt/mrtg/mrtg.ngx`                    # perl 小程序的路徑
Options[apache_conn]: gauge,nopercent,growright
Directory[apache_conn]: nginx_conn                               # 生成網頁的目錄
MaxBytes[apache_conn]: 4000
YLegend[apache_conn]: nginx_conn                                  # 圖表中的名字
ShortLegend[apache_conn]:
LegendI[apache_conn]: Active connections:                     # 圖表中綠色曲線所代表的參數
LegendO[apache_conn]: Waiting:                                       # 圖表中藍色曲線所代表的參數
Title[apache_conn]:  Nginx                                                   # 圖表的擡頭名稱
PageTop[apache_conn]:nginx                                             # 圖表的頁面名稱

                         

等 5 分鐘後,MRTG 就能在 html 目錄下生成頁面以及圖表, 可以在瀏覽器中http://127.0.0.1/mrtg/apache_conn.html 訪問
至此,MRTG 爲 Nginx (NginxStatus) 生成圖表的配置大功告成!!
 
  Max Average Current
Active connections: 188.0 B/s 51.0 B/s 132.0 B/s
Waiting: 186.0 B/s 46.0 B/s 130.0 B/s
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章