当前位置:首页 > linux教程 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-22 14:17:29 浏览: 评论:0 

Zabbix是一个linux中常用的监控软件了,我们可以使用Zabbix监控Memcached PHP-FPM Tomcat Nginx MySQL 网站日志了,下面一起来看一个例子哦.

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

Memcached监控,自定义键值:

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

memcached-status.sh脚本内容为:

  1. #!/bin/bash 
  2.  
  3. item=$1 
  4. ip=127.0.0.1 
  5. port=11211 
  6. (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:

pm.status_path = /fpm_status

自定义键值: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.  
  16. # Zabbix requested parameter 
  17. ZBX_REQ_DATA="$1" 
  18.  
  19. # FPM defaults 
  20. URL="http://localhost/fpm_status" 
  21. WGET_BIN="/usr/bin/wget" 
  22.  
  23. # 
  24. # Error handling: 
  25. #  - need to be displayable in Zabbix (avoid NOT_SUPPORTED) 
  26. #  - items need to be of type "float" (allow negative + float) 
  27. # 
  28. ERROR_NO_ACCESS_FILE="-0.9900" 
  29. ERROR_NO_ACCESS="-0.9901" 
  30. ERROR_WRONG_PARAM="-0.9902" 
  31. ERROR_DATA="-0.9903" # either can not connect /        bad host / bad port 
  32.  
  33. # save the FPM stats in a variable for future parsing 
  34. FPM_STATS=$($WGET_BIN -q $URL -O - 2> /dev/null) 
  35.  
  36. # error during retrieve 
  37. if [ $? -ne 0 -o -z "$FPM_STATS" ]; then 
  38.   echo $ERROR_DATA 
  39.   exit 1 
  40. fi 
  41.  
  42. # 
  43. # Extract data from FPM stats 
  44. # 
  45. RESULT=$(echo "$FPM_STATS" | sed -n -r "s/^$ZBX_REQ_DATA: +([0-9]+)/\1/p") 
  46. if [ $? -ne 0 -o -z "$RESULT" ]; then 
  47.     echo $ERROR_WRONG_PARAM 
  48.     exit 1 
  49. fi 
  50.  
  51. echo $RESULT 
  52.  
  53. exit 0 

导入模板,php-fpm zabbix模板下载

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

自定义键值:UserParameter=tomcat.status[*],/data/sh/tomcat-status.py $1

因为需要解析到xml,所以还是决定用python实现比较方便.

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

自定义键值: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.  
  16. # Zabbix requested parameter 
  17. ZBX_REQ_DATA="$1" 
  18. ZBX_REQ_DATA_URL="$2" 
  19.  
  20. # Nginx defaults 
  21. URL="http://127.0.0.1/nginx_status" 
  22. WGET_BIN="/usr/bin/wget" 
  23.  
  24. # 
  25. # Error handling: 
  26. #  - need to be displayable in Zabbix (avoid NOT_SUPPORTED) 
  27. #  - items need to be of type "float" (allow negative + float) 
  28. # 
  29. ERROR_NO_ACCESS_FILE="-0.9900" 
  30. ERROR_NO_ACCESS="-0.9901" 
  31. ERROR_WRONG_PARAM="-0.9902" 
  32. ERROR_DATA="-0.9903" # either can not connect /        bad host / bad port 
  33.  
  34. # save the nginx stats in a variable for future parsing 
  35. NGINX_STATS=$($WGET_BIN -q $URL -O - 2> /dev/null) 
  36.  
  37. # error during retrieve 
  38. if [ $? -ne 0 -o -z "$NGINX_STATS" ]; then 
  39.   echo $ERROR_DATA 
  40.   exit 1 
  41. fi 
  42.  
  43. # 
  44. # Extract data from nginx stats 
  45. # 
  46. case $ZBX_REQ_DATA in 
  47.   active_connections)   echo "$NGINX_STATS" | head -1             | cut -f3 -d' ';; 
  48.   accepted_connections) echo "$NGINX_STATS" | grep -Ev '[a-zA-Z]' | cut -f2 -d' ';; 
  49.   handled_connections)  echo "$NGINX_STATS" | grep -Ev '[a-zA-Z]' | cut -f3 -d' ';; 
  50.   handled_requests)     echo "$NGINX_STATS" | grep -Ev '[a-zA-Z]' | cut -f4 -d' ';;   //phpfensi.com 
  51.   reading)              echo "$NGINX_STATS" | tail -1             | cut -f2 -d' ';; 
  52.   writing)              echo "$NGINX_STATS" | tail -1             | cut -f4 -d' ';; 
  53.   waiting)              echo "$NGINX_STATS" | tail -1             | cut -f6 -d' ';; 
  54.   *) echo $ERROR_WRONG_PARAM; exit 1;; 
  55. esac 
  56.  
  57. 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就不需要设置日志了:

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

定时获取一分钟日志,设置一个定时任务:

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

脚本内容为:

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

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

Tags: Zabbix Memcached PHP-FPM

分享到: