Zabbix监控Memcached PHP-FPM Tomcat Nginx MySQL 网站日志

Zabbix作为监控软件非常的灵活,支持的数据类型非常丰富,比如数字(无正负),数字(浮点),日志,文字等。我们需要做的就是使用脚本来收集好数据,然后zabbix收集并画图,设置告警线。这里我们来学习使用Zabbix监控Memcached、PHP-FPMTomcatNginxMySQL及网站日志。

 

Memcached监控

 

自定义键值

 

  1. UserParameter=memcached.stat[*],/data/sh/memcached-status.sh "$1"

memcached-status.sh脚本内容为:

  1. #!/bin/bash
  2. item=$1
  3. ip=127.0.0.1
  4. port=11211
  5. (echo "stats";sleep 0.5) | telnet $ip $port 2>/dev/null | grep "STAT $item\b" | awk '{print $3}'

 

导入模板

 

memcached zabbix模板下载

 

PHP-FPM监控

 

配置php-fpm状态页

 

打开php-fpm.conf配置文件,添加如下配置后重启php:

  1. pm.status_path = /fpm_status

 

自定义键值

 

  1. UserParameter=php-fpm[*],/data/sh/php-fpm-status.sh "$1"

php-fpm-status.sh脚本内容:

  1. #!/bin/bash
  2. ##################################
  3. # Zabbix monitoring script
  4. #
  5. # php-fpm:
  6. #  - anything available via FPM status page
  7. #
  8. ##################################
  9. # Contact:
  10. #  vincent.viallet@gmail.com
  11. ##################################
  12. # ChangeLog:
  13. #  20100922        VV        initial creation
  14. ##################################
  15. # Zabbix requested parameter
  16. ZBX_REQ_DATA="$1"
  17. # FPM defaults
  18. URL="http://localhost/fpm_status"
  19. WGET_BIN="/usr/bin/wget"
  20. #
  21. # Error handling:
  22. #  - need to be displayable in Zabbix (avoid NOT_SUPPORTED)
  23. #  - items need to be of type "float" (allow negative + float)
  24. #
  25. ERROR_NO_ACCESS_FILE="-0.9900"
  26. ERROR_NO_ACCESS="-0.9901"
  27. ERROR_WRONG_PARAM="-0.9902"
  28. ERROR_DATA="-0.9903" # either can not connect /        bad host / bad port
  29. # save the FPM stats in a variable for future parsing
  30. FPM_STATS=$($WGET_BIN -q $URL -O - 2> /dev/null)
  31. # error during retrieve
  32. if [ $? -ne 0 -o -z "$FPM_STATS" ]; then
  33.   echo $ERROR_DATA
  34.   exit 1
  35. fi
  36. #
  37. # Extract data from FPM stats
  38. #
  39. RESULT=$(echo "$FPM_STATS" | sed -n -r "s/^$ZBX_REQ_DATA: +([0-9]+)/\1/p")
  40. if [ $? -ne 0 -o -z "$RESULT" ]; then
  41.     echo $ERROR_WRONG_PARAM
  42.     exit 1
  43. fi
  44. echo $RESULT
  45. exit 0

 

导入模板

 

php-fpm zabbix模板下载

 

Tomcat监控

 

刚开始决定监控Tomcat时,使用的是JMX,不过这货设置太复杂了,而且对防火墙要求还挺高,需要开放几个端口。只好使用Tomcat自带的状态页来监控了。

 

自定义键值

 

  1. UserParameter=tomcat.status[*],/data/sh/tomcat-status.py $1

因为需要解析到xml,所以还是决定用python实现比较方便。
/data/sh/tomcat-status.py脚本内容:

  1. #!/usr/bin/python
  2. import urllib2
  3. import xml.dom.minidom
  4. import sys
  5. url = 'http://127.0.0.1:8080/manager/status?XML=true'
  6. username = 'username'
  7. password = 'password'
  8. passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
  9. passman.add_password(None, url, username, password)
  10. authhandler = urllib2.HTTPBasicAuthHandler(passman)
  11. opener = urllib2.build_opener(authhandler)
  12. urllib2.install_opener(opener)
  13. pagehandle = urllib2.urlopen(url)
  14. xmlData = pagehandle.read()
  15. doc = xml.dom.minidom.parseString(xmlData)
  16. item = sys.argv[1]
  17. if item == "memory.free":
  18. print  doc.getElementsByTagName("memory")[0].getAttribute("free")
  19. elif item == "memory.total":
  20. print  doc.getElementsByTagName("memory")[0].getAttribute("total")
  21. elif item == "memory.max":
  22. print  doc.getElementsByTagName("memory")[0].getAttribute("max")
  23. elif item == "threadInfo.maxThreads":
  24. print  doc.getElementsByTagName("threadInfo")[0].getAttribute("maxThreads")
  25. elif item == "threadInfo.currentThreadCount":
  26. print  doc.getElementsByTagName("threadInfo")[0].getAttribute("currentThreadCount")
  27. elif item == "threadInfo.currentThreadsBusy":
  28. print  doc.getElementsByTagName("threadInfo")[0].getAttribute("currentThreadsBusy")
  29. elif item == "requestInfo.maxTime":
  30. print  doc.getElementsByTagName("requestInfo")[0].getAttribute("maxTime")
  31. elif item == "requestInfo.processingTime":
  32. print  doc.getElementsByTagName("requestInfo")[0].getAttribute("processingTime")
  33. elif item == "requestInfo.requestCount":
  34. print  doc.getElementsByTagName("requestInfo")[0].getAttribute("requestCount")
  35. elif item == "requestInfo.errorCount":
  36. print  doc.getElementsByTagName("requestInfo")[0].getAttribute("errorCount")
  37. elif item == "requestInfo.bytesReceived":
  38. print  doc.getElementsByTagName("requestInfo")[0].getAttribute("bytesReceived")
  39. elif item == "requestInfo.bytesSent":
  40. print  doc.getElementsByTagName("requestInfo")[0].getAttribute("bytesSent")
  41. else:
  42. print "unsupport item."

这个脚本是监控Tomcat7的,Tomcat6没有试过,应该区别在状态页的url以及管理页面的用户密码设置上。以上脚本可运行需要在tomcat-users.xml里添加用户,至少权限为manager-status。

 

导入模板

 

tomcat zabbix模板下载

 

Nginx监控

 

配置Nginx状态页

 

nginx配置文件server{}中加入:

  1. location /nginx_status {
  2.     stub_status on;
  3.     access_log off;
  4. }

 

自定义键值

 

  1. UserParameter=nginx[*],/data/sh/nginx-status.sh "$1"

nginx-status.sh脚本内容:

  1. #!/bin/bash
  2. ##################################
  3. # Zabbix monitoring script
  4. #
  5. # nginx:
  6. #  - anything available via nginx stub-status module
  7. #
  8. ##################################
  9. # Contact:
  10. #  vincent.viallet@gmail.com
  11. ##################################
  12. # ChangeLog:
  13. #  20100922        VV        initial creation
  14. ##################################
  15. # Zabbix requested parameter
  16. ZBX_REQ_DATA="$1"
  17. ZBX_REQ_DATA_URL="$2"
  18. # Nginx defaults
  19. URL="http://127.0.0.1/nginx_status"
  20. WGET_BIN="/usr/bin/wget"
  21. #
  22. # Error handling:
  23. #  - need to be displayable in Zabbix (avoid NOT_SUPPORTED)
  24. #  - items need to be of type "float" (allow negative + float)
  25. #
  26. ERROR_NO_ACCESS_FILE="-0.9900"
  27. ERROR_NO_ACCESS="-0.9901"
  28. ERROR_WRONG_PARAM="-0.9902"
  29. ERROR_DATA="-0.9903" # either can not connect /        bad host / bad port
  30. # save the nginx stats in a variable for future parsing
  31. NGINX_STATS=$($WGET_BIN -q $URL -O - 2> /dev/null)
  32. # error during retrieve
  33. if [ $? -ne 0 -o -z "$NGINX_STATS" ]; then
  34.   echo $ERROR_DATA
  35.   exit 1
  36. fi
  37. #
  38. # Extract data from nginx stats
  39. #
  40. case $ZBX_REQ_DATA in
  41.   active_connections)   echo "$NGINX_STATS" | head -1             | cut -f3 -d' ';;
  42.   accepted_connections) echo "$NGINX_STATS" | grep -Ev '[a-zA-Z]' | cut -f2 -d' ';;
  43.   handled_connections)  echo "$NGINX_STATS" | grep -Ev '[a-zA-Z]' | cut -f3 -d' ';;
  44.   handled_requests)     echo "$NGINX_STATS" | grep -Ev '[a-zA-Z]' | cut -f4 -d' ';;
  45.   reading)              echo "$NGINX_STATS" | tail -1             | cut -f2 -d' ';;
  46.   writing)              echo "$NGINX_STATS" | tail -1             | cut -f4 -d' ';;
  47.   waiting)              echo "$NGINX_STATS" | tail -1             | cut -f6 -d' ';;
  48.   *) echo $ERROR_WRONG_PARAM; exit 1;;
  49. esac
  50. exit 0

 

导入模板

 

nginx zabbix模板下载

 

MySQL监控

 

MySQL的监控,zabbix是默认支持的,已经有现成的模板,现成的键值,我们需要做的只是在/var/lib/zabbix里新建一个.my.cnf文件,内容如下:

  1. [client]
  2. host=127.0.0.1
  3. port=1036
  4. user=root
  5. password=root

 

网站日志监控

 

配置日志格式

 

我们假设你用的web服务器是Nginx,我们添加一个日志格式,如下:

  1. log_format withHost  '$remote_addr\t$remote_user\t$time_local\t$host\t$request\t'
  2.                 '$status\t$body_bytes_sent\t$http_referer\t'
  3.                 '$http_user_agent';

我们使用tab作分隔符,为了方便awk识别列的内容,以防出错。
然后再设置全局的日志,其它server就不需要设置日志了:

  1. access_log  /data/home/logs/nginx/$host.log withHost;

 

定时获取一分钟日志

 

设置一个定时任务:

  1. * * * * * /data/sh/get_nginx_access.sh

脚本内容为:

  1. #!/bin/bash
  2. logDir=/data/home/logs/nginx/
  3. logNames=ls ${logDir}/*.*.log  |awk -F"/" '{print $NF}'
  4. for $logName in $logNames;
  5. do
  6. #设置变量
  7. split_log="/tmp/split_$logName"
  8. access_log="${logDir}/$logName"
  9. status_log="/tmp/$logName"
  10. #取出最近一分钟日志
  11. tac $access_log  | awk '
  12. BEGIN{
  13. FS="\t"
  14. OFS="\t"
  15. cmd="date -d \"1 minute ago\" +%H%M%S"
  16. cmd|getline oneMinuteAgo
  17. }
  18. {
  19. $3 = substr($3,13,8)
  20. gsub(":","",$3)
  21. if ($3>=oneMinuteAgo){
  22. print
  23. } else {
  24. exit;
  25. }
  26. }' > $split_log
  27. #统计状态码个数
  28. awk -F'\t' '{
  29. status[$4" "$6]++
  30. }
  31. END{
  32. for (i in status)
  33. {
  34. print i,status[i]
  35. }
  36. }
  37. ' $split_log  > $status_log
  38. done

这个定时任务是每分钟执行,因为我们监控的频率是每分钟。添加这个任务是为了取得最近一分钟各域名的日志,以及统计各域名的所有状态码个数,方便zabbix来获取所需的数据。

 

自定义键值

 

  1. UserParameter=nginx.detect,/data/sh/nginx-detect.sh
  2. UserParameter=nginx.access[*],awk -v sum=0 -v domain=$1 -v code=$2 '{if($$1 == domain && $$2 == code ){sum+=$$3} }END{print sum}' /tmp/$1.log
  3. UserParameter=nginx.log[*],awk -F'\t' -v domain=$1 -v code=$2 -v number=$3 -v sum=0 -v line="" '{if ($$4 == domain && $$6 == code ){sum++;line=line$$5"\n" }}END{if (sum > number) print line}' /tmp/split_$1.log | sort | uniq -c | sort -nr | head -10 | sed -e 's/^/<p>/' -e 's/$/<\/p>/'

nginx-detect.sh脚本内容为:

  1. #!/bin/bash
  2. function json_head {
  3.     printf "{"
  4.     printf "\"data\":["
  5. }
  6. function json_end {
  7.     printf "]"
  8.     printf "}"
  9. }
  10. function check_first_element {
  11.     if [[ $FIRST_ELEMENT -ne 1 ]]; then
  12.         printf ","
  13.     fi
  14.     FIRST_ELEMENT=0
  15. }
  16. FIRST_ELEMENT=1
  17. json_head
  18. logNames=ls /data/home/logs/nginx/*.*.log |awk -F"/" '{print $NF}'
  19. for logName in $logNames;
  20. do
  21. while read domain code count;do
  22.         check_first_element
  23.         printf "{"
  24.         printf "\"{#DOMAIN}\":\"$domain\",\"{#CODE}\":\"$code\""
  25.         printf "}"
  26. done < /tmp/$logName
  27. done
  28. json_end

这里我们定义了三个键值,nginx.detect是为了发现所有域名及其所有状态码,nginx.access[*]是为了统计指定域名的状态码的数量,nginx.log[*]是为了测试指定域名的状态码超过指定值时输出排在前十的url。我们监控nginx访问日志用到了zabbix的自动发现功能,当我们增加域名时,不需要修改脚本,zabbix会帮助我们自动发现新增的域名并作监控。

 

配置探索规则

 

添加一个探索规则,用来发现域名及状态码,如图:
nginx-log-detect

 

配置监控项原型

 

监控所有的域名及状态码:
nginx-domain-code
域名状态码404超过200次监控:
nginx-404
域名状态码500超过50次监控:
nginx-500

 

配置触发器

 

404状态码超过200告警:
nginx-404-warning

nginx-500-warning
500状态码超过50告警:
nginx-500-warning

转载请标明文章来源:《https://www.centos.bz/2015/01/zabbix-monitor-memcached-php-fpm-tomcat-mysql-nginx-log/

目前评论: 10 条  其中:访客 10 条  博主 0 条

  1. 防盗窗纱 防盗窗纱 【农民】

    不错的文章,内容学富五车.禁止此消息:nolinkok@163.com

  2. 衡水人才 衡水人才 【农民】

    好文章,内容惊涛骇浪.禁止此消息:nolinkok@163.com

  3. 外墙保温网格布价格 外墙保温网格布价格 【农民】

    好文章,内容淋漓尽致.禁止此消息:nolinkok@163.com

  4. 边坡防护网 边坡防护网 【农民】

    好文章,内容栩栩如生.禁止此消息:nolinkok@163.com

  5. 遮阳网 遮阳网 【农民】

    不错的文章,内容层次清晰.禁止此消息:nolinkok@163.com

  6. 防风抑尘网 防风抑尘网 【农民】

    不错的文章,内容酣畅淋漓.禁止此消息:nolinkok@163.com

  7. 钢筋网 钢筋网 【农民】

    好文章,内容字字珠玉.禁止此消息:nolinkok@163.com

  8. 格宾网 格宾网 【农民】

    好文章,内容文风幽默.禁止此消息:nolinkok@163.com

  9. 环氧自流平 环氧自流平 【农民】

    不错的文章,内容言简意赅.禁止此消息:nolinkok@163.com

  10. 胶管 胶管 【农民】

    不错的文章,内容气贯长虹.禁止此消息:nolinkok@163.com

发表评论


表情