Zabbix 监控 Nginx Web 服务
配置 Nginx 状态页面
Nginx 的配置主要包括两个部分,一是修改默认端口,二是配置状态页。
修改默认端口
由于 Zabbix 使用的 Apache2 已经占用了 80 端口,而 Nginx 的默认端口也是 80,所以我们需要将 Nginx 的 default 配置修改为 80 端口以外的其他端口。
首先,实验楼环境下已经安装了 Nginx,可以查看下本实验环境下的 Nginx 版本和配置参数信息等。
sudo vim /etc/nginx/conf.d/default.conf
将里面的 listen 的那个 80 改成 8090 这个端口或者其他没有用的端口即可。
注意:8080 端口需要配置开启状态页,所以不能使用。
配置状态页
新建一个 conf 文件
cd /etc/nginx/conf.d/
sudo touch status.conf
使用 Vim 编辑器进行编辑。
sudo vim status.conf
键入下面的内容:
server {
listen 8080 default_server;
server_name localhost;
location /nginx_status {
stub_status on;
}
}
它表示监听 8080 端口,对于 URI /nginx_status,我们启用模块 stub_status 进行响应。
重新启动 nginx
先检查一下是否有语法错误:
sudo nginx -t
当看到 OK 字样后,再重新启动 Nginx
sudo service nginx start
查看状态页
通过 curl 工具读取状态页的内容。
curl localhost:8080/nginx_status
Shell 脚本入门
简单的尝试
首先,我们使用 touch 命令来创建一个 Shell 脚本。
cd ~
touch test1.sh
然后使用 Vim 来编辑它:
vim test1.sh
写入下面的内容
#!/bin/bash
echo "hello,shiyanlou1"
echo "My Fist Script"
在终端中输入下面的命令来执行我们编写的脚本
bash test1.sh
完整的演示:
https://doc.shiyanlou.com/courses/uid977658-20191011-1570774780869
变量
和第一个脚本采用的方式相同,先 touch test2.sh,再调用 vim test2.sh 进行编辑。输入的脚本内容如下:
#!/bin/bash
hello="hello,shiyanlou2"
echo $hello
它定义了一个变量 hello,它的值为 hello,shiyanlou2 ,最后我们打印了这个变量的值。当一个相同的值被多次使用时,定义变量是最好的方式,因为只需修改变量的值,所有引用变量值的地方就都被修改啦~
注意:= 的前后不能有空格。
使用下面的命令进行执行。
bash test2.sh
传入参数
变量的值是被写入到文件中,如果我们想根据命令的不同来让脚本有不同的行为,就必须采用传入参数的方式。
让我们通过实战来了解一下如何传入参数。新建一个 test3.sh,写入下面的内容。
#!/bin/bash
echo $1
这里 $1 就是我们传入的第一个参数。
输入下面的命令执行脚本。
bash test3.sh "hello,shiyanlou3"
这里 "hello,shiyanlou3" 就是我们传入的参数,注意 " (引号)是不会被打印的。
执行的结果如下:
函数
为了使相同的工作不再重复,我们通常定义函数来将相同的操作写到一个函数中,比如下面的代码中就定义了一个名为 hello 的函数。
#!/bin/bash
function hello {
echo "hello,shiyanlou4"
}
$1
只定义一个函数是不会进行任何操作的,我们必须要调用函数,这样它才会执行。当我们调用函数时,它就会执行函数体中的内容,这里的函数体是 echo "hello,shiyanlou4"。
为什么最后有 $1 呢?这其实是我们调用函数的方式,不过这里我们从命令行传入要调用的函数。如果我们执行的命令为 /bin/bash test4.sh hello,那么脚本就相当于:
#!/bin/bash
function hello {
echo "hello,shiyanlou4"
}
hello
这里直接写 hello 就意味着调用 hello 函数。
创建一个 test4.sh 来看一下结果吧:
配置 Agent
添加自定义参数
在 /etc/zabbix/zabbix_agentd.conf 配置文件中添加自定义参数,让 Agent 使用脚本来采集 Nginx 的数据,然后发送给 server。
sudo vim /etc/zabbix/zabbix_agentd.conf
需要在末尾添加的内容如下:
UserParameter=nginx.status[*],/bin/bash /etc/zabbix/zabbix_agentd.d/nginx_status.sh $1
这里我们添加一个自定义的 UserParameter。我们详细讲解一下自定义参数的含义。
有时候我们想让被监控端执行一个 Zabbix 没有预定义的检测,Zabbix 的用户自定义参数功能提供了这个方法。
其语法规范为:
UserParameter=key,command
key 使我们定义的参数,它必须是唯一的,[*] 表示里面可以传递多个参数。
如果 Zabbix 调用 key,就会执行对应的 command(命令)。比如这里我们调用的 key 为 nginx.status['active'],那么执行的命令为:/bin/bash /etc/zabbix/zabbix_agentd.d/nginx_status.sh active,这里的 $1 会被替换为 key 中传入的第一个参数。
https://doc.shiyanlou.com/courses/uid977658-20191009-1570615584478
采集脚本
接着我们来编写下用于采集数据的信息的脚本,新打开一个终端,输入如下命令:
sudo vim /etc/zabbix/zabbix_agentd.d/nginx_status.sh
脚本的内容如下,它定义了许多 Shell 函数,是用来采集信息的关键。脚本的结构非常简单,定义了一些变量用来记录一些函数公用的值。
每个函数的内容都是相似的,比如 /usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Active' | awk '{print $NF}'。看起来非常长,但是仔细一分析你会发现这个命令并不复杂。
curl 从一个链接 "http://$HOST:$PORT/nginx_status"(即我们的 Nginx 状态页)获取数据,然后传递给 grep 筛选,而我们最终只需要它的值(即对应的项的数值),所以又交给 awk 进行处理。
awk 是一个常用的文本处理器,它的用法已经多到可以单独出一本书。限于篇幅,这里我们不进行展开讲解,只需要知道它的功能就是获取对应监控项的值就可以了。
在函数的最后,我们使用$1 来获取要执行的函数(在 Shell 脚本入门一小节中我们已经讲解过了,这里就不再重复它的作用)。
#!/bin/bash
# 设置变量
BKUP_DATE=`/bin/date +%Y%m%d`
LOG="/data/log/zabbix/webstatus.log"
HOST=127.0.0.1 # 确保 CURL 能访问这个主机的 IP 地址
PORT="8080" # 端口号
# 编写函数用于获取 nginx 的统计信息
function active {
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function reading {
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing {
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting {
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
function accepts {
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
function handled {
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
function requests {
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
$1
添加脚本的过程和 Shell 脚本入门一小节中是相似的。可以参考下面的演示 ↓
https://doc.shiyanlou.com/courses/uid977658-20191009-1570616037249
添加好采集脚本之后,启动 Zabbix Agent 服务。
sudo /usr/sbin/zabbix_agentd --foreground -c /etc/zabbix/zabbix_agentd.conf
测试数据采集
Zabbix Agent 监控代理获取(采集)数据可以通过 zabbix_get 进程来取得。可以用 zabbix-get 来测试一下数据的采集是否成功。
这里我们需要安装一下 zabbix-get 这个软件包。
sudo apt-get install zabbix-get
https://doc.shiyanlou.com/courses/uid977658-20191009-1570616238687
测试的命令如下:
sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[accepts]'
sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[handled]'
sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[requests]'
sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[active]'
sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[reading]'
sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[writing]'
sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[waiting]'
-s: 指定客户端主机名或者 IP 。由于是采集本机的数据,可以使用回环地址 127.0.0.1 或者 localhost。
-k: 你想获取的 key 。这里的 Key 是之前在 UserParameter 中定义的。
返回一个数据则表示配置成功,如下是测试结果,你得到的值不一定与图片中的相同。
Zabbix 监控配置
配置流程
下面就是 Zabbix 监控系统的配置步骤。
大体的流程是:
(1)添加要监控的 Agent(这一步骤在上一个实验中已经完成,如果你没有使用保存的环境,就需要重新进行配置)。
(2)给主机添加监控项,即我们想要监控的指标。
(3)将我们监控项按组划分为两个图形。
(4)将图形汇总到一个聚合图形上。
指标分组
在开始进行配置之前,我们先将七个指标进行分组。
回顾一下,之前 nginx_status 的七个指标:
active connections – 活跃的连接数量
server accepts handled requests — accepts 表示总共处理的连接数,handled 表示成功创建握手的次数,requests 表示总共处理的请求数
reading — 读取客户端的连接数
writing — 响应数据到客户端的数量
waiting — Nginx 已经处理完正在等候下一次请求指令的驻留连接数
我们将其分为两个组
与连接相关的:active、reading、writing、waiting
与处理请求相关的:accepts、handled、requests
创建监控项
首先打开浏览器,在地址栏输入 localhost/zabbix 进入 Zabbix 的前端。
依次点击菜单栏的 “配置” → “主机”,然后选择主机 localhost 的“监控项”。
点击之后进入到监控项页面,点击右上角的 “创建监控项” 按钮。
接下来,我们要分别为 7 个指标添加监控项。创建监控项的方式都是大同小异的,我们只会详细的讲解 nginx.accepts 的配置,其他的配置与其是相似的。
创建与连接相关的监控项
nginx.accepts
我们需要填写监控项的名字:nginx.accepts。然后要填写键值 nginx.status[accepts]。更新时间改为 1s。
填写好以后,下拉页面到底部,点击添加即可。
nginx.handled
按照同样步骤添加监控项 nginx.handled:填写监控项的名字:nginx.handled。然后要填写键值 nginx.status[handled]。更新时间改为 1s。
nginx.requests
添加监控项 nginx.requests:填写监控项的名字:nginx.requests。然后要填写键值 nginx.status[requests]。更新时间改为 1s。
创建与处理请求相关的监控项
nginx.active
添加监控项 nginx.active:填写监控项的名字:nginx.active。然后要填写键值 nginx.status[active]。更新时间改为 1s。
nginx.reading
添加监控项 nginx.reading:填写监控项的名字:nginx.reading。然后要填写键值 nginx.status[reading]。更新时间改为 1s。
nginx.writing
添加监控项 nginx.writing:填写监控项的名字:nginx.writing。然后要填写键值 nginx.status[writing]。更新时间改为 1s。
nginx.waiting
添加监控项 nginx.waiting:填写监控项的名字:nginx.waiting。然后要填写键值 nginx.status[waiting]。更新时间改为 1s。
配置完成后,状态栏显示是 已启动,如下图:
这表明我们添加的监控项已经成功启用。
创建图形
接下来,我们需要为两组监控项分别创建图形。
如下图,点击主机 localhost 的“图形”,再点击右上角“创建图形”。
我们需要依次创建两个图形:nginx_connect 和 nginx_interact。
nginx_connect
填写图形的名称为 nginx_connect,然后将监控项添加到图形中。添加监控项的方式如下。注意我们要添加的监控项为 nginx.accepts、nginx.handled、nginx.requests
添加完成后,点击底部的 “添加” 按钮。
nginx_interact
nginx_interact 的配置方式与 nginx_connect 是相似的。要注意:图形命名为 nginx_interact;需要添加的监控项为:nginx.active、nginx.reading、nginx.writing、nginx.waiting。
添加完成后,可以在图形列表中查看。
创建聚合图形
依次点击顶部的 “监测” → “聚合图形”,再点击 “创建聚合图形”。
创建一个名为 Nginx Status 的聚合图形,配置为 1 列 2 行。配置完成后,点击 “添加” 按钮。
选择 “构造函数” 就会进入到配置界面,将之前的两个图形添加到聚合图形中。
点击更改,然后在图形里选择要添加的图形 nginx_connect。
同样的方式添加另外一个图形,注意要点击第二个更改。
再次回到聚合图形的界面,点击 Nginx Status(即聚合图形的名字)。
点击之后就能看到我们的监控数据。