最近版本发布比较多,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无私的帮助,在此对他表示真心的敬意)
好了,问题解决了 实验也做到这里,希望这篇文章能对大家有所帮助 ^_^