一、项目规划架构方案
1.1 主机分组
交换机
Nginx
Tomcat
Mysql
1.2 监控对象识别
使用SNMP监控交换机
使用IPMI监控服务器硬件
使用Agent监控服务器
使用JMX监控java
监控Nginx状态
监控Mysql
监控Web状态
一、监控实践
2.1 SNMP监控网络设备
2.1.1交换机上开始SNMP
config t
snmp-server community public ro
2.1.2在zabbix上添加监控
config t
snmp-server community public ro
设置SNMP interfaces
2.1.3关联监控模板
选择默认的Template-SNMP-device,(网络设备,可以监控交换机,路由器和防火墙等;模板里面item使用了宏,如下图
所以主机里面要设置宏,替代默认的模板中的宏,配置网络设备时,团体名命名为下面的名字
2.2 添加硬件监控(服务器IPMI)
- 经验:直接用IPMI监控,经常获取不到数据,模板自带的item也不可能不适合真正的服务器
- 推荐:使用自定义item,本地执行ipmitool命令监控获取数据,可以用来监控服务器风扇转速或者cpu温度
2.3 添加系统监控
使用zabbix agent监控,略
2.4 添加应用监控
2.4.1 JAVA应用
使用JXM模式+java_gateway代理监控
java_gateway可以运行在任何服务器上,是一个单独的服务
1)安装zabbix-java-gateway
[root@linux-node1 ~]#yum install -y zabbix-java-gateway
2)配置zabbix_java_gateway,其实什么都不用改
[root@linux-node1 ~]#vim /etc/zannox/zabbix_java_gateway
3)启动zabbix_java_gateway,检查端口和进程
[root@linux-node1 ~]#systemctl start zabbix-java-gateway
[root@linux-node1 ~]#ps -ef|grep java
[root@linux-node1 ~]#netstat -lntup|grep 10052
4)告诉zabbix-server服务器,javaGateway服务器的位置,重启server
5)开启jmx远程监控
[root@linux-node2 ~]# vim /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.56.12"
[root@linux-node2 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@linux-node2 ~]# /usr/local/tomcat/bin/startup.sh
6)在zabbix-server上添加tomcat的主机,并连接Template-JMX-Generic模板,选择JMX interfaces,如下图
2.4.2 Nginx应用
1)开启nginx监控
在nginx配置文件中添加一个location,只允许本地访问
location /nginx_status{
stub_status on;
access_log off;
allow 127.0.0.1;
deny all
}
2)编写脚本来进行数据采集(此脚本可以用来监控redis,memcached,nginx,tcp-status)
[root@linux-node1 ~]# cat redis-memcached-nginx-tcp.sh
#!/bin/bash
############################################################
# $Name: zabbix_linux_plugins.sh
# $Version: v1.0
# $Function: zabbix plugins
# $Author: Chuck
# $organization: www.52devops.com
# $Create Date: 2014-08-10
# $Description: Monitor Linux Service Status
############################################################
tcp_status_fun(){
TCP_STAT=$1
#netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,state[key]}' > /tmp/netstat.tmp
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/netstat.tmp
TCP_STAT_VALUE=$(grep "$TCP_STAT" /tmp/netstat.tmp | cut -d ' ' -f2)
if [ -z $TCP_STAT_VALUE ];then
TCP_STAT_VALUE=0
fi
echo $TCP_STAT_VALUE
}
nginx_status_fun(){
NGINX_PORT=$1
NGINX_COMMAND=$2
nginx_active(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
nginx_reading(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
nginx_writing(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
nginx_waiting(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
nginx_accepts(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
nginx_handled(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
nginx_requests(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{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;
esac
}
memcached_status_fun(){
M_PORT=$1
M_COMMAND=$2
echo -e "stats\nquit" | nc 127.0.0.1 "$M_PORT" | grep "STAT $M_COMMAND " | awk '{print $3}'
}
redis_status_fun(){
R_PORT=$1
R_COMMAND=$2
(echo -en "INFO \r\n";sleep 1
| nc 127.0.0.1 "$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
}
main(){
case $1 in
tcp_status)
tcp_status_fun $2;
;;
nginx_status)
nginx_status_fun $2 $3;
;;
memcached_status) memcached_status_fun $2 $3;
;;
redis_status) redis_status_fun $2 $3;
;;
*)
echo $"Usage: $0 {tcp_status key|memcached_status key|redis_status key|nginx_status key}"
esac
}
main $1 $2 $3
[root@linux-node1 ~]# chmod +x redis-memcached-nginx-tcp.sh
添加完测试脚本是否正常
[root@linux-node1 ~]# ./redis-memcached-nginx-tcp.sh nginx_status 8080 active
101
3)设置用户自定义参数
[root@linux-node1 ~]#cat redis-memcached-nginx-tcp.conf
UserParameter=linux_status[\*],/etc/zabbix/zabbix_agetd.d/redis-memcached-nginx-tcp.sh "$1" "$2" "$3"
4)增加zabbix-agent配置,并通过zabbix-server测试
修改agent配置
[root@linux-node1 ~]#Include=/etc/zabbix/zabbix_agentd.d/\*.conf
[root@linux-node1 ~]#service zabbix-agent restart
server端get测试
[root@linux-node1 ~]#zabbix_get -s 192.168.11.11 -k linux_status[nginx_status,8080,active]
12
5)添加template,添加item,多次克隆添加不同item即可
6)创建图形
略
7)创建触发器
略
8)创建通用模板
略
9)redis,memcached或者tcp-status的监控模板请联系博主,联系方式见博客首页右上方联系方式
2.4.3 使用percona监控插件监控Mysql应用
学习percona请移步percona-mysql, 此原理是php连接mysql数据库,shell脚本获取数据,下面开始部署
1)在agent端安装模板(但是此模板可能不生效,如有需求请联系博主)
[root@linux-node1 ~]#yum install percona-zabbix-templates
2)创建zabbix-agent的配置文件
[root@linux-node1 ~]#mkdir -p /etc/zabbix_agentd.conf.d/
[root@linux-node1 ~]#cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix_agentd.conf.d/userparameter_percona_mysql.conf
3)修改agent配置并重启
[root@linux-node1 ~]#Include=/etc/zabbix/zabbix_agentd.d/\*.conf
[root@linux-node1 ~]#service zabbix-agent restart
4)配置连接Mysql
<?php
$mysql_user = 'zabbix';
$mysql_pass = '123456';<
5)测试脚本是否正常,确认密码争取,否则会连不上mysql
[root@linux-node1 ~]# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg
405647
6)配置mysql
[client]
user = zabbix
password = 123456
7)使用zabbix测试脚本,返回0正常,1代表access denied
[root@linux-node1 ~]#sudo -u zabbix -H /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh running-slave
0
8)import模板,添加mysql主机关联此模板,添加trigger,添加Graph展示
- 转载请注明来源:中小企业zabbix监控生产案例实践
- 本文永久链接地址:http://www.52devops.com/chuck/646.html
近期文章
近期评论
大数据统计
分类目录