最近版本釋出比較多,nginx的vhost變動也很頻繁,上週增加了幾個vhost。結果昨天負責監控同事過來跟我說 cacti 的Nginx Clients Stat 模板沒有資料了,
nagios的check_nginx 也一直報警。我的第一反應是nginx是不是出問題了,可是最近網站一直都很正常啊,於是到cacti頁面上看了一眼,所有web伺服器除了Nginx Clients Stat以外的所有服務資料都很正常,可以排除snmp的問題了。通過網頁訪問了一下 http://www.xman.com/nginx_status(域名純屬虛構),發現可以正常訪問,這是怎麼回事呢?
   問題是上週最後一次更新後出現的,那次更新在所有vhost的最上面增加了一個vhost,會不會是這個vhost的問題呢?不過我通過其中一個vhost的域名訪問 nginx_status 是正常的啊!
   抱著試試的心態檢視了一下 這個新加的vhost配置檔案,ufo.conf ,裡面並沒有設定 nginx_status 我忽然明白了,如果有多個vhost 的情況下,第一個vhost裡面如果沒有開啟nginx_status
則直接通過ip地址去訪問網頁的時候就會直接去訪問第一個vhost,而新加入的vhost裡面沒有開啟nginx_status ,結果就被404了。而cacti和nagios卻恰恰是通過內網地址去訪問nginx_status 的
  結果就是我的同事說的那樣,cacti不出圖,nagios抓不到資料。而我剛開始檢查的時候是通過vhost的域名來訪問nginx_status 的,所以沒有出現問題!
    為了證明我的想法我特意做了個實驗,隨意弄了4個vhost,前三個個不開nginx_status,最後一個開啟nginx_status,通過域名來訪問nginx_status,結果證明了我的猜測,後來我又
進行了幾個測試,糾正了我之前認識上的一個錯誤,我之前認為 如果哪個vhost開啟了nginx_status ,我訪問vhost域名的nginx_status時候就能得到這個域名的nginx連線狀態,後來通過
實驗才知道原來不管你哪個vhost開啟了nginx_status 訪問他得到的值是整個nginx的狀態,而不是某個vhost的連線狀態。nginx wiki上面是這樣描述nginx_status的

This module provides the ability to get some status from nginx.

This module is not compiled by default and must be specified using the

–with-http_stub_status_module

  人家都說了是 get some status from nginx,而不是from nginx vhost,呵呵
問題找到了,那就動手解決吧!其實很簡單,在新加入的那個vhost裡面把 nginx_status 開啟就行了,問題很快就解決了。不過我又看了下nagios的check_nginx 指令碼。原來check_nginx
指令碼是通過 wget 來得到nginx_status 狀態的啊,裡面是這樣寫的
wget_opts=”-O- -q -t 3 -T 3 –no-check-certificate”
        out1=`wget ${wget_opts} http://${hostname}:${port}/${status_page}`

        原來如此,不過遇到我碰上的那個問題這樣肯定就不行了,於是做了下修改
        curl_opts=”Host:www.ufo.com”
        out1=`curl -H${curl_opts} http://${hostname}:${port}/${status_page} -s`

給curl的請求加一個頭,這樣就可以在訪問ip地址的時候直接去請求開啟nginx_status 的vhost了 (這裡我非常感謝我的朋友hunter無私的幫助,在此對他表示真心的敬意)
好了,問題解決了 實驗也做到這裡,希望這篇文章能對大家有所幫助 ^_^