web篇

关键字:shell mysql python web.py

在上一篇中,我们介绍了如何使用shell脚本监控系统状态,并在出现异常时通过email发送警报。但email报警有一个弊端,无法实时了解服务器的运行状态。为了满足这一需求,就要开发一个web程序,通过网页的方式来显示所有服务器的实时运行状态。

阅读全文 »

前言

随着维护服务器量的增多,越来越觉得监控的重要性。监控,就是运维人员的眼睛,没有了监控,你不知道磁盘是否满了,网络流量是否超标,甚至服务器是否宕机。监控的重要性不言而喻。市面上的监控软件也很多,如商业版的ipmontor、opmanager,免费开源的nagios、cacti等。每个监控软件都有各自优缺点和应用场景,这里不去探讨。本文要探讨的是从一个初学者的角度去打造属于自己的监控系统。共分为三部分:email篇web篇移动篇(android)。好了,不废话了,下面开始。

阅读全文 »

vim flow.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
#caishzh 20121030
#displays the current Traffic

ETH=$1
ETH=${ETH:-eth0}
IP=`ifconfig $ETH|awk -F '[ :]+' '/inet addr/{print $4}'`

while true;do
let I+=1
NOW=`date +"%F %T"`
TX1=`grep $ETH /proc/net/dev | tr : " " | awk '{print $10}'`
RX1=`grep $ETH /proc/net/dev | tr : " " | awk '{print $2}'`
sleep 1
TX2=`grep $ETH /proc/net/dev | tr : " " | awk '{print $10}'`
RX2=`grep $ETH /proc/net/dev | tr : " " | awk '{print $2}'`

let TX=(TX2-TX1)/1024
let RX=(RX2-RX1)/1024
let TX_TOTAL+=$TX
let RX_TOTAL+=$RX
let TX_AVERAGE=TX_TOTAL/${I}
let RX_AVERAGE=RX_TOTAL/${I}

clear

printf "%10s\t%20s\n" "Device $ETH [$IP]" "$NOW"
echo "============================================================="
printf "%10s\t%20s\t%20s\n" CURRENT: in:${RX}KB/s out:${TX}KB/s
printf "%10s\t%20s\t%20s\n" AVERAGE: in:${RX_AVERAGE}KB/s out:${TX_AVERAGE}KB/s
printf "%10s\t%20s\t%20s\n" TOTAL: in:${RX_TOTAL}KB out:${TX_TOTAL}KB
done

脚本默认显示eth0的流量,如果要显示其它网卡的流量,请在脚本后接网卡名,如:
./flow.sh eth1

1567520488166

另一个版本,就是改了下显示的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
#caishzh 20130311 version 2
#displays the current Traffic

LANG=C
ETH=$1
ETH=${ETH:-eth0}
IP=`ifconfig $ETH|awk -F '[ :]+' '/inet addr/{print $4}'`

while true;do
let I+=1
NOW=`date +"%F %T"`
TX1=`grep $ETH /proc/net/dev | tr : " " | awk '{print $10}'`
RX1=`grep $ETH /proc/net/dev | tr : " " | awk '{print $2}'`
sleep 1
TX2=`grep $ETH /proc/net/dev | tr : " " | awk '{print $10}'`
RX2=`grep $ETH /proc/net/dev | tr : " " | awk '{print $2}'`

let TX=(TX2-TX1)/1024
let RX=(RX2-RX1)/1024
let TX_TOTAL+=$TX
let RX_TOTAL+=$RX
let TX_AVERAGE=TX_TOTAL/${I}
let RX_AVERAGE=RX_TOTAL/${I}

printf "%s \t %30s \t %30s \t %30s\n" "$NOW" "CURRENT: in:${RX}KB/s out:${TX}KB/s" "AVERAGE: in:${RX_AVERAGE}KB/s out:${TX_AVERAGE}KB/s" "TOTAL: in:${RX_TOTAL}KB out:${TX_TOTAL}KB"
done

CentOS的yum源是在/etc/yum.repos.d/目录下的两个文件中进行配置的,CentOS-Base.repo和CentOS-Media.repo。其中,CentOS-Base.repo是配置网络yum源,CentOS-Media.repo是配置本地yum源。

如果要在没有网络的环境下安装rpm包,可以配置本地光盘源来解决。

阅读全文 »

expr 表达式

expr只能用于一元操作符,不支持二元操作符

1
2
x=1
x=$(expr $x + 1)

$x + 1之间必须有空格

let 表达式

1
2
3
4
x=10
let x=$x+1
let x+=1
let x*=10

使用$((表达式))

1
x=$((4+5))

使用$[ ]形式

1
x=$[ 4 + 5 ]

使用decalare

1
2
3
decare -i num
num=$num+1
echo $num

1、使用shell当编辑器

1
2
3
mail -s "hi,this is a test by shell" [email protected]
hello
welcome to www.cszhi.com

-s后面接邮件的主题,[email protected]是邮件的接收人,输入完这行命令后回车,会进入邮件正文的编写。当邮件正文输入完成后,按CTRL+D结束输入,邮件就发送出去了。

阅读全文 »

200 – OK,服务器成功返回网页
– Standard response for successful HTTP requests.

301 – Moved Permanently(永久跳转),请求的网页已永久跳转到新位置。
– This and all future requests should be directed to the given.

403 – Forbidden(禁止访问),服务器拒绝请求
– forbidden request (matches a deny filter) => HTTP 403
– The request was a legal request, but the server is refusing to respond to it.

阅读全文 »

前言

PS:关于nagios的被动监控(nsca)好几个月前就想整理了,整了这么久才整完,看来自己又懒散了。需要寻找一些动力了。。。

nagios的主动监控,可以参考下以下博文,博主讲得很详细:nagios全攻略

以下介绍nagios的被动监控NSCA:

随着服务器的不断增加,nagios监控机已经有点不堪负重,故尝试使用被动模式以承担更大的监测量,同时也提高了监测的灵敏性和监测的方便性。

被动模式工作原理

相比与主动模式中服务器主动去被监控机上轮询获取监控数据的方式,被动模式则是在被监控机上面通过插件或脚本获取监控数据,然后将数据通过send_nsca发往监控机,最后监控机通过Nsca接收并解析数据,并传递给Nagios。这样做的一个很大的优势就是将除去处理数据的其他工作都放在了被监控机上面(包括了数据的传输),这样就避免了被监控机数量大时,一次轮询时间过长而导致监控反应延迟,这也是被动模式能承担更大监控量的关键

NSCA由两个部分组成

Nsca (安装在MonitorServer上,用来接收并解析MonitorClient发来的监控数据,传递给nagios)
Send_nsca(安装在MonitorClient上,用来发送监控数据。)

过程如下

在MonitorClient上面,使用nagios-plugins提供的插件,得出监控数据,然后将数据存为一个文件,利用输入重定向,通过send_nsca将数据发往MonitorServer。MonitorServer上面运行一个nsca的daemon(默认开启5667端口),用来接收这些数据,然后做一个简单的处理(会和nagios的service文件进行对应,将多余的监控数据排除),然后将数据进行格式的转换,发给nagios的“外部命令文件”(默认配置为“/usr/local/nagios/var/rw/nagios.cmd”在nagios.cfg中定义的)。
该文件是一个管道文件,也是nagios主程序的一个接口(用来接收监控数据),使用cat查看该文件时候,会出来经nsca处理后的数据格式。然后nagios主程序对数据进行处理(前台展示,警报)。

实现过程

配置nagios

1)修改配置文件nagios.cfg

1
2
check_external_commands = 1 (enable  commands  file)
command_check_interval = -1 (check the external command file as often as possible )

2)添加模板(template.cfg)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
define service{
name passive_service
use generic-service
max_check_attempts 3
active_checks_enabled 0
passive_checks_enabled 1
normal_check_interval 5
retry_check_interval 1
notifications_enabled 1
notification_interval 5
notification_period 24x7
contact_groups admins
register 0
}

3)定义一个command

1
2
3
4
define command{
command_name check_dummy
command_line /usr/local/nagios/libexec/check_dummy $ARG1$
}

该command对被监控机发过来的数据进行处理,check_dummy只能处理4个参数(0、1、2、其他数字)

1
2
3
4
5
6
7
8
[root@vps /]# /usr/local/nagios/libexec/check_dummy 0
OK
[root@vps /]# /usr/local/nagios/libexec/check_dummy 1
WARNING
[root@vps /]# /usr/local/nagios/libexec/check_dummy 2
CRITICAL
[root@vps /]# /usr/local/nagios/libexec/check_dummy 55
UNKNOWN: Status 55 is not a supported error state

4个参数可以代表4种状态,而监测服务一般只需要两种状态(running,sotp),硬件三种(OK warning critical)

4)再定义一个本机的被动监控service:

1
2
3
4
5
6
7
define service{
use passive_service
host_name localhost #本机被动监控
service_description NSCA
check_command check_dummy!0
notifications_enabled 1
}

下载并安装nsca

1
2
3
4
5
wget http://nchc.dl.sourceforge.net/project/nagios/nsca-2.x/nsca-2.9.1/nsca-2.9.1.tar.gz
tar zxf nsca-2.9.1.tar.gz
cd nsca-2.9.1
./configure
make all

以上步骤检查正确执行以后:
1)、会在src目录下生成两个程序 nsca send_nsca(主程序)
2)、sample-config中会有nsca.cfg与send_nsca.cfg(配置文件)
3)、当前目录下会有一个init-script(启动脚本)

Nagios监控机(MonitorServer)操作:

1
2
3
4
5
6
7
cp  src/nsca  /usr/local/nagios/bin/
cp sample-config/nsca.cfg /usr/local/nagios/etc
chown nagios.nagios /usr/local/nagios/bin/nsca
chown nagios.nagios /usr/local/nagios/etc/nsca.cfg
cp init-script /etc/init.d/nsca
chmod a+x /etc/init.d/nsca
chkconfig --add nsca

至此nsca安装完成,下面需要更改一些配置选项: (nsca.cfg)

1
2
3
4
5
server_address=xxx.xxx.xxx.xxx (这里务必使用对外表现的IP)
debug=1 (debug选项即log选项,写入message)
aggregate_writes=1 (能够支持更大的监控量,建议开启)
max_packet_age=60 (数据包过期时间,默认30s,但是考虑到网络因素建议设为60s)
password=xxxxxxx (密码,最基础的加密方式,也可以不设置)

检查配置文件是否正确:

1
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

启动nagios和nsca服务

1
2
service nagios start
service nsca start

测试发送数据给被动监测服务:

1
echo "localhost;NSCA;0;testOK"|./send_nsca -H 127.0.0.1 -d ";" -c /root/send_nsca.cfg

通过管道将数据传给send_nsca程序,send nsca再将数据发送到nsca服务,其中localhost是nsca监听的主机名,NSCA是Nagios中定义的被动监测服务的名字,0告诉nsca正常,testOK是附加信息,在web端的显示如下:
1567519196048

  • -H 127.0.0.1是数据发往的目的地,即nagios监控机;
  • -d ‘;’是数据的分隔符,默认是[TAB];
  • -c /root/send_nsca.cfg是send_nsca这个发送程序的配置文件。

也可以将要发送的数据写入一个文件,如/root/info.txt,用下面命令发送数据:

1
./send_nsca -H 127.0.0.1 -d ; -c /root/send_nsca.cfg < /root/info.txt

下面提供一个简单的被动监控脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/bin/bash

#初始化并设置阀值
HOSTNAME=$(hostname)
DIR=/tmp/nsca
[ -d "$DIR" ] || mkdir -p $DIR
>${DIR}/nsca_messages.txt

IP=$(ifconfig eth0|grep 'inet addr'|sed 's/.*addr:\(.*\) Bcast:.*/\1/')
HOSTNAME=$(hostname)

CPU_MAX=90 #单个进程的cpu使用率
UPTIME_MAX=8 #系统负载
DISK_MAX=95 #磁盘使用率

#设置一个flag,用于脚本的执行与否;0执行,1不执行
#FLAG=$(cat /root/tool/flag.txt)
#[ $FLAG -eq 1 ] && { exit 1 }

#进程占用cpu情况
CPU_MAX_NUM=$(top -n 1 -b|awk 'NR>7{if ($10>"'$CPU_MAX'")print $10}'|wc -l) #统计cpu使用率超过90%的进程数
if [ "$CPU_MAX_NUM" -gt 0 ];then
sleep 5
CPU_MAX_NUM=$(top -n 1|awk 'NR>7{if ($10>"'$CPU_MAX'")print $10}'|wc -l)
[ $CPU_MAX_NUM -gt 0 ] && $(echo "CPU_${CPU_MAX}%_NUM: $CPU_MAX_NUM" >>${DIR}/nsca_messages.txt)
fi


#系统负载
UPTIME=$(uptime|sed 's/.*age: \(.*\),.*,.*/\1/'|awk -F'.' '{print $1}')
[ "$UPTIME" -gt "$UPTIME_MAX" ] && $(echo "UPTIME: $UPTIME" >>${DIR}/nsca_messages.txt)

#监控磁盘空间
DISK=$(df -h |awk 'NR>1{print $0}'|sort -k5|tail -1|awk '{print $1,$4,$5}') #提取磁盘占用率最大的分区
DISK_USAGE=$(echo $DISK|awk '{print $3}'|tr -d '%')
[ "$DISK_USAGE" -ge "$DISK_MAX" ] && $(echo "DISK: $DISK" >> ${DIR}/nsca_messages.txt)

#监控文件系统(filesystem)
[ -f "${DIR}/fs.txt" ] || $(df -T|grep -v tmpfs|awk 'NR>1{print $1,$2}'>${DIR}/fs.txt)
while read FS
do
PARTITION=$(echo $FS|awk '{print $1}') #提取分区名
FILESYSTEM=$(echo $FS|awk '{print $2}') #提取文件系统类型
[ "$FILESYSTEM" == "ext4" ] && CMD="/sbin/tune4fs" || CMD="/sbin/tune2fs"
FS_STAT=$($CMD -l $PARTITION | grep 'Filesystem state')
echo $FS_STAT|grep 'clean$'>/dev/null
if [ $? -eq 1 ];then
echo "$PARTITION : $FS_STAT" >>${DIR}/nsca_messages.txt
fi
done< ${DIR}/fs.txt

#监控iptables
#/sbin/iptables -nL|grep 'INPUT'|grep 'policy ACCEPT' && echo "iptables: policy DROP">>${DIR}/messages.txt

#发送警报邮件
#if [ -s ${DIR}/messages.txt ];then #如果messages.txt文件不为空则发送警报信
# mail -s "system monitor: $IP $HOSTNAME" "$ADMIN_SMS" < ${DIR}/messages.txt
#fi

if [ -s ${DIR}/nsca_messages.txt ];then
MESS=$(cat ${DIR}/nsca_messages.txt)
echo "$HOSTNAME;NSCA;2;$MESS"|/root/mailtool/nsca/send_nsca -H 199.15.116.25 -d ";" -c send_nsca.cfg>>send_stat.txt
else
echo "$HOSTNAME;NSCA;0;OK"|/root/mailtool/nsca/send_nsca -H 199.15.116.25 -d ";" -c send_nsca.cfg>>sent_stat.txt
fi

将脚本放到被监控机上,例如保存为/root/nsca/nsca_check.sh,给予执行权限,并放到crontab每5分钟执行一次。

最后是批量添加被监控服务器脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash
#made by caishzh
#

if [ -z "$1" ] || [ -z "$2" ];then
echo -e "\nUsage:\n $0 groupname filename"
echo -e "Example:\n $0 webserver /root/webserver.txt\n"
exit 1
fi

NAGIOS_DIR="/usr/local/nagios"

HOSTGROUP=$1
SERVICES=$2
while read LINE
do
HOSTNAME=$(echo $LINE|awk '{print $1}')
IP=$(echo $LINE|awk '{print $2}')

cat >>"$NAGIOS_DIR"/etc/nsca/"$HOSTGROUP".cfg < <eof
define host{
use linux-server
host_name $HOSTNAME
address $IP
}
define service{
use passive_service
host_name $HOSTNAME
service_description NSCA
check_command check_dummy!0
notifications_enabled 1
}
EOF
done<$SERVICES

保存为/root/nagios_add.sh,并给予执行权限。

使用:
例如将需要添加被动监控服务器信息写道文件/root/servers.txt中,第一列为主机名,第二列是主机对应的ip:

1
2
service1 192.168.1.1
service2 192.168.1.2

执行:

1
/root/nagios_add.sh test /root/servers.txt

其中,test是服务器要加入到组。

执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@vps ~]# more /usr/local/nagios/etc/nsca/test.cfg
define host{
use linux-server
host_name service1
address 192.168.1.1
}
define service{
use passive_service
host_name service1
service_description NSCA
check_command check_dummy!0
notifications_enabled 1
}
define host{
use linux-server
host_name service2
address 192.168.1.2
}
define service{
use passive_service
host_name service2
service_description NSCA
check_command check_dummy!0
notifications_enabled 1
}

最后重启nagios让配置文件生效。

最精确硬盘分区的算法如下:

硬盘一般有255磁头,63扇区,故每柱面大小为:

1
512byte x 255 x 63=8225280bytes =7.84423828125 MB

如果要分40GB,那么要

1
40x1024MB=40960MB

需要柱面数为

1
40960÷7.84423828125=5221.66

取整数既为5222个柱面
应分M数为

1
5222x7.84423828125=40962.6123046875MB

不管小数点后面几位都进1,也就是40963MB,windows就认为是40GB了。
这个方法NTFS和FAT32通用。

下面附10GB到200GB整10GB递增的精确计算结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
10GB = 10245MB
20GB = 20482MB
30GB = 30726MB
40GB = 40963MB
50GB = 51208MB
60GB = 61444MB
70GB = 71681MB
80GB = 81926MB
90GB = 92162MB
100GB = 102407MB
110GB = 112644MB
120GB = 122888MB
130GB = 133125MB
140GB = 143362MB
150GB = 153606MB
160GB = 163843MB
170GB = 174088MB
180GB = 184324MB
190GB = 194561MB

此精确分区结果,在管理工具-磁盘管理界面,和Windows资源管理器里面显示的是整数,10G就是10.00GB,20G就是20.00GB,40G就是40.00GB。