用户自定义监控项之利用Zabbix监控Nginx+PHP

        Zabbix提供了大量丰富的监控指标,但是在日常工作中,根据不同的需求,还需要开发一些自定义的监控指标。Zabbix提供了响应的自定义监控指标的功能。Zabbix agent的UserParameter参数允许用户自定义监控项,并通过Zabbix agent执行费Zabbix原生指令来实现监控。自定义的监控项的配置参数保存于Zabbix agent的配置文件中

        自定义监控项的配置参数:

 Include=/etc/zabbix/zabbix_agentd.d/*.conf  --自定监控路径

 UnsafeUserParameters=1    --改为1为开启自定义监控功能,默认该功能为关闭状态
 UserParameter= --自定义监控项
自定义监控格式如下
UserParameter = <key>,<shell command>
格式中的key代表监控项名称,不能使用中文,中间没有空格,在单台主机上是唯一的,此key与Zabbix在web界面上的监控项名称必须保持一致

因为自定义监控项可接受传参,所以还又一种更为灵活的自定义监控项格式:
UserParameter = <key[*]>,<shell command>
格式中的key[*]代表监控项名称,与key类似。在Zabbix Web界面上设置监控项时,配置中的*代表要穿计的参数,数量不能超过9个,参数与参数之间用逗号分隔,一般与自动发现规则配合使用,如下图所示

key[*]在上图中代表network_bandwidth[{#IFNAME}],{#IFNAME}在Zabbix Web中代表josn格式多网络接口的名称,在Zabbix agent配置文件中,定义了该自定义顶监控
在配置文件中修改监控项:
vim / etc / zabbix / zabbix_agentd.conf 

UserParameter = network_bandwidth[*],ethtool $1 | grep -oP "(?>=Speed:\s)[0-9]+"

 这样,一个监控网卡带宽的自定义监控就做好了,下面将进入实战

在默认情况下,不允许用户在自定义监控项中使用特殊符号,如果传递的参数中包含特殊字符,则需要在配置文件中将UnsafeUserParameters参数设置为1,如下图

vim /etc/zabbix/zabbix_agentd.conf

在执行自定义监控项脚本的时,也需要注意执行时间超市的时间,如果超过设置的超时时间,那么该命令的进程将被终止,Zabbix默认的超时时间时3s,可以通过修改配置文件中的Timeout的参数来设置不同的值(注意:此参数的值最大为30s)

vim /etc/zabbix/zabbix_agentd.conf                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             

首先,部署LNMP架构,这里就不赘述了,按照步骤来

部署PHP(在客户端操作)

yum install mariadb mariadb-server php php-fpm php-mysql php-gd -y

vim /etc/my.cnf
[mysqld]
character-set-server=utf8  --手动添加

#启动服务并设置服务随机自启
systemctl start mariadb && systemctl enable mariadb

修改/etc/php-fpm.d/www.conf配置文件指定用户与组,并开启状态页面用于监控服务状态。
vim /etc/php-fpm.d/www.conf
...
39 user = nginx
41 group = nginx

121 pm.status_path = /php_status    --取消注释(默认被注释)并改名为/php_status


修改配置/etc/php.ini 指定php时区

vim /etc/php.ini   
...
date.timezone ="Asia/shanghai"  --指定时区

vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true


#安装nginx
yum -y install --setopt=obsoletes=0 nginx-1.22.0-1.el7.ngx.x86_64
vim /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    #开启nginx状态页面
    location = /status {
    stub_status;
   }

    location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;  #增加index.php索引页
    }

    #连接php-fpm
    location ~ \.php$ {
        root           /usr/share/nginx/html;   #网页根目录需要绝对路径
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    #连接php_status页面
    location /php_status {
        root           html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        include        fastcgi_params;
    }
}
#启动服务&设置服务随机自启
systemctl restart nginx && systemctl enable nginx

#启动php-fpm
systemctl start php-fpm && systemctl enable php-fpm

测试

访问nginx状态页面:http://server_ip/status

访问php-fpm状态页面:http://server_ip/php_status

测试nginx和php协同

vim /usr/share/nginx/html/phpinfo.php
<?php
phpinfo();
?>

 自定义Nginx监控(在客户端操作)

  自定义nginx访问量的监控项,首先要通过脚本将各种状态的值取出来,然后通过zabbix监控。

    mkdir /etc/zabbix/script/
    cd /etc/zabbix/script
    chmod + x
    ngx_status.sh

    # 脚本内容主要是利用函数定义nginx状态页面的各个字段,然后结合awk进行取值,最后在通过case语句控制脚本输出
    cat /etc/zabbix/script/ngx_status.sh

    # 定义Nginx status页面
    ngx_status = "http://127.0.0.1/status"

    # 判断status页面是否存活
    ngx_status_code()
    {
        http_code = `curl - o / dev / null - s - w % {http_code} ${ngx_status}
    `
    if [ ${http_code} == "200"];then
    return 1
    else
    echo
    "Nginx status is not running."
fi
}

# 获取当前活动用户的连接数量
active()
{
ngx_status_code | | curl - s ${ngx_status} | grep "Active" | awk '{print $NF}'
}

# 获取接受的客户端连接数量
accepts()
{
ngx_status_code | | curl - s ${ngx_status} | awk NR == 3 | awk '{print $1}'
}

# 获取处理的连接总数量
handled()
{
ngx_status_code | | curl - s ${ngx_status} | awk NR == 3 | awk '{print $2}'
}

# 获取客户端请求的总数量
requests()
{
ngx_status_code | | curl - s ${ngx_status} | awk NR == 3 | awk '{print $3}'
}

# 获取正在读取请求标头的当前连接数量
reading()
{
ngx_status_code | | curl - s ${ngx_status} | grep "Reading" | awk '{print $2}'
}

# 获取正在将响应写回到客户端的当前连接数量
writing()
{
ngx_status_code | | curl - s ${ngx_status} | grep "Writing" | awk '{print $2}'
}

# 获取当前正在等待响应的客户端连接数量
waiting()
{
ngx_status_code | | curl - s ${ngx_status} | grep "Waiting" | awk '{print $2}'
}

# 使用位置变量控制脚本输出
case $1 in
      active)
active;;
accepts)
accepts;;
handled)
handled;;
requests)
requests;;
reading)
reading;;
writing)
writing;;
waiting)
waiting;;
* )
echo
"Unknown options"
esac
#修改zabbix agent配置文件,开启自定义监控功能
vim /etc/zabbix/zabbix_agentd.conf 
...
311 Include=/etc/zabbix/zabbix_agentd.d/*.conf  --自定监控路径

330 UnsafeUserParameters=1    --改为1为开启自定义监控功能,默认该功能为关闭状态


#进入自定义监控路径
cd /etc/zabbix/zabbix_agentd.d/


#创建自定义监控文件(文件名要求以 .conf结尾)
vim custom_nginx_status.conf
UserParameter=nginx.active,bash /etc/zabbix/script/ngx_status.sh active
UserParameter=nginx.accepts,bash /etc/zabbix/script/ngx_status.sh accepts
UserParameter=nginx.handled,bash /etc/zabbix/script/ngx_status.sh handled
UserParameter=nginx.requests,bash /etc/zabbix/script/ngx_status.sh requests
UserParameter=nginx.reading,bash /etc/zabbix/script/ngx_status.sh reading
UserParameter=nginx.writing,bash /etc/zabbix/script/ngx_status.sh writing
UserParameter=nginx.waiting,bash /etc/zabbix/script/ngx_status.sh waiting

#解释
UserParameter=   #自定义监控固定格式
nginx.active     #监控项名称

#重启zabbix-agent服务
systemctl restart zabbix-agent

获取监控数据(服务端)

yum -y install zabbix-get

#获取客户端监控项值
zabbix_get -s 192.168.0.15 -k nginx.active    --当前活动用户的连接数量
zabbix_get -s 192.168.0.15 -k nginx.accepts   --接受的客户端连接总数量
zabbix_get -s 192.168.0.15 -k nginx.handled   --处理的连接总数量
zabbix_get -s 192.168.0.15 -k nginx.requests  --客户端请求的总数量
zabbix_get -s 192.168.0.15 -k nginx.reading   --正在读取请求标头的当前连接数
zabbix_get -s 192.168.0.15 -k nginx.writing   --将响应写回客户端的当前连接数
zabbix_get -s 192.168.0.15 -k nginx.waiting   --当前客户端正在等待服务器的响应数量

 接下来创建监控模板,应用集以及监控项

点击配置-模板 创建新的模板,这里笔者已经创建好了 模板是 nginx_status

然后创建监控项

 

键值就是上面服务端测试键值

然后绑定模板,转到配置-主机,找到你的主机,把模板绑定到主机

然后点击更新

自定义php-fpm监控

#查看php-fpm配置文件确保已经开启状态页面功能(搜索:status)
vim /etc/php-fpm.d/www.conf
...
121 pm.status_path = /php_status
#查看nginx配置文件确保可以访问php_status页面
vim /etc/nginx/conf.d/default.conf
...
    location /php_status {            #php状态页面
        root           html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        include        fastcgi_params;
    }
访问php状态页面:http://server_ip/php_status

 监控项名称详解:

 pool:fpm池子名称,大多数为www                               
 process manager:进程管理方式,值:static,dynamic or ondemand 
 start time:启动日期,如果reload了php-fpm,时间会更新        
 start since:运行时长                                        
 accepted conn:当前池子接受的请求数                          
 listen queue:请求等待队列,如果这个值不为0,那么要增加FPM的进程数量 
 max listen queue:请求等待队列最高的数量                     
 listen queue len:socket等待队列长度                         
 idle processes:空闲进程数量                                 
 active processes:活跃进程数量                               
 total processes:总进程数量                                  
 max active processes:最大的活跃进程数量(FPM启动开始算)    
 max children reached:进程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量太小了,需要设置大点 
 slow requests   当启用了php-fpm slow-log功能时,如果出现php-fpm慢请求这个计数器会增加,一般不当的Mysql查询会触发这个值 

 监控方法与nginx类似

#上传脚本到/etc/zabbix/script路径并添加执行权限
chmod +x phpfpm_status.sh
cat phpfpm_status.sh
#!/bin/bash

PHPFPM_COMMAND=$1
#根据监听不同端口进行调整
PHPFPM_PORT=80

start_since(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^start since:/ {print $NF}'
}
accepted_conn(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^accepted conn:/ {print $NF}'
}
listen_queue(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^listen queue:/ {print $NF}'
}
max_listen_queue(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^max listen queue:/ {print $NF}'
}
listen_queue_len(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^listen queue len:/ {print $NF}'
}
idle_processes(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^idle processes:/ {print $NF}'
}
active_processes(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^active processes:/ {print $NF}'
}
total_processes(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^total processes:/ {print $NF}'
}
max_active_processes(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^max active processes:/ {print $NF}'
}
max_children_reached(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^max children reached:/ {print $NF}'
}
slow_requests(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/php_status" |awk '/^slow requests:/ {print $NF}'
}
case $PHPFPM_COMMAND in
        start_since)
                start_since;
                ;;
        accepted_conn)
                accepted_conn;
                ;; 
        listen_queue)
                listen_queue;
                ;;
        max_listen_queue) 
                max_listen_queue;
                ;;
        listen_queue_len)
                listen_queue_len;
                ;;
        idle_processes)
                idle_processes;
                ;;
        active_processes)
                active_processes;
                ;;
        total_processes)
                total_processes;
                ;;
        max_active_processes)
                max_active_processes;
                ;;
        max_children_reached)
                max_children_reached;
                ;;
        slow_requests)
                slow_requests;
                ;;
              *)
                echo $"USAGE:$0 {start_since|accepted_conn|listen_queue|max_listen_queue|listen_queue_len|idle_processes|active_processes|total_processes|max_active_processes|max_children_reached}"
    esac
#创建自定义监控项文件
vim /etc/zabbix/zabbix_agentd.d/phpfpm_status.conf
UserParameter=phpfpm_status[*],/bin/bash /etc/zabbix/script/phpfpm_status.sh "$1"

#重启zabbix agent服务
systemctl restart zabbix-agent

 zabbix server获取监控项数据

zabbix_get -s 192.168.0.15 -k phpfpm_status[start_since]       --php-fpm运行时长
zabbix_get -s 192.168.0.15 -k phpfpm_status[accepted_conn]     --当前接收的连接数
zabbix_get -s 192.168.0.15 -k phpfpm_status[listen_queue]      --等待连接的请求数
zabbix_get -s 192.168.0.15 -k phpfpm_status[max_listen_queue]  --请求等待队列最高的数量
zabbix_get -s 192.168.0.15 -k phpfpm_status[listen_queue_len]  --socket等待队列长度
zabbix_get -s 192.168.0.15 -k phpfpm_status[idle_processes]    --空闲进程数量
zabbix_get -s 192.168.0.15 -k phpfpm_status[active_processes]  --活跃进程数量
zabbix_get -s 192.168.0.15 -k phpfpm_status[total_processes]   --总进程数量
zabbix_get -s 192.168.0.15 -k phpfpm_status[max_active_processes]  --最大的活跃进程数量
zabbix_get -s 192.168.0.15 -k phpfpm_status[max_children_reached]  --进程最大数量限制的次数
zabbix_get -s 192.168.0.15 -k phpfpm_status[slow_requests]         --php-fpm慢请求

 接下来就是创建模板、应用集、监控项、绑定模板、与前面nginx一样,至此,配置完成,最后效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值