监控基本概述


什么是监控

在运维职业生涯中,及整套公司的服务架构、项目架构、产品的生命周期,监控系统都是最重要的一环,事前及时预警发现故障,事后提供详细的数据用于追查定位问题。


为什么监控?

  • 对系统不间断实时监控
  • 实时反馈系统的状态
  • 保证服务可靠性、安全性
  • 保证业务持续稳定运行

如何进行监控,监控内存的使用率

  • 如何查看系统内存的使用率
  • 监控内存哪些指标,物理内存,虚拟内存
  • 如何获取具体的值,怎么得到使用率
  • 道道多大的值则进行报警

常见的运维监控工具

  • Cacti
Cacti是一套基于PHP、MySQL、SNMP及RRDTool开发的网络流量监测图形分析工具。 简单的说Cacti就是一个PHP程序。它通过使用SNMP协议获取远端网络设备和相关信息(其实就是使用
Net-SNMP 软件包的snmpget 和snmpwalk 命令获取)并通过RRDTOOL工具绘图,通过PHP程序展现出来。我们使用它可以展现出监控对象一段时间内的状态或者性能趋势图。
  • Nagios
Nagios是一款开源的免费网络监视工具,能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发出邮件或短信报警第一时间通知网
站运维人员,在状态恢复后发出正常的邮件或短信通知。
  • Zabbix
zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供强大的通知机制以让系统运维
人员快速定位/解决存在的各种问题。
  • Ganglia
Ganglia是一款为HPC(高性能计算)集群而设计的可扩展的分布式监控系统,它可以监视和显示集群中的节点的各种状态信息,它由运行在各个节点上的gmond守护进程来采集CPU 、内存、硬
盘利用率、I/O负载、网络流量情况等方面的数据,然后汇总到gmetad守护进程下,使用rrdtool存储数据,最后将历史数据以曲线方式通过PHP页面呈现。
  • Centreon
Centreon是一款功能强大的分布式IT监控系统,它通过第三方组件可以实现对网络、操作系统和应用程序的监控:首先,它是开源的,我们可以免费使用它;
  • Prometheus
Prometheus是一套开源的系统监控报警框架,它既适用于面向服务器等硬件指标的监控,也适用于高动态的面向服务架构的监控。对于现在流行的微服务,Prometheus的多维度数据收集和数
据筛选查询语言也是非常的强大。Prometheus是为服务的可靠性而设计的,当服务出现故障时,它可以使你快速定位和诊断问题。
  • Grafana
Grafana是一个开源的度量分析与可视化套件,通俗的说,Grafana就是一个图形可视化展示平台,它通过各种炫酷的界面效果展示我们的监控数据。
  • Lepus
Lepus(天兔) 是数据库企业监控系统,针对互联网企业开发的一款专业、强大的企业数据库监控管理系统,企业通过Lepus可以对数据库的实时健康和各种性能指标进行全方位的监控。
  • Open-Falcon
OpenFalcon是一种企业级,高可用,可扩展的开源监控解决方案。

如果进入一加新公司,该如何入手监控

监控是需要站在公司业务角度考虑的,而不仅仅是针对某个监控技术的使用。

  • 公有云:云监控 + 监控工具实现

  • 硬件监控:CPU温度 风扇转速 主板温度 电压 功率 机房巡检 ipmi工具监控 ipmitool命令

  • 系统监控:CPU 内存 磁盘 网络 进程 TCP ICMP

  • 服务监控:Nginx PHP redis mysql tomcat jetty apache

  • Web监控:请求时间 响应时间 加载时间

  • 网络监控:SNMP 第三方 监控宝

  • 业务监控:业务状态 网页速度 pv ip uv 用户的活跃数量 成单量

  • 日志监控:ELK 日志易

  • 安全监控:FIrewalld WAF 第三方工具 安全宝 牛盾云 安全狗

  • API监控:针对业务的接口

  • 分布式监控:多机房管理

  • 自动化监控:网络发现(被动的模式) 自动注册(主动的模式)

  • 容器:微服务的监控 docker k8s 监控

  • 数据库监控



单机时代如何监控


常用监控命令

  • 监控CPU:w top htop glaces uptime ps
  • 监控内存:free ps top htop glaces
  • 监控磁盘:df glances iotop iostat dstat
  • 监控网络:ifconfig glances iftop nethogs
  • TCP监控:netstat -ant ss -ant

监控命令汇总:https://man.linuxde.net/par/3


监控磁盘根分区使用率

设定一个阈值,当达到这个阈值时触发报警,并发送邮件给系统管理员。然后添加定时任务,定时监控。

  • 脚本:
#!/bin/bash
Hostname_Ip=$(hostname)-$(ifconfig eth0 | awk 'NR==2{print $2}')
Date=$(date +%F-%T)
while true
do
    Disk_Use=$(df -h | awk '/\/$/{print $(NF-1)}')
    if [ ${Disk_Use%\%} -gt 10 ];then
        echo "$Date$Hostname_Ip:磁盘根分区的使用率不正常,当前使用率为:$Disk_Use"
    fi
    sleep 5
done

这个是对单台服务器进行的监控,如果有几十台甚至更多的服务器,这种方式远远不能满足需求。

  • 借助第三方的监控工具:

比如使用比较多的Zabbix监控工具

zabbix版本:1.0    2.0        3.0        4.0        5.0
版本改动:
    2.0    ---    3.0        改动非常大
    3.0    ---    4.0        改动比较小

zabbix的缺点:
    • 数据库瓶颈,使用mysql作为底层存储,大数据读写的时候,对于数据库的压力非常大
    • 需要在主机中安装agent
    • 对容器监控支持不好,需要自己扩展。

zabbix 4.0中文版使用手册: https://www.zabbix.com/documentation/4.0/zh/manual


Zabbix安装部署


Zabbix概述

架构
Zabbix 由几个主要的功能组件组成,其功能介绍如下所示。

Server
Zabbix server 是 Zabbix软件的核心组件,agent 向其报告可用性、系统完整性信息和统计信息。server也是存储所有配置信息、统计信息和操作信息的核心存储库。

数据库
所有配置信息以及 Zabbix 采集到的数据都被存储在数据库中。

Web 界面
为了从任何地方和任何平台轻松访问 Zabbix ,我们提供了基于 web 的界面。该界面是 Zabbix server 的一部分,通常(但不一定)和 Zabbix server 运行在同一台物理机器上。

Proxy
Zabbix proxy 可以代替 Zabbix server采集性能和可用性数据。Zabbix proxy在Zabbix的部署是可选部分;但是proxy的部署可以很好的分担单个Zabbix server的负载。

Agent
Zabbix agents 部署在被监控目标上,用于主动监控本地资源和应用程序,并将收集的数据发送给 Zabbix server。

数据流
另外,回过头来整体的了解下 Zabbix 内部的数据流对Zabbix的使用也很重要。首先,为了创建一个采集数据的监控项,您就必须先创建主机。其次,在任务的另外一端,必须要有监控项才
能创建触发器(trigger),必须要有触发器来创建动作(action)。因此,如果您想要收到类似“X个server上CPU负载过高”这样的告警,您必须首先为 Server X 创建一个主机条目,其次
创建一个用于监控其 CPU的监控项,最后创建一个触发器,用来触发 CPU负载过高这个动作,并将其发送到您的邮箱里。虽然这些步骤看起来很繁琐,但是使用模板的话,实际操作非常简单。
也正是由于这种设计,使得 Zabbix 的配置变得更加灵活易用。

安装zabbix

  • 配置Zabbix的yum源仓库

安装一个Zabbix官方源仓库:

rpm -ivh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-2.el7.noarch.rpm

改用官方源为阿里云镜像源:

由于官方源是国外的镜像仓库,速度非常慢,改用阿里云的镜像仓库会非常快。只需在官方源的repo文件中修改URL即可。

sed -i 's@http://repo.zabbix.com@https://mirrors.aliyun.com/zabbix@g' /etc/yum.repos.d/zabbix.repo
  • 安装zabbix

安装Zabbix 服务端,web前端,客户端

yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent

安装数据库

  • 安装mariadb
yum -y install mariadb-server
  • 启动mariadb
systemctl enable mariadb
systemctl restart mariadb
  • 配置数据库

创建初始数据库

mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by 'zabbix';

导入zabbix的初始数据库

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -pzabbix zabbix

修改配置文件

  • 配置zabbix服务端/etc/zabbix/zabbix_server.conf
[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
  • 配置PHP前端,修改时区
sed -i 's@# php_value date.timezone Europe/Riga@php_value date.timezone Asia/Shanghai@g' /etc/httpd/conf.d/zabbix.conf
  • 启动服务
systemctl enable zabbix-server zabbix-agent httpd 
systemctl restart zabbix-server zabbix-agent httpd 
  • 检查端口

zabbix服务端端口为10051,客户端端口为10050


访问web界面,初始化安装

web界面地址:http://10.0.0.71/zabbix

  • 安装界面

接着下一步,检查安装zabbix的先决条件

填写连接数据库的相关信息

  • 安装成功界面



快速监控一台服务器

需要准备一台新的服务器,作为zabbix服务的agent端

安装并配置agent端

  • 安装agent

提前配置好zabbix的yum源仓库

yum -y install zabbix-agent 
  • 修改配置文件

修改agent配置文件/etc/zabbix/zabbix_agent.conf,修该被动模式(Passive)下的配置

##### Passive checks related
Server=172.16.1.71

启动agent

systemctl enable zabbix-agent
systemctl start zabbix-agent

zabbix服务端添加组


添加主机



Zabbix数据库拆分

初始化远程数据库

mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to 'zabbix'@'172.16.1.%' identified by 'zabbix';

修改zabbix配置文件

需要迁移的数据库环境已经配置好了,现在修改zabbix服务端连接数据库的配置

[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf
DBHost=172.16.1.51

[root@zabbix-server ~]# vim /etc/zabbix/web/zabbix.conf.php
$DB['SERVER']   = '172.16.1.51'; 

备份数据库

  • 备份zabbix服务端的数据库
mysqldump -uroot -p123 -B zabbix > zabbix.sql

把备份的sql文件拷贝到需要迁移的服务器

  • 导入备份的sql文件
mysql -uroot -p123 zabbix < zabbix.sql

重启服务

zabbix服务端重启zabbix服务,关闭本地数据库

systemctl restart zabbix-server httpd
systemctl stop mariadb


Zabbix自定义监控项目

监控系统用户登录的数量

需要在zabbix的agent端,添加自定义的监控配置

  • /etc/zabbix/zabbix_agentd.d/目录下添加配置文件

在配置文件里自定义一个key和获取用户数量的命令

[root@web03]# /etc/zabbix/zabbix_agentd.d/
UserParameter=system.login.number,uptime | awk '{print $(NF-6)}'
  • 重启agent服务
systemctl restart zabbix-agent
  • 在客户端上进行检验键值
[root@web03 ~]# zabbix_agentd -t system.login.number
system.login.number                           [t|4]

关于zabbix_agent命令获取键值的参数说明

d        #有小数部分的数字
m        #不受支持的
s        #文本,最大长度不限
t        #文本,最大长度不限
u        #正整数
  • 服务端测试获取键值

在服务端安装zabbix的get工具,用get工具来获取agent端的值

yum -y install zabbix-get 

关于get用具的用法

#命令格式
zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] -k item-key

#选项
    -s        #主机名或者IP地址
    -p        #端口
    -I        #IP地址
    -k        #监控项的key

获取agent端的键值

[root@zabbix-server ~]# zabbix_get -s 172.16.1.9 -p 10050 -k system.login.number
4
  • web界面添加监控项

配置好后,保存退出即可。然后查看监控项是否配置成功


Zabbix自定义触发器


监控TCP的11种状态

想要监控TCP的11种状态,首先获取TCP的状态。

  • agent端配置文件编写自定义项。
[root@web03 ~]# cat /etc/zabbix/zabbix_agentd.d/test1.conf 
UserParameter=system.login.number,uptime | awk '{print $(NF-6)}'
UserParameter=tcp.state[*],netstat -ant | grep -c $1

重启agent服务

systemctl restart zabbix-agent

本机测试获取键值

[root@web03 ~]# zabbix_agentd -t tcp.state[LISTEN]
tcp.state[LISTEN]                             [t|8]
  • 服务端进行获取值
[root@zabbix-server ~]# zabbix_get -s 172.16.1.9 -p 10050 -k tcp.state[LISTEN]
8
  • web界面添加items

配置完后,保存退出


自定义触发器深入



Zabbix自定义报警

配置动作

就是配置报警的内容的格式、发送报警给管理员用户等。可根据需求自行创建Action,也可以直接使用默认的Action。


配置邮件报警

邮件报警配置完成


配置微信报警

配置微信报警需要一个企业微信号,提前注册好。企业微信注册好后,需要自行创建一个应用。

  • 企业微信配置

  • 手机微信关注企业号

在手机微信客户端,扫描企业的二维码关注,随后当有报警信息时,在企业微信号里都能收到通知。

  • 报警脚本

这里用脚本来执行报警信息。将脚本放在/usr/lib/zabbix/alertscripts/目录下

[root@zabbix-server ~]# cat /usr/lib/zabbix/alertscripts/weixin.sh 
#!/bin/bash
CropID='wwe81f9f79dde15536'            #企业ID
Secret='u_SJG43-SAgG3fQKFeY23lVVGzmBMAltfInpUP_AuwU'    #企业号中的应用Secret
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret" 
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}')

PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"

function body() {
local int AppID=1000002                  #企业号中的应用id
local UserID=$1                          #部门成员id,zabbix中定义的微信接收者
local PartyID=2                          #部门id,定义了范围,组内成员都可接收到消息
local Msg=$(echo "$@" | cut -d" " -f3-)  #过滤出zabbix中传递的第三个参数
printf '{\n'
printf '\t"touser": "'"$User"\"",\n"
printf '\t"toparty": "'"$PartyID"\"",\n"
printf '\t"msgtype": "text",\n'
printf '\t"agentid": "'" $AppID "\"",\n"
printf '\t"text": {\n'
printf '\t\t"content": "'"$Msg"\""\n"
printf '\t},\n'
printf '\t"safe":"0"\n'
printf '}\n'
                                                                                                            }
/usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL
  • zabbix的web界面创建新的媒介

zabbix监控默认没有微信报警媒介,需要我们自行创建



常用的触发器函数

表达式函数

  • and 并且
  • or 或者

触发器函数

  • avg (sec|#num,)

    指定评估期内的一个item的平均值。

sec or #num - 评估期以多少秒或最新值个数(个数跟在#号后)表示
time_shift (可选) - 评估时间点相对于当前时间的偏移量

支持的值类型: float, int

Examples:
⇒ avg(#5) → 最新5个值的平均值
⇒ avg(1h) → 最近一小时的平均值
⇒ avg(1h,1d) → 一天前的一小时内的平均值
  • diff

    比较最近获取值与之前获取值是否相同。

支持值类型: float, int, str, text, log

返回值:
1 - 两值不等
0 - 两值相等
  • last (sec|#num,)

最近的值

sec (可省略) or #num - 最新的第N个值
time_shift (可选) - 参考avg()函数

支持值类型: float, int, str, text, log

注意此处的 #num 参数和在其它函数中的作用不一样。
例如:
last() 通常等同于 last(#1)
last(#3) - 第三个最新值 (不是三个最新值)

如果在history中同一秒有多个值存在,Zabbix不能保证值的精确顺序。
  • nodata (sec)

    检查评估期内是否接收到数据。

sec - 评估期,单位为秒。
评估期不应该少于30秒,因为timer处理器每30秒调用一次该函数。

nodata(0) 不被允许.

支持值类型: any

返回值:
1 - 指定评估期没有接收到数据
0 - 其它

注意,如果在第一个参数指定的时间内出现以下问题,该函数会报错:
- Zabbix server被重启
- 刚出维护期
- item被添加或重新激活
- 错误显示在触发器配置界面的 Info 列。


Zabbix自定义图形

解决zabbix中文乱码问题

在zabbix设置中文显示后,监控图形的一些中文会显示乱码,这是由于linux系统无法识别造成的。可以拷贝一份中文字体到zabbix服务的字符集目录下。

拷贝window系统的中文字符集到zabbix的/usr/share/zabbix/assets/fonts/目录下,并重命名为graphfont.ttf

#备份原文件
mv /usr/share/zabbix/assets/fonts/graphfont.ttf{,.bak}

#重命名中文字字符集文件
mv simhei.ttf graphfont.ttf

在刷新zabbix页面,乱码问题就解决率。

自定义TCP 11种状态的图形


自定义图形树

自定义图形树需要一款zabbix插件(graphtrees)来实现。

  • 下载graphtree
cd /usr/share/zabbix
git clone https://github.com/OneOaaS/graphtrees.git
  • 导入graphtree

导入graphtree,需要安装patch来修补文件

yum -y install patch
patch -Np0 < /usr/share/zabbix/graphtrees/graphtree3.0.4.patch
  • 修改httpd配置文件

使用patch导入文件后,会生成一个oneoaas目录,给目授权

chown -R apache.apache /usr/share/zabbix/graphtrees/oneoaas

在httpd配置文件中添加别名路径

echo "Alias /oneoaas /usr/share/zabbix/oneoaas" > /etc/httpd/conf.d/zabbix.conf
  • 重启服务
systemctl restart httpd

刷新zabbix的web界面,可以看到图形树了



使用Grafana渲染Zabbix监控

Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。

下载安装Grafana

  • 下载grafana

此处下载6.6.2版本作为示例

#官方源下载
wget https://dl.grafana.com/oss/release/grafana-6.6.2-1.x86_64.rpm

#清华源下载
wget https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-6.6.2-1.x86_64.rpm
  • 安装服务
yum -y localinstall grafana-6.6.2-1.x86_64.rpm
  • 启动服务
systemctl enable grafana-server
systemctl start grafana-server
  • 检查服务是否启动

grafana默认的端口号为3000

[root@zabbix-server ~]# netstat -lntp | grep 3000
tcp6       0      0 :::3000                 :::*                    LISTEN      129582/grafana-serv 

登录web界面

使用浏览器访问http://10.0.0.71:3000。

默认账号:admin

密码:admin


安装zabbix插件

在当前的6.6.2版本的Grafana中,默认是没有zabbix插件的。要想渲染zabbix出图,需要安装插件才行。

  • 安装zabbix插件

方法一:在官网web界面查找

grafana-cli plugins install alexanderzobnin-zabbix-app

方法二:在命令行查询zabbix插件并安装

[root@zabbix-server ~]# grafana-cli plugins list-remote | grep zabbix
id: alexanderzobnin-zabbix-app version: 3.11.0
[root@zabbix-server ~]# grafana-cli plugins install alexanderzobnin-zabbix-app
  • 配置zabbix插件,连接zabbix获取items

2020-05-25 22:48:07 星期一

  • 查看Grafana渲染的图


添加自定义图像


导入、导出仪表盘

  • 导入dashboards

导入仪表盘的方法较多,可以导入官方网站提供的一些dashboards,也可以导入自己导出的dashboards。

  1. 导入官方的dashboards

选择好后,会新进入官网的dashboards页面,选择合适的dashboards后复制其ID号。然后回到Grafana导入界面输入ID号即可导入。

这就是新导入的dashboards。

  1. 导入json文件的dashboards

  • 导出dashboards

然后就成功导出了,后面需要使用的时候,可以直接导入这个dashboards。



Zabbix监控Nginx

监控nginx的状态

其实这里用到了nginx的ngx_http_stub_status_module模块。通过这个模块,显示网站的接入信息,比如:TCP连接数、请求数 等。

  • 准备nginx环境

安装好nginx服务后,在nginx配置文件中编写一个状态模块的location,启用ngx_http_stub_status_module这个模块。例如下面的写法

[root@web03 conf.d]# cat status.conf 
server {
    listen 80;
    server_name _;

    #获取nginx状态
    location /nginx_status {
        stub_status on;    
    }
}

检查语法,重启nginx服务

nginx -t 
systemctl restart nginx 

使用curl命令获取nginx状态信息

[root@web03 ~]# curl http://10.0.0.9/nginx_status
Active connections: 1 
server accepts handled requests
 151 151 151 
Reading: 0 Writing: 1 Waiting: 0 
  • 编写获取nginx状态的脚本

把脚本放在/server/scripts/目录下

cat /server/scripts/nginx_status.sh

#!/bin/bash

NGINX_PORT=80  #如果端口不同仅需要修改脚本即可,否则修改xml很麻烦
NGINX_COMMAND=$1


nginx_active(){
    /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk '/Active/ {print $NF}'
}

nginx_reading(){
    /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk '/Reading/ {print $2}'
}

nginx_writing(){
    /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk '/Writing/ {print $4}'
}

nginx_waiting(){
    /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk '/Waiting/ {print $6}'
}

nginx_accepts(){
    /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk 'NR==3 {print $1}'
}

nginx_handled(){
    /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk 'NR==3 {print $2}'
}

nginx_requests(){
    /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" |awk 'NR==3 {print $3}'
}


case $NGINX_COMMAND in
    active)
        nginx_active;
        ;;
    reading)
        nginx_reading;
        ;;
    writing)
        nginx_writing;
        ;;
    waiting)
        nginx_waiting;
        ;;
    accepts)
        nginx_accepts;
        ;;
    handled)
        nginx_handled;
        ;;
    requests)
        nginx_requests;
        ;;
    *)
        echo $"USAGE:$0 {active|reading|writing|waiting|accepts|handled|requests}"
esac
  • 配置zabbix的agent端的key
[root@web03 ~]# cat /etc/zabbix/zabbix_agentd.d/nginx_status.conf
UserParameter=nginx_status[*],/bin/bash /server/scripts/nginx_status.sh "$1"
[root@web03 ~]# systemctl restart zabbix-agent.service

测试是否能获取key值

#agent端测试
[root@web03 ~]# zabbix_agentd -t nginx_status[requests]
nginx_status[requests]                        [t|106476]

#zabbix服务端测试
[root@zabbix-server ~]# zabbix_get -s 172.16.1.9 -p 10050 -k nginx_status[requests]
106582
  • web界面导入模板

  • 查看导入好后的的数据信息

先把模板关联到web03这台主机上

8



监控PHP状态


修改配置文件

  • 编辑php-fpm配置文件
[root@web03 ~]# vim /etc/php-fpm.d/www.conf
pm.status_path = /phpfpm_status

重启php-fpm服务

systemctl restart php-fpm
  • 配置nginx配置文件

在nginx配置文件当中,加入一个location

[root@web03 conf.d]# cat status.conf 
server {
    listen 80;
    server_name _;

    #获取php-fpm状态
    location /phpfpm_status {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    #获取nginx状态
    location /nginx_status {
        stub_status on;
    }

}

重启nginx服务

systemctl restart nginx 

编写获取php-fpm状态的脚本

cat /server/scripts/phpfpm_status.sh

#!/bin/bash

PHPFPM_COMMAND=$1
PHPFPM_PORT=80

start_since(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^start since:/ {print $NF}'
}

accepted_conn(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^accepted conn:/ {print $NF}'
}

listen_queue(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^listen queue:/ {print $NF}'
}

max_listen_queue(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^max listen queue:/ {print $NF}'
}

listen_queue_len(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^listen queue len:/ {print $NF}'
}

idle_processes(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^idle processes:/ {print $NF}'
}

active_processes(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^active processes:/ {print $NF}'
}

total_processes(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^total processes:/ {print $NF}'
}

max_active_processes(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^max active processes:/ {print $NF}'
}

max_children_reached(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_status" |awk '/^max children reached:/ {print $NF}'
}

slow_requests(){
    /usr/bin/curl -s "http://127.0.0.1:"$PHPFPM_PORT"/phpfpm_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

给脚本添加执行权限

chmod +x /server/scripts/redis.sh

配置获取状态的key

[root@web03 ~]# cat /etc/zabbix/zabbix_agentd.d/phpfpm_status.conf
UserParameter=phpfpm_status[*],/bin/bash /server/scritps/phpfpm_status.sh "$1"    

重启agent服务

systemctl restart zabbix-agent.service

测试是否可以获得key值

#在agent端测试
[root@web03 ~]# zabbix_agentd -t phpfpm_status[accepted_conn]
phpfpm_status[accepted_conn]                  [t|107]

#在服务端测试
[root@zabbix-server ~]# zabbix_get -s 172.16.1.9 -p 10050 -k phpfpm_status[accepted_conn]
182

web界面导入模板

  • 查看导入好后的的数据信息

先把模板关联到web03这台主机上



监控MySQL


部署mysql环境

监控mysql,首先要让监控的服务器要安装好数据库服务。这里以CentOS 7上默认的mariadb为例

#安装mariadb
yum -y install mariadb-server 

#启动、开机自启
systemctl enable mariadb
systemctl start mariadb

#设置数据库密码
mysqladmin password '123'

安装部署percona

[root@web03 ~]# yum -y install https://www.percona.com/redir/downloads/percona-release/redhat/1.0-15/percona-release-1.0-15.noarch.rpm
[root@web03 ~]# yum -y install percona-zabbix-templates

查看percona目录结构

[root@web03 ~]# tree /var/lib/zabbix/percona/
/var/lib/zabbix/percona/
├── scripts
│   ├── get_mysql_stats_wrapper.sh
│   └── ss_get_mysql_stats.php
└── templates
    ├── userparameter_percona_mysql.conf
    └── zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.8.xml

2 directories, 4 files

配置percona的数据库连接配置

[root@web03 ~]# vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php 
$mysql_user = 'root';
$mysql_pass = '123';
$mysql_port = 3306;

这里需要注意下percona自带的脚本/var/lib/zabbix/percona/get_mysql_stats_wrapper.sh,修改下连接数据库的用户和密码。保证可以正确连进数据库获取key值


配置agent端的key

  • 拷贝percona目录下的userparameter_percona_mysql.conf文件到agent配置文件目录下
cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf  /etc/zabbix/zabbix_agentd.d/
  • 重启服务
systemctl restart zabbix-agent
  • 测试获取key值
#agent端测试
[root@web03 ~]# zabbix_agentd -t MySQL.file-fsyncs
MySQL.file-fsyncs                             [t|3]

#server端测试
[root@zabbix-server ~]# zabbix_get  -s 172.16.1.9 -p 10050 -k MySQL.file-fsyncs
3

WEB页面导入模板

  • 到入模板

模板在/var/lib/zabbix/percona/templates/目录下,拷贝到PC桌面,然后浏览器导入

模板文件为zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.8.xml

  • 查看mysql状态



监控Redis


安装部署redis服务

  • 安装redis
yum -y install redis
  • 配置redis服,添加redis密码
echo "requirepass 123456" >> /etc/redis.conf
  • 启动、开机自启服务
systemctl enable redis
systemctl start redis

获取redis信息的脚本

cat /server/scripts/reids_status.sh

#!/bin/bash
R_COMMAND="$1"
R_PORT="6379" #根据实际情况调整端口
R_SERVER="127.0.0.1" #根据具体情况调整IP地址
PASSWD="123456" #如果没有设置Redis密码,为空即可
redis_status(){
    (echo -en "AUTH $PASSWD\r\nINFO\r\n";sleep 1;) | /usr/bin/nc "$R_SERVER" "$R_PORT" > /tmp/redis_"$R_PORT".tmp
    REDIS_STAT_VALUE=$(grep "$R_COMMAND:" /tmp/redis_"$R_PORT".tmp | cut -d ':' -f2)
    echo "$REDIS_STAT_VALUE"
}
case $R_COMMAND in
    used_cpu_user_children)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    used_cpu_sys)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    total_commands_processed)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    role)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    lru_clock)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    latest_fork_usec)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    keyspace_misses)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    keyspace_hits)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    keys)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    expired_keys)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    evicted_keys)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    connected_clients)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    changes_since_last_save)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    blocked_clients)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    rdb_bgsave_in_progress)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    aof_rewrite_in_progress)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    used_memory_peak)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    used_memory)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    used_cpu_user)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    used_cpu_sys_children)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    total_connections_received)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    cluster_enabled)
        redis_status "$R_PORT" "$R_COMMAND"
        ;;
    *)
        echo $"USAGE:$0 {used_cpu_user_children|used_cpu_sys|total_commands_processed|role|lru_clock|latest_fork_usec|keyspace_misses|keyspace_hits|keys|expired|expired_keys|connected_clients|changes_since_last_save|blocked_clients|rdb_bgsave_in_progress|used_memory_peak|used_memory|used_cpu_user|used_cpu_sys_children|total_connections_received|aof_rewrite_in_progress|cluster_enabled}"
esac

给脚本添加执行权限

chmod +x /server/scripts/redis.sh

配置获取redis状态的key

[root@web03 ~]# cat /etc/zabbix/zabbix_agentd.d/redis_status.conf
UserParameter=redis_status[*],/bin/bash /server/scripts/redis_status.sh "$1"

重启agent服务

systemctl restart zabbix-agent

测试获取key值

#agent端测试
[root@web03 ~]# zabbix_agentd -t redis_status[used_cpu_user_children]
redis_status[used_cpu_user_children]          [t|0.00]

#server端测试
[root@zabbix-server ~]# zabbix_get  -s 172.16.1.9 -p 10050 -k redis_status[used_cpu_user_children]
0.00

web上导入模板

  • 导入模板


查看web的获取的key值



监控JMX


启用zabbix的JMX监控,需要在服务端安装zabbix-java-gateway软件,用它来获取客户端的数据。

工作流程

  • zabbix-server找zabbix-java-gateway获取客户端java环境数据
  • zabbix-java-gateway找Java的客户端zabbix-agent获取数据
  • Java的客户端zabbix-agent将数据采集好返回给zabbix-java-gateway
  • zabbix-java-gateway将获取的数据返回给zabbix-server
  • zabbix-server进行数据分析,将数据存储到数据库,数据库将其数据通过zabbix-web展示给用户

客户端安装部署tomcat

  • 部署java环境

安装jdk,可使用多种方式,二进制包、rpm包安装、yum安装等

#yum安装
yum -y install java-1.8.0-openjdk

#rpm安装
rpm -ivh jdk-8u181-linux-x64.rpm
  • 部署tomcat

需要下载tomcat的二进制包,这里以apache-tomcat-8.0.27.tar.gz版本为例

tar xf apache-tomcat-8.0.27.tar.gz -C /usr/local/
ln -s /usr/local/apache-tomcat-8.0.27 /usr/local/tomcat
  • 开启tomcat的JMX监控

/usr/local/tomcat/bin/catalina.sh中添加如下配置。

CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=10.0.0.10
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"

注意:以上配置建议加在最所有配置最前面。

  • 启动tomcat
/usr/local/tomcat/bin/start.sh
  • 检查12345端口
[root@tomcat ~]# netstat -lntp | grep 12345
tcp6       0      0 :::12345                :::*                    LISTEN      7214/java

客户端安装zabbix-agent

yum -y zabbix-agent-4.0.20-1.el7.x86_64

修改配置,被动模式(Passive)配置。

zabbix-agent配置文件/etc/zabbix/zabbix_agentd.conf

ixroot@tomcat ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=172.16.1.71

启动服务

systemctl start zabbix-agent.service

服务端安装部署zabbix-java-gateway

  • 安装zabbix-java-gateway
yum -y install zabbix-java-gateway-4.0.20-1.el7.x86_64
  • 修改配置文件

修改gateway配置文件/etc/zabbix/zabbix_java_gateway.conf中的如下几项

LISTEN_IP="0.0.0.0"
LISTEN_PORT=10052
PID_FILE="/var/run/zabbix/zabbix_java.pid"
START_POLLERS=5
TIMEOUT=10

修改zabbix主配置文件/etc/zabbix/zabbix_server.conf

JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=5
  • 启动服务
systemctl start zabbix-java-gateway.service
systemctl start zabbix-server.service
  • 查看10052端口
[root@zabbix-server ~]# netstat -tlnp | grep 10052
tcp6       0      0 :::10052                :::*                    LISTEN      16729/java 

web界面

  • 新建主机

刷新页面(需等待一会),可以看到JMX监控已经开启

94

  • 查看JMX监控项数据



监控SNMP


SNMP介绍

简单网络管理协议(SNMP) 是专门设计用于在 IP 网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议,它是一种应用层协议。

MIB        管理网络通信的数据库
OID        数据库通过OID标识进行寻址

SNMP分为客户端和服务端,一般在管理主机上安装客户端,在被管理主机上安装服务端

安装SNMP服务端

在zabbix的agent端安装snmp服务端软件net-snmp

  • 安装net-snmp
yum -y install net-snmp
  • 修改配置文件

修改snmp密码

[root@tomcat ~]# vim /etc/snmp/snmpd.conf
com2sec notConfigUser  default       123456

添加如下配置

[root@tomcat ~]# vim /etc/snmp/snmpd.conf
view    systemview    included   .1
  • 启动snmp
systemctl start snmpd.service
systemctl enable snmpd.service

安装snmp客户端

在zabbix的server端安装snmp客户端软件net-snmp-utils

yum -y install net-snmp-utils

web界面

  • 添加新主机

97

  • 查看snmp状态、数据



Zabbxi的硬件及网站分析监控

物理硬件监控

CPU温度  风扇转速  主板温度  电压 功率  机房巡检  

可以用ipmitool命令进行监控

PV、UV、IP监控

开源软件:
    piwik    ===>   matomo
    js代码   ===>        AWstates
    GoAccess    #日志分析器


第三方工具:
    腾讯分析:  https://ta.qq.com/  
    百度统计:  https://tongji.baidu.com/
    谷歌分析:  https://analytics.google.com/


Matomo安装应用


准备nginx环境

  • nginx配置文件
[root@web03 ~]# cat /etc/nginx/conf.d/matomo.conf 
server {
    listen 80;
    server_name matomo.test.com;
    root /code/matomo;
    index index.php index.html;

    location ~* \.php$ {
        root /code/matomo;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
  • 重启nginx
#检查nginx语法
nginx -t

#重启nginx
systemctl restart nginx

创建数据库

新建matomo数据库

create database matomo charset utf8 collate utf8_bin;

给数据库授权

grant all privileges on matomo.* to 'matomo'@'localhost' identified by 'matomo';
grant all privileges on matomo.* to 'matomo'@'127.0.0.1' identified by 'matomo';

刷新权限

flush privileges;

安装matomo

  • 解压matomo源码包并授权
unzip matomo-latest.zip -d /code/
chown -R www.www /code/matomo
  • 在windows添加域名解析

现在windows的hosts文件C:\Windows\System32\drivers\etc\hosts中添加一条记录

10.0.0.9    matomo.test.com
  • 安装matomo

浏览器访问matomo.test.com进入安装界面。

第2步,系统检查,忽略强制SSL那一项,其他没报错直接下一步


.

安装使用GoAccess

安装GoAccess

  • 下载goaccess源码包
wget https://tar.goaccess.io/goaccess-1.4.tar.gz
  • 编译安装

解压安装包

tar xf goaccess-1.4.tar.gz

安装依赖

yum -y install GeoIP-devel ncurses-devel    

编译goaccess

cd goaccess-1.4
./configure --enable-utf8 --enable-geoip=legacy
make && make install

GoAccess应用

  • 指定日志文件
goaccess -f /var/log/nginx/access.log
  • 修改配置文件
[root@web03 ~]# vim /usr/local/etc/goaccess/goaccess.conf
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
  • 将分析的日志保存为html,在浏览器分析显示
goaccess -f /var/log/nginx/access.log -p /usr/local/etc/goaccess/goaccess.conf
  • 添加nginx配置文件
[root@web03 ~]# cat /etc/nginx/conf.d/goaccess.conf 
server{
    listen 80;
    server_name goaccess.test.com;
    root /code/log;
    index index.html;
}

创建站点目录

mkdir -p /code/log

重启服务

systemctl restart nginx
  • 将日志文件生成html文件
goaccess -f /root/access.log -o /code/log/index.html -p /usr/local/etc/goaccess/goaccess.conf