使用zabbix监控nginx和php-fpm性能

作者: 天之蓝色 | 来源:发表于2017-05-02 15:57 被阅读2058次

    1.系统环境

    1.1 软件及其版本

    软件 版本
    OS Centos6.8-2.6.32-642.el6.x86_64
    zabbix zabbix-3.2.4.tar.gz
    web nginx-1.10.3.tar.gz
    mysql mysql-5.5.53-linux2.6-x86_64.tar.gz
    php php-5.5.38.tar.gz

    1.2 软件安装路径

    zabbix安装在/usr/local/zabbix路径下,其相关配置文件及二进制执行程序都放置其中。
    nginx安装在/usr/local/nginx下,其相关配置文件及二进制执行程序都放置其中。
    php安装在/usr/local/php下,其相关配置文件及二进制执行程序都放置其中。
    继续后面的操作前,请确认nginx和php-fpm的服务端口都处于监听状态。

    2. 配置nginx的status

    2.1 确认nginx的status已编译到程序包中

    使用nginx -V可以查看nginx是否将模块·http_stub_status_module`编译进包中:

    [root@monitor-server2 zabbix_agentd.conf.d]# nginx -V
    nginx version: nginx/1.10.3
    built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
    built with OpenSSL 1.0.1e-fips 11 Feb 2013
    TLS SNI support enabled
    configure arguments: --prefix=/usr/local/nginx-1.10.3 
    --with-http_ssl_module 
    --with-http_stub_status_module --with-pcre   
    #出现with-http_stub_status_module说明已装载status模块
    

    2.2 启用nginx的status模块

    • 修改nginx.conf文件
      一般在默认主机中增加如下location即可:
            location /nginx_status {
                stub_status on;
                access_log off;
                allow 127.0.0.1;
                allow 192.168.249.0/24;
                deny all;
    
    • 查看nginx status
      nginx配置文件修改完成以后,使用nginx -t测试配置文件是否有明显逻辑及语法错误,没有问题则重载配置文件。
    nginx -t
    nginx -s reload
    

    然后使用浏览器或者curl指令查看nginx status:

    [root@monitor-server2 zabbix_agentd.conf.d]# curl localhost/nginx_status
    Active connections: 2 
    server accepts handled requests
     1585 1585 7785 
    Reading: 0 Writing: 1 Waiting: 1 
    

    2.3 nginx status数值的含义说明

    字段 含义
    Active connections 当前的活动连接数,包含处于等待状态的连接
    accepts 接收到的客户端发来的连接数
    handled 已经处理完成的连接数,一般情况下它和accepts值相同,如果不同说明nginx性能出现瓶颈
    requests 客户端请求总数
    reading 正在读取请求头信息的连接数
    writing 正在发送响应报文的连接数
    waiting 处于闲置状态正等待客户端发送请求的连接数

    3. 配置php-fpm的status

    php-fpm自带的有用于查询其工作状态的页面,需要进行如下 两步,以启用这一功能。

    3.1 启用php-fpm status页面

    修改php-fpm.conf文件,去掉status页面的注释,并可以根据需要将其改名。操作如下:

    vim /usr/local/php/etc/php-fpm.conf
    pm.status_path = /php_fpm-status      
     #去掉了前面的;注释符,并更名为php_fpm-status
    

    3.2 查看php-fpm的status

    修改完php-fpm.conf后,使用service php-fpm reload重新加载配置文件,然后在浏览器或者使用curl指令查看php-fpm的status。操作如下:

    [root@monitor-server2 zabbix_agentd.conf.d]# curl localhost/php_fpm-status
    pool:                 www
    process manager:      dynamic
    start time:           01/May/2017:15:14:23 +0800
    start since:          29536
    accepted conn:        5947
    listen queue:         0
    max listen queue:     3
    listen queue len:     128
    idle processes:       2
    active processes:     1
    total processes:      3
    max active processes: 3
    max children reached: 0
    slow requests:        0
    

    php-fpm的status可以查看汇总信息和详细信息,详细信息比汇总信息要多出每一个php-fpm进程的相关信息,同时支持多种格式输出,如xml、html和json,默认情况下分别使用如果指令即可:

    Examples for summary status page:
    http://example.com/status
    http://example.com/status?json
    http://example.com/status?html
    http://example.com/status?xml
    Example for detailed status page:
    http://example.com/status?full
    http://example.com/status?json&full
    http://example.com/status?html&full
    http://example.com/status?xml&full

    使用何种格式查看status决定了后续使用zabbix进行监控获取status数值的方式。本文以上述curl localhost/php_fpm-status的输出为例。

    3.3 php-fpm status的含义

    字段 含义
    pool php-fpm pool的名称,大多数情况下为www
    process manager 进程管理方式,现今大多都为dynamic,不要使用static
    start time php-fpm上次启动的时间
    start since php-fpm已运行了多少秒
    accepted conn pool接收到的请求数
    listen queue 处于等待状态中的连接数,如果不为0,需要增加php-fpm进程数
    max listen queue 从php-fpm启动到现在处于等待连接的最大数量
    listen queue len 处于等待连接队列的套接字大小
    idle processes 处于空闲状态的进程数
    active processes 处于活动状态的进程数
    total processess 进程总数
    max active process 从php-fpm启动到现在最多有几个进程处于活动状态
    max children reached 当pm试图启动更多的children进程时,却达到了进程数的限制,达到一次记录一次,如果不为0,需要增加php-fpm pool进程的最大数
    slow requests 当启用了php-fpm slow-log功能时,如果出现php-fpm慢请求这个计数器会增加,一般不当的Mysql查询会触发这个值

    4. 编写status数据提取脚本

    在适当的位置,一般是/usr/local/zabbix/bin里准备脚本用于提取status里每个字段的数值。

    4.1 nginx的status数值提取脚本

    此脚本为/usr/local/zabbix/bin/nginx_status.sh,其内容如下:

    #!/bin/bash
    #check nginx status
    ip=127.0.0.1
    function ping() {                              #用于检测nginx进程是否存在
        /sbin/pidof nginx | wc -l
    }
    
    function active() {                 #用于提取status中的active数值
        /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '1p' | awk '{print $NF}'
    }
    
    function accepts() {            #用于提取status中的accepts数值
        /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '3p' | awk '{print $1}'
    }
    
    function handled() {          #用于提取status中的handled数值
        /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '3p' | awk '{print $2}'
    }
    
    function requests() {        #用于提取status中的request数值
        /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '3p' | awk '{print $3}'
    }
    
    function reading() {        #用于提取status中的reading数值
        /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '4p' | awk '{print $2}'
    }
    
    function writing() {        #用于提取status中的writing数值
        /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '4p' | awk '{print $4}'
    }
    
    function waiting() {     #用于提取status中的waiting数值
        /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '4p' | awk '{print $6}'
    }
    
    $1                           #通过第一个位置参数的值来调用相应的函数  
    

    4.2 php-fpm status数值提取脚本

    php-fpm status数值提取脚本为/usr/local/zabbix/bin/php_fpm_status.sh,内容如下:

    #!/bin/bash
    #check php-fpm status
    case $1 in
        ping)                           #检测php-fpm进程是否存在
        /sbin/pidof php-fpm | wc -l
        ;;
        start_since)             #提取status中的start since数值
        /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==4{print $3}'
        ;;
        conn)                     #提取status中的accepted conn数值
        /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==5{print $3}'
        ;;
        listen_queue)         #提取status中的listen queue数值
        /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==6{print $3}'
        ;;
         max_listen_queue)  #提取status中的max listen queue数值
        /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==7{print $4}'
        ;;
        listen_queue_len)    #提取status中的listen queue len
        /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==8{print $4}'
        ;;
        idle_processes)      #提取status中的idle processes数值
        /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==9{print $3}'
        ;;
        active_processes)   #提取status中的active processes数值
        /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==10{print $3}'
        ;;
         total_processes)    #提取status中的total processess数值
        /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==11{print $3}'
        ;;
        max_active_processes)     #提取status中的max active processes数值
        /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==12{print $4}'
        ;;
         max_children_reached)    #提取status中的max children reached数值
        /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==13{print $4}'
        ;;
        slow_requests)   #提取status中的slow requests数值
        /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==14{print $3}'  
        ;;
        *)
        echo "Usage: $0 {conn|listen_queue|max_listen_queue|listen_queue_len|idle_processes|active_processess|total_processes|max_active_processes|max_children_reached|slow_requests}"
        exit 1
        ;;
    esac
    

    5. 创建zabbix_agentd的子配置文件

    /usr/local/zabbix/etc/zabbix_agentd.d/中创建关联nginx status和php-fpm status的子配置文件,创建一个,或者在已有的某配置文件中增加也可以,我这里分别为它们创建配置文件,文件名可自定义,只要确保此文件夹全部内容在zabbix_agentd.conf中包含(include)了。

    5.1 userparameter_nginx.conf

    [root@monitor-server2 zabbix_agentd.conf.d]# cat userparameter_nginx.conf 
    #/usr/local/zabbix/bin/nginx_status.sh
    UserParameter=nginx.status[*],/usr/local/zabbix/bin/nginx_status.sh $1  
     #这种写法比较简洁,参考zabbix 3.2.4中自带的的userparameter_examples.conf
    UserParameter=nginx.version,/usr/local/nginx/sbin/nginx -v     
    #让zabbix-agentd获取nginx的版本信息 ,一切shell指令都推荐使用绝对路径 
    

    5.2 userparameter_php-fpm.conf

    [root@monitor-server2 zabbix_agentd.conf.d]# cat userparameter_php-fpm.conf 
    #/usr/local/zabbix/bin/php_fpm_status.sh
    UserParameter=php-fpm.status[*],/usr/local/zabbix/bin/php_fpm_status.sh $1
    UserParameter=php-fpm.version,/usr/local/php/sbin/php-fpm -v | awk 'NR==1{print $0}'   
    #获取php-fpm版本信息
    

    5.3 确认子配置文件被zabbix_agentd配置文件包含

    确认在/usr/local/zabbix/etc/zabbix_agentd.conf中包含:Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/且没有被注释。

    6. 重启zabbix_agentd服务

    service zabbix_agentd restart 让zabbix_agentd加载新的配置文件。

    7. 测试zabbix_get能否取到数据

    在zabbix server上使用如下指令测试能否获取到nginx和php-fpm status数值。

    [root@monitor-server2 zabbix_agentd.conf.d]# zabbix_get -s 127.0.0.1 -k 'nginx.status[ping]'      
    1
    [root@monitor-server2 zabbix_agentd.conf.d]# zabbix_get -s 127.0.0.1 -k 'nginx.status[active]'
    6
    [root@monitor-server2 zabbix_agentd.conf.d]# zabbix_get -s 127.0.0.1 -k 'nginx.status[requests]'  
    1841
    [root@monitor-server2 zabbix_agentd.conf.d]# zabbix_get -s 127.0.0.1 -k 'php-fpm.status[ping]' 
    1
    [root@monitor-server2 zabbix_agentd.conf.d]# zabbix_get -s 127.0.0.1 -k 'php-fpm.status[conn]'
    1247
    

    注意

    • zabbix_get指令在zabbix server上运行。
    • userparameter_*.conf文件位于zabbix_agentd端。
    • nginx_status.sh和php_fpm_status.sh位于zabbix_agentd端。
    • zabbix-get-s指定的ip为zabbix-agentd的监听ip。

    8. zabbix server上配置相应的模板

    这里的模板包含对nginx status和php-fpm status要监控的itemtriggerGraphs等一系列内容。对于在zabbix server上新增要监控的内容,最好的办法就是从模板开始,然后按照顺序依次配置相应内容,无需去网上找现成的模板导入,对于系统的监控按需配置是最好的。下面是相应的操作过程。

    8.1 添加nginx status监控模板

    新建nginx status模板
    定义nginx status模板 新建nginxApplication 定义nginx status items,这里我使用的是被动临控 增加nginx status状态码映射 nginx trigger定义 定义nginx监控视图

    8.2 添加php-fpm status监控模板

    php-fpm status的模板添加步骤和上述方法一样,此处不在赘述。

    8.3 选择相应的主机或主机组关联上相应的模板

    给主机或主机组关联模板

    9. 实际监控效果展示

    查看监控效果可以通过查看Monitoring---->Latest data,过滤出相应的主机及应用名进行查看,最新收集的各item的监控结果,凡是监控到数据的item会显示数据,出现灰色的表示没有监控到数据,需要排查原因。如下所示:

    nginx的监控数据
    也可以通过定义的Graphs查看监控效果: nginx statur监控视图

    10. 小结

    zabbix中要实现对用户自定义的item的监控,大致过程如下:

    • 启用相应软件的性能统计功能
    • 编写性能统计数据提取脚本
    • 配置自定义的userparameter conf文件
    • 重启zabbix_agentd服务
    • zabbix server web上添加相应的模板
    • 给主机或主机组调用模板

    相关文章

      网友评论

        本文标题:使用zabbix监控nginx和php-fpm性能

        本文链接:https://www.haomeiwen.com/subject/pgbqtxtx.html