Nagios中文顯示問題的解決方案

來源:互聯網
上載者:User

Nagios的Status Map功能連結能夠顯示被監控的網路拓撲圖,並在節點圖片上面顯示節點裝置名稱。遺憾的是,預設的Nagios不支援中文。為此我研究了兩天Nagios以及GD的原始碼,終於找到瞭解決方案,詳述如下:

解壓縮Nagios中文原始碼包以nagios-3.0.3為例),實現繪製網路拓撲圖的原始碼檔案是nagios-3.0.3/cgi/statusmap.c,編譯安裝後,這個檔案對應nagios/sbin/statusmap.cgi,當你在Nagios中文運行介面點擊左側的“Status Map”連結時,伺服器apache、tomcat等支援CGI的伺服器軟體)調用可執行檔statusmap.cgi,實現在瀏覽器客戶區中繪製網路拓撲圖。

statusmap.c中負責繪製節點裝置名稱的函數是void draw_text(char *buffer,int x,int y,int text_color),就在本檔案中定義,它調用GD的一個庫函數——
gdImageString(map_image,gdFontSmall,x-(string_width/2),y-(2*string_height),(unsigned char *)buffer,text_color);來繪製節點裝置名稱。

這裡先簡單介紹一下GD以及其他一些軟體與Nagios的關係。Nagios處理圖片包括繪製文字)需要藉助於GD,有些版本的Linux已經整合了GD,所以可以直接安裝使用Nagios。安裝GD以及相關的軟體包的順序如下版本僅為舉例):
gd:一個處理圖片包括繪製文字)的軟體包;
freetype:gd解析字型檔用到的軟體包;
libpng:gd解析png圖片用到的軟體包;
jpeg:gd解析jpeg圖片用到的軟體包。

安裝方法舉例:

安裝方法
安裝freetype
#cd /data/software
#tar xzvf freetype-2.1.5.tar.gz
#cd freetype-2.1.5
#./configure --prefix=/usr/local/modules/freetype
#make
#make install

安裝libpng
#cd /data/software
#tar xzvf libpng-1.2.5.tar.gz
#cd libpng-1.2.5
#cp scripts/makefile.std makefile \\不要用--prefix自訂安裝目錄,影響gd的安裝
#make
#make install

安裝jpeg
#mkdir /usr/local/modules/jpeg6
#mkdir /usr/local/modules/jpeg6/bin
#mkdir /usr/local/modules/jpeg6/lib
#mkdir /usr/local/modules/jpeg6/include
#mkdir /usr/local/modules/jpeg6/man
#mkdir /usr/local/modules/jpeg6/man/man1
#cd /data/software
#tar xzvf jpegsrc.v6b.tar.gz
#./configure --prefix=/usr/local/modules/jpeg6 --enable-shared --enable-static
#make
#make install

安裝gd
#cd /data/software
#tar xzvf gd-2.0.33.tar.gz
#./configure --prefix=/usr/local/modules/gd --with- jpeg=/usr/local/modules/jpeg6 --with-png --with-zlib --with-freetype=/usr/local/modules/freetype
#make
#make install

最後,在安裝nagios時#./configure步驟加一組參數:--with-gd-lib=/usr/local/modules/gd/lib

原始的Nagios中文版不能繪製中文字串,與GD的字型檔處理方式有關。GD有自己的字型檔檔案點陣形式、ASC碼編碼)。gdImageString的第二個參數即GD自己的字型檔的索引,第五個參數則是一個ASC編碼的字串。而GD自己的字型檔是不支援中文的。顯然,大名鼎鼎的GD不可能只支援自己的字型檔,他用函數gdImageStringFT來支援用外部字型檔繪製utf-8編碼的字串,這裡麵包含了中文的支援。

gdImageStringFT (gdImage * im, int *brect, int fg, char *fontlist,double ptsize, double angle, int x, int y, char *string),函數名中的“FT”就是freetype的意思,這個函數通過調用freetype包,支援解析.ttf格式ttf是TrueType Font的縮寫)的字型檔檔案,只要找到Linux下的中文字型檔的位置,作為第四個參數傳給該函數,並且保證char *string是utf-8編碼,就能順利繪製中文字串。在我的調試環境下,修改如下:
原函數:
gdImageString(map_image,gdFontSmall,x-(string_width/2),y-(2*string_height),(unsigned char *)buffer,text_color);
修改後:
gdImageStringFT(map_image,&brect[0],text_color,"/usr/share/fonts/zh_CN/TrueType/gbsn00lp.ttf",10,0.0,x-(string_width/2),y-(2*string_height),buffer);
gdImageString和gdImageStringFT詳細的功能和參數說明見GD安裝包下的說明文檔index.html)

由於Nagios是從設定檔中讀取裝置名稱字串然後繪製到螢幕上,所以如果設定檔本身是utf-8編碼,如上修改後,重裝Nagios就可以順利顯示了。如果設定檔不是utf-8,那麼可以通過兩種方法解決:

第一種:將設定檔轉成utf-8編碼。這樣不用再度修改源碼,但個人不贊成這種方法,理由是:由於Nagios的CGI是用C寫的,而C是基於ASC編碼的,Nagios又沒有藉助第三方資料庫,而是依賴於讀寫自己建立的大量設定檔和記錄檔,其中用到很多基於ASC編碼的字串處理函數,雖然都是英文的,而英文的ASC編碼和utf-8完全相同,但是如果將Nagios的相關檔案都轉成utf-8編碼,可能會導致一些潛在的問題。

第二種:在gdImageStringFT之前加一個字串編碼轉換函式,將讀入的非utf-8編碼字串buffer轉換成utf-8編碼,再傳給gdImageStringFT處理。這樣的字串編碼轉換函式網上有很多資源,在此限於篇幅不詳述。

  1. Nagios飛信linux下免費簡訊通知配置
  2. 網路管理關於Nagios配置痛點解析
  3. Linux系統的Nagios網路管理模組的實現
  4. 營運監控Nagios連載3:部署、配置Nagios服務
  5. 營運監控Nagios連載2:部署apache伺服器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.