zabbix实现对nginx监控并实现nginx服务自愈_第1张图片

1.zabbix-server端(ubuntu1804)

1)必要的软件包

zabbix-server-mysql 
zabbix-frontend-php

2)启动的服务

State                    Recv-Q                    Send-Q                             Local Address:Port                               Peer Address:Port                                                                                                                                                                                                                  
LISTEN                   0                           128                                       0.0.0.0:10051                                     0.0.0.0:*                       
users:(("zabbix_server",pid=3991,fd=4),("zabbix_server",pid=3990,fd=4),("zabbix_server",pid=3989,fd=4)……
……
LISTEN                   0                           80                                          192.168.1.14:3306                              0.0.0.0:*                     
    users:(("mysqld",pid=1461,fd=20))   
……                                                                                                                               
LISTEN                   0                         128                                           *:80                                                    *:*                      
 users:(("apache2",pid=4105,fd=4),("apache2",pid=4100,fd=4),("apache2",pid=4091,fd=4),("apache2",pid=3904,fd=4),
("apache2",pid=3900,fd=4),("apache2",pid=3801,fd=4),("apache2",pid=3576,fd=4),("apache2",pid=3501,fd=4),("apache2",
pid=3404,fd=4),("apache2",pid=1620,fd=4),("apache2",pid=1587,fd=4))
……

3)创建proxy代理端的授权数据库

MariaDB [(none)]> create database zabbix_proxy_active character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix_proxy_active.* to [email protected] identified by 'zabbix_proxy_active';

2.zabbix-proxy代理服务端(ubuntu1804)

1)必要的软件包

zabbix-proxy-mysql

2)配置proxy配置文件

root@ubuntu1804:/etc/zabbix# grep '^[a-Z]' /etc/zabbix/zabbix_proxy.conf
ProxyMode=0  #主动模式
Server=192.168.1.14
Hostname=zabbix_proxy_active
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=0
EnableRemoteCommands=1 #开启允许远程命令
LogRemoteCommands=1
PidFile=/var/run/zabbix/zabbix_proxy.pid
SocketDir=/var/run/zabbix
DBHost=192.168.1.14
DBName=zabbix_proxy_active
DBUser=zabbix_proxy_active
DBPassword=zabbix_proxy_active
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=30
ExternalScripts=/usr/lib/zabbix/externalscripts
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
LogSlowQueries=3000

3)测试是否能够登录数据库

root@ubuntu1804:~# mysql -uzabbix_proxy_active -pzabbix_proxy_active -h192.168.1.14
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6951
Server version: 10.1.40-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| zabbix_proxy_active |
+---------------------+
2 rows in set (0.00 sec)

4)数据库初始化

zcat /usr/share/doc/zabbix-proxy-mysql/schema.sql.gz | mysql -uzabbix_proxy_active -pzabbix_proxy_active 
-h192.168.1.14 zabbix_proxy_active

5)启动服务

root@ubuntu1804:~# systemctl restart zabbix-proxy
root@ubuntu1804:~# systemctl enable zabbix-proxy

6)查看启动的服务

root@ubuntu1804:~# ss -tnlp
State                    Recv-Q                    Send-Q                                        Local Address:Port                                        Peer Address:Port                                                                                                                                                                                                                  
LISTEN                   0                         128                                                 0.0.0.0:10051                                            0.0.0.0:*                      
 users:(("zabbix_proxy",pid=3559,fd=4),("zabbix_proxy",pid=3558,fd=4),("zabbix_proxy",pid=3557,fd=4),("zabbix_proxy",pid=3556,fd=4),("zabbix_proxy",pid=3555,fd=4),("zabbix_proxy",pid=3554,fd=4),("zabbix_proxy",pid=3553,fd=4),("zabbix_proxy",pid=3552,fd=4),("zabbix_proxy",pid=3551,fd=4),("zabbix_proxy",pid=3550,fd=4),("zabbix_proxy",pid=3549,fd=4),("zabbix_proxy",pid=3548,fd=4),("zabbix_proxy",pid=3547,fd=4),("zabbix_proxy",pid=3546,fd=4),("zabbix_proxy",pid=3545,fd=4),("zabbix_proxy",pid=3544,fd=4),("zabbix_proxy",pid=3543,fd=4),("zabbix_proxy",pid=3542,fd=4),("zabbix_proxy",pid=3541,fd=4),("zabbix_proxy",pid=3540,fd=4),("zabbix_proxy",pid=3539,fd=4),("zabbix_proxy",pid=3538,fd=4),("zabbix_proxy",pid=3537,fd=4),("zabbix_proxy",pid=3536,fd=4),("zabbix_proxy",pid=3525,fd=4))
LISTEN                   0                         80                                                  0.0.0.0:3306                                             0.0.0.0:*                      
 users:(("mysqld",pid=4094,fd=17))
……

3.zabbix-agent客户端(centos7.6)

1)安装必要的包

zabbix-agent
nginx

2)配置agent配置文件

[root@nginx zabbix_agentd.d]# grep '^[a-Z]' /etc/zabbix/zabbix_agentd.conf
EnableRemoteCommands=1  #一定要开启,否则导致无法执行远程命令
Server=192.168.1.14,192.168.1.20  #同时指定server端和proxy代理端
ServerActive=192.168.1.20  #指定主动模式的proxy代理端
Hostname=192.168.1.16  #给本机指定一个主机名,web端上天添加的主机名必须和此处主机名相同,否则会导致数据采集失败
Timeout=30
Include=/etc/zabbix/zabbix_agentd.d/*.conf
UnsafeUserParameters=1  #支持远程命令传输的特殊字符,也必须开启

3)修改nginx配置文件,打开nginx访问状态页

[root@nginx ~]# vim /etc/nginx/nginx.conf
                ……
server {
                listen       8080 default_server;   #改为监听8080端口
                listen       [::]:8080 default_server;
                server_name  _;
                root         /usr/share/nginx/html;
                ……
                location / {
                }
             location /nginx_status {   #打开状态页
                     stub_status;
                     alllow 127.0.0.1;#允许本地访问
                    deny all;#为安全,除了本地,其他主机均不可访问状态页
             }
             ……

4)创建nginx的key值采集脚本,并赋予脚本执行权限

[root@nginx ~]# vim /etc/zabbix/zabbix_agentd.d/nginx.sh
nginx_status(){
nginx_port=$1
nginx_cmd=$2
ip=`ifconfig eth0 | awk NR==2 | awk '{print $2}'`   #取出本机的ip地址
nginx_active(){
curl ${ip}:${nginx_port}/nginx_status 2> /dev/null | grep Active | awk '{print $NF}'  #取出当前客户端活动连接数
}
nginx_accepts(){
curl ${ip}:${nginx_port}/nginx_status 2> /dev/null | awk NR==3 | awk '{print $1}'  #取出累积接收客户端请求连接的连接数
}
nginx_handled(){
curl ${ip}:${nginx_port}/nginx_status 2> /dev/null | awk NR==3 | awk '{print $2}'  #取出累积客户端请求处理数
}
nginx_requests(){
curl ${ip}:${nginx_port}/nginx_status 2> /dev/null | awk NR==3 | awk '{print $3}'  #取出累积的客户端总共发送的请求数 
}
nginx_reading(){
curl ${ip}:${nginx_port}/nginx_status 2> /dev/null | awk NR==4 | awk '{print $2}'  #取出当前正在读取客户端请求报文首部连接的连接数
}
nginx_writing(){
curl ${ip}:${nginx_port}/nginx_status 2> /dev/null | awk NR==4 | awk '{print $4}'  #取出当前正在向客户端发送响应报文连接的连接数
}
nginx_waiting(){
curl ${ip}:${nginx_port}/nginx_status 2> /dev/null | awk NR==4 | awk '{print $6}'  #取出当前正在等待客户端发来请求空闲连接的连接数
}
nginx_connecting(){
charactor=`curl ${ip}:${nginx_port}/nginx_status 2> /dev/null | grep -o Active`   #判断nginx服务是否为运行状态
if [ "$charactor" == "Active" ];then
 echo 0; #0表示可以连接nginx服务
else
 echo 10; #10表示是无法连接到nginx服务,服务关闭
fi
}
case $nginx_cmd in
         active)
         nginx_active
         ;;
         accepts)
         nginx_accepts
         ;;
         handled)
         nginx_handled
         ;;
         requests)
         nginx_requests
         ;;
         reading)
         nginx_reading
         ;;
         writing)
         nginx_writing
         ;;
         waiting)
         nginx_waiting
         ;;
         connecting)
         nginx_connecting
         ;;
esac
}
nginx_status $1 $2

5)配置监控项key值配置文件

[root@nginx ~]# vim /etc/zabbix/zabbix_agentd.d/nginx_status_monitor.conf
UserParameter=nginx_status[*],/etc/zabbix/zabbix_agentd.d/nginx.sh $1 $2

6)查看编辑好的用于创建nginx模板所需的采集脚本文件和key值配置文件

[root@nginx ~]# ll /etc/zabbix/zabbix_agentd.d/
total 8
-rwxr-xr-x 1 root root 1350 Jul 19 20:37 nginx.sh
-rw-r--r-- 1 root root   74 Jul 19 20:43 nginx_status_monitor.conf

7)启动agent和nginx两个服务

[root@nginx ~]# systemctl restart zabbix-agent
[root@nginx ~]# systemctl enable zabbix-agent
[root@nginx ~]# systemctl start nginx
[root@nginx ~]# systemctl enable nginx

8)查看启动的服务

[root@nginx ~]# ss -tnlp
State       Recv-Q Send-Q                                                  Local Address:Port                                                 Peer Address:Port              
LISTEN      0      511                                                                 *:8080                                                                *:*                   
users:(("nginx",pid=50295,fd=6),("nginx",pid=50294,fd=6),("nginx",pid=50293,fd=6),("nginx",pid=50292,fd=6),
("nginx",pid=50291,fd=6))
LISTEN      0      128                                                                 *:10050                                                               *:*   
……              
    users:(("zabbix_agentd",pid=43802,fd=4),("zabbix_agentd",pid=43801,fd=4),("zabbix_agentd",pid=43800,fd=4),
("zabbix_agentd",pid=43799,fd=4),("zabbix_agentd",pid=43798,fd=4),("zabbix_agentd",pid=43797,fd=4))
……

9)测试访问nginx状态页

[root@nginx ~]# curl 127.0.0.1:8080/nginx_status
Active connections: 1 
server accepts handled requests
 1 1 1 
Reading: 0 Writing: 1 Waiting: 0

10)将zabbix用户提升为sudo超级用户

    [root@nginx ~]# vim /etc/sudoers
    #Defaults    requiretty   #一定要注释掉此行,会导致sudo超级用户无法执行远程命令
    ……
  ## Allow root to run any commands anywhere 
        root    ALL=(ALL)       ALL
        zabbix  ALL=(ALL)       NOPASSWD: ALL   
……

4.zabbix-server的web端创建一个主动模式的代理

zabbix实现对nginx监控并实现nginx服务自愈_第2张图片

5.zabbix-server的web端创建nginx模板

1)nginx_status模板创建

zabbix实现对nginx监控并实现nginx服务自愈_第3张图片

2)监控项创建

zabbix实现对nginx监控并实现nginx服务自愈_第4张图片

3)创建好的所有的nginx监控项

zabbix实现对nginx监控并实现nginx服务自愈_第5张图片

4)创建触发器

zabbix实现对nginx监控并实现nginx服务自愈_第6张图片

5)创建好的两个nginx触发器

zabbix实现对nginx监控并实现nginx服务自愈_第7张图片

6)创建当前状态图形

zabbix实现对nginx监控并实现nginx服务自愈_第8张图片

7)创建累计状态图形

zabbix实现对nginx监控并实现nginx服务自愈_第9张图片

8)再创建一个nginx监听端口状态图

zabbix实现对nginx监控并实现nginx服务自愈_第10张图片

9)创建聚合图形

zabbix实现对nginx监控并实现nginx服务自愈_第11张图片

10)将前面的监控图形添加聚合图形里,点击构造函数

zabbix实现对nginx监控并实现nginx服务自愈_第12张图片

11)点击更改进入添加界面

zabbix实现对nginx监控并实现nginx服务自愈_第13张图片

12)可以看到已成功添加监控图形到聚合图形里

zabbix实现对nginx监控并实现nginx服务自愈_第14张图片

13)查看创建好的图形

zabbix实现对nginx监控并实现nginx服务自愈_第15张图片

14)nginx_status状态模板创建完成

zabbix实现对nginx监控并实现nginx服务自愈_第16张图片

6.zabbix-server的web端添加监控主机

1)添加监控主机zabbix-agent并添加一个主动模式的代理

zabbix实现对nginx监控并实现nginx服务自愈_第17张图片

2)添加一个模板

zabbix实现对nginx监控并实现nginx服务自愈_第18张图片

3)添加完成

zabbix实现对nginx监控并实现nginx服务自愈_第19张图片

7.分别在zabbix-server端和zabbix-proxy端测试nginx服务的key值采集

1)分别下载zabbix-get测试工具

root@ubuntu1804:~# apt-get install zabbix-get -y 

2)连接状态测试

root@ubuntu1804:~# zabbix_get -s 192.168.1.16 -p 10050 -k nginx_status[8080,connecting]
0

3)接收客户端发送的请求连接的连接数测试

root@ubuntu1804:~# zabbix_get -s 192.168.1.16 -p 10050 -k nginx_status[8080,accepts]
5

4)正在读取客户端请求报文首部连接的连接数测试

root@ubuntu1804:~# zabbix_get -s 192.168.1.16 -p 10050 -k nginx_status[8080,reading]
0

8.web端查看监控主机zabbix-agent采集数据图形

1)nginx状态页累积状态图

zabbix实现对nginx监控并实现nginx服务自愈_第20张图片

2)nginx状态页当前状态图

zabbix实现对nginx监控并实现nginx服务自愈_第21张图片

3)查看nginx监听端口状态图,显示正常

zabbix实现对nginx监控并实现nginx服务自愈_第22张图片

9.web端建立邮件通知和创建nginx服务自愈动作

1)点击创建媒介类型

zabbix实现对nginx监控并实现nginx服务自愈_第23张图片

2)创建媒介类型,填写媒介类型信息,要求qq邮箱预先开启smtp服务

zabbix实现对nginx监控并实现nginx服务自愈_第24张图片

3)可以查看到已成功添加媒介类型

zabbix实现对nginx监控并实现nginx服务自愈_第25张图片

4)进入用户界面选择admin账户

选择admin账户

zabbix实现对nginx监控并实现nginx服务自愈_第26张图片

5)在选择报警媒介

zabbix实现对nginx监控并实现nginx服务自愈_第27张图片

6)添加创建好的媒介类型到此用户

zabbix实现对nginx监控并实现nginx服务自愈_第28张图片

7) 创建一个动作

zabbix实现对nginx监控并实现nginx服务自愈_第29张图片

8)在动作栏下添加触发条件

zabbix实现对nginx监控并实现nginx服务自愈_第30张图片

9)在操作栏添加一远程命令

zabbix实现对nginx监控并实现nginx服务自愈_第31张图片

10)操作栏再添加一个宕机通知信息,以及指定邮件的接收方

zabbix实现对nginx监控并实现nginx服务自愈_第32张图片

11)恢复操作栏添加恢复消息,同样指定邮件的接收者

zabbix实现对nginx监控并实现nginx服务自愈_第33张图片

10.测试nginx服务是否能接收到邮件通知以及实现自愈功能

1)先在在zabbix-agent客户端将nginx服务关闭

[root@nginx zabbix_agentd.d]# systemctl stop nginx

2)再zabbix-agent客户端快速查看nginx服务的状态,服务已经被关闭

[root@nginx ~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: inactive (dead)

3)nginx服务关闭后,在web端触了发仪表盘报警

zabbix实现对nginx监控并实现nginx服务自愈_第34张图片

4)接收到报警邮箱通知,nginx服务器断开连接

zabbix实现对nginx监控并实现nginx服务自愈_第35张图片

5)间隔3-5秒后,发现nginx服务自动重启,实现自愈

[root@nginx zabbix_agentd.d]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2019-07-19 16:43:10 CST; 12min ago
Process: 50272 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
Process: 50245 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
Process: 50243 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
……

6)在web端查看nginx-8080监听图形,数值从超出警戒线到下降恢复到正常值

zabbix实现对nginx监控并实现nginx服务自愈_第36张图片

7)仪表盘又自动恢复正常

zabbix实现对nginx监控并实现nginx服务自愈_第37张图片

8)接收到故障自动恢复成功的邮箱通知

zabbix实现对nginx监控并实现nginx服务自愈_第38张图片