1.同个基础环境: 添加别名 zabbix
2.apt-get install -y zabbix-agent
vi /etc/zabbix/zabbix_agentd.conf # 修改agent配置文件
更新行:Server=127.0.0.1 => Server=192.168.1.5, 192.168.1.1 # zabbix server
ServerActive=127.0.0.1 => ServerActive=192.168.1.5, 192.168.1.1 # zabbix server
Hostname=Zabbix Server => Hostname=192.168.0.210 # agent所在服务器IP
注:192.168.1.5是zabbix server,192.168.0.210是agent所在服务器IP
其中192.168.1.1是zabbix服务器的默认网关,因zabbix服务器与zabbix agent不在一个网段,192.168.0.0段服务器见到的所有zabbix信息均来自网关,因此Server参数一定要加上zabbix服务器默认网关192.168.1.1,配置Agent时请注意.
3.加入开机自启:
update-rc.d zabbix-agent defaults
/etc/init.d/zabbix-agent start
4.查看所有端口: 查看是否有10050
netstat -lnt
5.zabbix, 添加主机,
a.agent代理程序的接口: ip-*.*.*.* 端口-10050
b.添加模板: Template OS Linux.
c.看监控效果
d.将多个监控项一个页面显示,这就是聚合图形功能, 点击“构造函数”自定义监控项.
6.添加端口监控: https://abc.htmltoo.com/thread-44916.htm
i.创建一组专门用于端口监控的模板: Tcp Port
a.监控80端口是否在Listen状态的Item:
name: tcp port 80 is listen key: net.tcp.listen[80]
b.用来检查TCP端口是否可以正常连接的Item:
name: tcp port 80 is connection key: net.tcp.port[80]
c.用来监控服务是否可用,不指定端口将检查该服务的默认端口的Item:
name: tcp port http is running key: net.tcp.service[http,,]
如http有使用其他端口设置如: key: net.tcp.service[http,,8080]
d.监控服务(端口)的连接性能,注意下面的数据类型选择float的Item, performance反映80端口连接性能,越小越好:
name: tcp port 80 performance key: net.tcp.service.perf[http,,80] type: 浮点数(float)
e.给第一个Item创建一个触发器: 监控80端口是否在listen状态,返回0表示不在,返回1表示在:
name: tcp port 80 is down
问题: {Tcp Port:net.tcp.listen[80].last()}=0
恢复: {Tcp Port:net.tcp.listen[80].last()}=1
f.创建一个图像,将4个Items显示在图像中:
name: tcp port 80 4个Item添加进去.
g.模板:Tcp Port,添加进主机.
ii. 创建对网卡的流量的监控
a. 监控项:
name: Network incoming on eth0 key: net.if.in[eth0,bytes] 单位: bps
name: Network outcoming on eth0 key: net.if.out[eth0,bytes] 单位: bps
b.触发器: 1M:1048576 5M:5242880
Network incoming on eth0 >1M on {HOST.NAME} 表达式: {Tcp Port:net.if.in[eth0,bytes].last()}>1048576
Network outcoming on eth0 >1M on {HOST.NAME} 表达式: {Tcp Port:net.if.out[eth0,bytes].last()}>1048576
c.图形:
Network incoming or outcoming on eth0 添加以上两个监控项.
d.如是新模板,添加进主机.
iii. 添加报警设置
a.管理(Administration) → 媒体类型(Media types) ->输入email账户信息.
b.为了建立一个通知,前往 配置(Configuration) → 动作(Actions),然后点击 创建动作(Create action)。
增加: 维护状态 非在 维护 and 触发器 = Tcp Port: tcp port 80 is down.
操作: email通知用户.
iv. Nginx的状态监控
a.添加配置:
location /nginx_status {
stub_status on;
access_log off;
#allow 10.42.0.0/24;
#allow 127.0.0.1;
#deny all;
}
curl http://192.168.56.12/status
Active connections: 1
server accepts handled requests
9 9 7
Reading: 0 Writing: 1 Waiting: 0
Nginx状态解释:
Active connections Nginx正处理的活动链接数1个
server Nginx启动到现在共处理了9个连接。
accepts Nginx启动到现在共成功创建9次握手。
handled requests Nginx总共处理了7次请求。
Reading Nginx读取到客户端的 Header 信息数。
Writing Nginx返回给客户端的 Header 信息数。
Waiting Nginx已经处理完正在等候下一次请求指令的驻留链接,开启。
Keep-alive的情况下,Waiting这个值等于active-(reading + writing)。
请求丢失数=(握手数-连接数)可以看出,本次状态显示没有丢失请求。
b.添加agent的监控nginx状态配置:
mkdir /etc/zabbix/zabbix_agentd.conf.d/scripts
vi /etc/zabbix/zabbix_agentd.conf.d/monitor.conf
UnsafeUserParameters=1 UserParameter=nginx.status[*],/etc/zabbix/zabbix_agentd.conf.d/scripts/nginx_monitor.sh -F $1 -P $2
c.获取nginx状态的shell脚本:
vi /etc/zabbix/zabbix_agentd.conf.d/scripts/monitor.sh
#!/bin/bash
# DateTime: 2018-07-01
# AUTHOR:cndo.org
# Description:zabbix监控nginx性能以及进程状态
# Note:此脚本需要配置在被监控端
# zabbix_agentd.conf: 添加自定义key,UserParameter=nginx.status[*],/.../zabbix/scripts/nginx_status.sh -F $1 -P $2
HOST="127.0.0.1"
PORT="80"
# 检测nginx进程是否存在
function ping {
/sbin/pidof nginx | wc -l
}
# 检测nginx性能
function active {
/usr/bin/curl "http://$HOST:$PORT/status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function reading {
/usr/bin/curl "http://$HOST:$PORT/status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing {
/usr/bin/curl "http://$HOST:$PORT/status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting {
/usr/bin/curl "http://$HOST:$PORT/status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
function accepts {
/usr/bin/curl "http://$HOST:$PORT/status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
function handled {
/usr/bin/curl "http://$HOST:$PORT/status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
function requests {
/usr/bin/curl "http://$HOST:$PORT/status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
# 执行function
while getopts "H:P:F:" OPT; do
case $OPT in
"P")
PORT=$OPTARG
;;
"F")
fun=$OPTARG
;;
"H")
HOST=$OPTARG
;;
esac
done
$fun给脚本添加执行权限
chmod +x /etc/zabbix/zabbix_agentd.conf.d/scripts/monitor.sh
/etc/init.d/zabbix-agent restart
Server端测试一定使用Zabbix_get来获取值:
zabbix_get -s 10.42.145.26 -k nginx_status[accepts]
10
d. 创建监控模板以及添加监控项,并添加监控主机: 步骤和监控TCP状态一样
# 配置 –> 模板 –> 导入 –> 选择文件 –>刚刚保存的xml文件 –> 导入 # (需要注意,本模板监控端口是8080,如果需要修改监控端口,可以直接将xml文件中8080端口替换,或者导入之后在web界面修改) <?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>3.2</version> <date>2018-07-01T08:57:20Z</date> <groups> <group> <name>Templates</name> </group> </groups> <templates> <template> <template>nginx.status</template> <name>nginx.status</name> <description/> <groups> <group> <name>Templates</name> </group> </groups> <applications> <application> <name>nginx.status</name> </application> </applications> <items> <item> <name>nginx Accepts</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[accepts,8080]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>nginx.status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx Active</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[active,8080]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>nginx.status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx handled</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[handled,8080]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>nginx.status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx Reading</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[reading,8080]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>nginx.status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx requests</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[requests,8080]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>nginx.status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx waiting</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[waiting,8080]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>nginx.status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx writing</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[writing,8080]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>nginx.status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> </items> <discovery_rules/> <httptests/> <macros/> <templates/> <screens/> </template> </templates> <graphs> <graph> <name>nginx Clients Status</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>nginx.status</host> <key>nginx.status[active,8080]</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>F63100</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>nginx.status</host> <key>nginx.status[reading,8080]</key> </item> </graph_item> <graph_item> <sortorder>2</sortorder> <drawtype>0</drawtype> <color>2774A4</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>nginx.status</host> <key>nginx.status[waiting,8080]</key> </item> </graph_item> <graph_item> <sortorder>3</sortorder> <drawtype>0</drawtype> <color>A54F10</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>nginx.status</host> <key>nginx.status[writing,8080]</key> </item> </graph_item> </graph_items> </graph> <graph> <name>nginx Socket Status</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>nginx.status</host> <key>nginx.status[accepts,8080]</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>F63100</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>nginx.status</host> <key>nginx.status[handled,8080]</key> </item> </graph_item> <graph_item> <sortorder>2</sortorder> <drawtype>0</drawtype> <color>2774A4</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>nginx.status</host> <key>nginx.status[requests,8080]</key> </item> </graph_item> </graph_items> </graph> </graphs> </zabbix_export>
v. MySql模板监控项:
vi /etc/zabbix/zabbix_agentd.conf.d/scripts/mysql_monitor.sh
# 用户名
#MYSQL_USER='zabbix'
# 密码
#MYSQL_PWD='zabbix' #在脚本中输入密码mysql会提示安全告警信息#Warning: Using a password on the command line interface can be #insecure,需要将帐号密码等配置添加到mysql配置文件my.cnf中即可,脚本中#不用输入账号密码
# 主机地址/IP
MYSQL_HOST='127.0.0.1'
# 端口
MYSQL_PORT='3306'
# 数据连接
MYSQL_CONN="/usr/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT}"
# 参数是否正确
if [ $# -ne "1" ];then
echo "arg error!"
fi
# 获取数据
case $1 in
Uptime)
result=`${MYSQL_CONN} status|cut -f2 -d":"|cut -f1 -d"T"`
echo $result
;;
Com_update)
result=`${MYSQL_CONN} extended-status |grep -w "Com_update"|cut -d"|" -f3`
echo $result
;;
Slow_queries)
result=`${MYSQL_CONN} status |cut -f5 -d":"|cut -f1 -d"O"`
echo $result
;;
Com_select)
result=`${MYSQL_CONN} extended-status |grep -w "Com_select"|cut -d"|" -f3`
echo $result
;;
Com_rollback)
result=`${MYSQL_CONN} extended-status |grep -w "Com_rollback"|cut -d"|" -f3`
echo $result
;;
Questions)
result=`${MYSQL_CONN} status|cut -f4 -d":"|cut -f1 -d"S"`
echo $result
;;
Com_insert)
result=`${MYSQL_CONN} extended-status |grep -w "Com_insert"|cut -d"|" -f3`
echo $result
;;
Com_delete)
result=`${MYSQL_CONN} extended-status |grep -w "Com_delete"|cut -d"|" -f3`
echo $result
;;
Com_commit)
result=`${MYSQL_CONN} extended-status |grep -w "Com_commit"|cut -d"|" -f3`
echo $result
;;
Bytes_sent)
result=`${MYSQL_CONN} extended-status |grep -w "Bytes_sent" |cut -d"|" -f3`
echo $result
;;
Bytes_received)
result=`${MYSQL_CONN} extended-status |grep -w "Bytes_received" |cut -d"|" -f3`
echo $result
;;
Com_begin)
result=`${MYSQL_CONN} extended-status |grep -w "Com_begin"|cut -d"|" -f3`
echo $result
;;
*)
echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)"
;;
esacvi /etc/zabbix/zabbix_agentd.conf.d/monitor.conf
UnsafeUserParameters=1
UserParameter=mysql.version,mysql -V
UserParameter=mysql.status[*], /etc/zabbix/zabbix_agentd.conf.d/scripts/mysql_monitor.sh $1
#UserParameter=mysql.ping,mysqladmin -P3306 -h127.0.0.1 ping | grep -c alive
UserParameter=mysql.ping,sudo netstat -ntpl |grep 3306|grep mysql|wc |awk '{print $1}'
修改/etc/sudoers( chmod +s /bin/netstat也可以,省去了修改/etc/sudoers的麻烦)
#注释掉此行
Defaults requiretty
#在最后加入如下行:
zabbix ALL=(ALL) NOPASSWD: /bin/netstat
#“NOPASSWD”表示zabbix用户在执行命令时,无需输入密码;
# “/bin/netstat”,是zabbix用户可以root身份执行的命令,如果有多个,请用逗号分隔,这样的好处是做到权限的精细控制/etc/init.d/zabbix-agent restart
模板添加进主机, 在server端测试是否能获取到数据:
zabbix_get -s 10.42.145.26 -k "mysql.ping"
1
vi. 动作信息模板
a.故障模板:
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
b.恢复模板
恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
6.grafana可视化配置
a.Data Sources
zabbix / name: zabbix type: zabbix / 作为默认
b.HTTP
URL: http://ip:8000/api_jsonrpc.php
Access: Server
c.Zabbix API details 账户 / 密码 / Trends 选择
c.Metrics: Group-主机群: nginx Host-主机: nginx-test Application-应用集 Item-监控项