nginx添加nginx-module-vts模块

nginx-module-vts模块主要用来监控nginx的一些流量信息

vts: vhost_traffic_status(主机运行状态)

本例子中,假定 nginx 已经安装完成(编译安装),现在需要新增vts模块 ,可先通过ps -ef |grep nginx查看当前运行的nginx主进程号并记下

1、下载,执行命令如下:

git clone git://github.com/vozlt/nginx-module-vts.git

将文件夹nginx-module-vts移动到/usr/local/nginx路径下

2、编译nginx 并添加该模块, 编译前先查看当前的nginx已经安装的模块,避免重新编译时漏掉了 ,执行命令如下:

nginx -V //注意V是大写

3、进入nginx加压目录,带着原来的模块,再添加nginx-module-vts模块,进行编译 ,如图:

编译完成后,执行make命令,如图:

注意:不要执行make install ,否则就会将原来数据覆盖

4、 进入 nginx 安装目录,将 sbin 目录下的可执行文件备份为 nginx.old ,如图:

5、 进 入 nginx 源目录下的 objs 目 录 ,将 编译之 后 的 nginx 二进 制 文件 复 制到 /usr/local/nginx/sbin 目录下,替换原来的 nginx 可执行文件,如图:

6、 目前机器上有两个 nginx 进程,此时需要通过 nginx 信号控制方式将 nginx 二进制升级替换后的,通过 kill –USER2 `cat /opt/nginx/log/nginx.pid` (nginx.pid 中的内容即是旧的nginx主进程 pid,可通过 ps –ef |grep nginx 查看) ,如图:

再次执行下面命令,完全把旧的进程退出,启用新的进程,如下:

kill -WINCH 28647

kill -QUIT 28647

7、 执行完成后再次执行./nginx –V 可以看到模块已经添加成功,如图:

8、 编辑 nginx 配置文件,添加内容如下:

9、 重新执行 nginx 重载命令,./nginx –s reload ,然后通过页面访问如图:

vts页面左下角有个json数据接口,可以通过此接口来获取数据进行判断

下面的脚本通过python编写nginx监控插件,并通过夜莺实现监控,如下:

#!/usr/bin/python       #通过python2编写
#-*- coding:utf-8 -*-  #指定编码
'''
 @此脚本用来获取nginx的监控状态信息,json界面的各个参数说明如下:
   servermain:
      hostname: 主机名
      nginxVersion: nginx版本
      loadMsec: 以毫秒为单位的处理时间
      nowMsec: 以毫秒为单位的当前时间
      connections:
          active:     当前活动的客户端连接数
          reading:    读取客户端连接的总数
          writing:    写入客户端连接的总数
          waiting:    正在等待的客户端连接总数
          accepted:   接受的客户端连接总数
          handled:    已处理的客户端连接总数
          requests:   请求的客户端连接总数
          sharedZones:
          name:       配置中指定的共享内存名称
          maxSize:    配置中指定的共享内存的最大大小的限制
          usedSize:   共享内存的当前大小
          usedNode:   共享内存中当前使用的节点数
   serverZones:
      requestCounter: 从客户端接收的客户端请求总数
      inBytes:    从客户端接收的总字节数
      outBytes:   发送到客户端的总字节数
      responses: 
          1xx,2xx,3xx,4xx,5xx: 表示响应状态吗
          miss:       未命中的缓存数
          bypass:     绕过缓存旁路数
          expired:    过期的缓存数
          stale:      生效缓存的数量
          updating:   缓存更新的次数
          revalidated:重新验证的缓存数
          hit:        缓存命中数
          scarce:     未达缓存要求的请求次数
      requestMsecCounter: 累积的请求处理时间(毫秒)
      requestMsec:   请求处理时间的平均值(毫秒)
   upstreamZones:
       server: server地址
       requestCounter: 转发到此服务器的客户端连接总数
       inBytes: 从该服务器接收的总字节数
       outBytes:发送到此服务器的总字节数
       responses:
           1xx,2xx,3xx,4xx,5xx: 表示响应状态吗
   requestMsecCounter: 包括upstream在内的累计请求处理时间数(毫秒)
   requestMsec:
       time: 请求处理时间
       msecs: 包括upstream在内的请求处理时间
   responseMsecCounter: 仅upstream响应处理时间累加值(毫秒)
   responseMsecs: 仅upstream响应处理时间平均值(毫秒) 
   weight:      server的当前weight值
   maxFails:    server的当前max_fails设置
   failTimeout: server的当前的fail_timeout设置
   backup:      server的当前backup设置
   down:        服务器的当前down设置
   
'''
import requests
import json
import time
import commands
class Check_Nginx:
    ''' 此来用来检测nginx指标'''
    def __init__(self,result):
        self.result = result
        print(json.dumps(self.result)) #将列表转换为字符串类型,否则夜莺不识别
def main():
    result = []
    ip = commands.getoutput('''ifconfig `route|grep '^default'|awk '{print $NF}'`|grep inet|awk '{print $2}'|head -n 1''')
    timestamp = int(time.time())
    r = requests.get('http://10.88.10.35/vhost_status/format/json')
    dictt = json.loads(r.text)  #将json数据转换为字典
    '''
    下面三行用来获取server main中的request信息
    nginx运行时间等于nowMsec-loadMsec,结果值单位为毫秒
    '''
    nowMsec = float(dictt.get('nowMsec')) #将整形转换为浮点型
    loadMsec = float(dictt.get('loadMsec'))
    nginx_uptime = round((nowMsec-loadMsec)/3600000,2)      #nginx运行时间,单位小时
    nginx_accept = dictt.get('connections').get('accepted')
    nginx_handled = dictt.get('connections').get('handled')
    nginx_requests = dictt.get('connections').get('requests')
    nginx_active = dictt.get('connections').get('active')
    nginx_reading = dictt.get('connections').get('reading')
    nginx_writing = dictt.get('connections').get('writing')
    nginx_waiting = dictt.get('connections').get('waiting')
    nginx_uptime = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.uptime',
        'value': nginx_uptime
    }
    nginx_accept = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.accept',
        'value': nginx_accept
    }
    nginx_handled = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.handled',
        'value': nginx_handled
    }
    nginx_request = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.requests',
        'value': nginx_requests
    }
    nginx_active = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.active',
        'value': nginx_active
    }
    nginx_reading = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.reading',
        'value': nginx_reading
    }
    nginx_writing = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.writing',
        'value': nginx_writing
    }
    nginx_waiting = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.waiting',
        'value': nginx_waiting
    }
    result.append(nginx_uptime)
    result.append(nginx_accept)
    result.append(nginx_handled)
    result.append(nginx_request)
    result.append(nginx_active)
    result.append(nginx_reading)
    result.append(nginx_writing)
    result.append(nginx_waiting)
    '''
    下面用来获取共享内存的使用情况
    '''
    sharememory_maxsize = dictt.get('sharedZones').get('maxSize')
    sharememory_usedsize = dictt.get('sharedZones').get('usedSize')
    sharememory_usedNode = dictt.get('sharedZones').get('usedNode')
    server_maxsize = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.sharememory.maxsize',
        'value': sharememory_maxsize
    }
    server_usedsize = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.sharememory.usedsize',
        'value': sharememory_usedsize
    }
    server_usedNode = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.sharememory.usedNode',
        'value': sharememory_usedNode
    }
    result.append(server_maxsize)
    result.append(server_usedsize)
    result.append(server_usedNode)
    '''
    下面的用来获取server zones中的信息
    '''
    server_requestCounter = dictt.get('serverZones').get('localhost').get('requestCounter')#serverzone的requests
    server_inbytes = dictt.get('serverZones').get('localhost').get('inBytes') #traffic Rcvd
    server_outbytes = dictt.get('serverZones').get('localhost').get('outBytes') #traffic send
    server_code1 = dictt.get('serverZones').get('localhost').get('responses').get('1xx')
    server_code2 = dictt.get('serverZones').get('localhost').get('responses').get('2xx')
    server_code3 = dictt.get('serverZones').get('localhost').get('responses').get('3xx')
    server_code4 = dictt.get('serverZones').get('localhost').get('responses').get('4xx')
    server_code5 = dictt.get('serverZones').get('localhost').get('responses').get('5xx')
    server_requestCounter = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.server.requestCounter',
        'value': server_requestCounter
    }
    server_inbytes = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.server.inbytes',
        'value': server_inbytes
    }
    server_outbytes = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.server.outbytes',
        'value': server_outbytes
    }
    server_code1 = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.server.1xx',
        'value': server_code1
    }
    server_code2 = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.server.2xx',
        'value': server_code2
    }
    server_code3 = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.server.3xx',
        'value': server_code3
    }
    server_code4 = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.server.4xx',
        'value': server_code4
    }
    server_code5 = {
        'endpoint': ip,
        'tags': '',
        'timestamp': timestamp,
        'metric': 'nginx.server.5xx',
        'value': server_code5
    }
    result.append(server_requestCounter)
    result.append(server_inbytes)
    result.append(server_outbytes)
    result.append(server_code1)
    result.append(server_code2)
    result.append(server_code3)
    result.append(server_code4)
    result.append(server_code5)
    '''下面的用来获取upstream的信息'''
    upstreamZones = dictt.get('upstreamZones').get('schedule')
    for i in upstreamZones:  #遍历列表
         get_upstreamip = i.get('server').split(':')[0]#获取代理的ip地址
         #get_upstreamip = i.get('server')#获取代理的ip地址和端口
         get_requestCounter = i.get('requestCounter')
         get_inBytes = i.get('inBytes')
         get_outBytes = i.get('outBytes')
         get_upstream_1xx = i.get('responses').get('1xx')
         get_upstream_2xx = i.get('responses').get('2xx')
         get_upstream_3xx = i.get('responses').get('3xx')
         get_upstream_4xx = i.get('responses').get('4xx')
         get_upstream_5xx = i.get('responses').get('5xx')
         get_responseMsec = i.get('responseMsec')
         get_ip = {
             'endpoint': ip,
             'tags': 'upstreamip=%s'%get_upstreamip,
             'timestamp': timestamp,
             'metric': 'nginx.upstream.ip',
             'value': None,
         }
         if get_upstreamip is not None:
             get_ip['value'] = 1
         else:
             get_ip['value'] = 0
         nginx_requestCounter = {
             'endpoint': ip,
             'tags': 'upstreamip=%s'%get_upstreamip,
             'timestamp': timestamp,
             'metric': 'nginx.upstream.requestCounter',
             'value': get_requestCounter
         }
         nginx_inBytes = {
             'endpoint': ip,
             'tags': 'upstreamip=%s'%get_upstreamip,
             'timestamp': timestamp,
             'metric': 'nginx.upstream.inBytes',
             'value': get_inBytes
         }
         nginx_outBytes = {
             'endpoint': ip,
             'tags': 'upstreamip=%s'%get_upstreamip,
             'timestamp': timestamp,
             'metric': 'nginx.upstream.outBytes',
             'value': get_outBytes
         }
         upstream_1xx = {
             'endpoint': ip,
             'tags': 'upstreamip=%s'%get_upstreamip,
             'timestamp': timestamp,
             'metric': 'nginx.upstream.1xx',
             'value': get_upstream_1xx
         }
         upstream_2xx = {
             'endpoint': ip,
             'tags': 'upstreamip=%s'%get_upstreamip,
             'timestamp': timestamp,
             'metric': 'nginx.upstream.2xx',
             'value': get_upstream_2xx
         }
         upstream_3xx = {
             'endpoint': ip,
             'tags': 'upstreamip=%s'%get_upstreamip,
             'timestamp': timestamp,
             'metric': 'nginx.upstream.3xx',
             'value': get_upstream_3xx
         }
         upstream_4xx = {
             'endpoint': ip,
             'tags': 'upstreamip=%s'%get_upstreamip,
             'timestamp': timestamp,
             'metric': 'nginx.upstream.4xx',
             'value': get_upstream_4xx
         }
         upstream_5xx = {
             'endpoint': ip,
             'tags': 'upstreamip=%s'%get_upstreamip,
             'timestamp': timestamp,
             'metric': 'nginx.upstream.5xx',
             'value': get_upstream_5xx
         }
         get_responsetime = {
             'endpoint': ip,
             'tags': 'upstreamip=%s'%get_upstreamip,
             'timestamp': timestamp,
             'metric': 'nginx.upstream.responsetime',
             'value': get_responseMsec
         } 
         result.append(get_ip)
         result.append(nginx_requestCounter)
         result.append(nginx_inBytes)
         result.append(nginx_outBytes)
         result.append(upstream_1xx)
         result.append(upstream_2xx)
         result.append(upstream_3xx)
         result.append(upstream_4xx)
         result.append(upstream_5xx)
         result.append(get_responsetime)
    Check_Nginx(result)
if __name__ == '__main__':
    main()

标签