[最近折腾]zabbix部署记录

说在开篇:
嗯。。折腾它的理由已经记不清了,只记得skidu搁浅搁浅再搁浅之后终于鼓起勇气开始折腾zabbix。。
好歹还算是入门了,记录一下,做个笔记吧:)

介绍:
zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供柔软的通知机制以让系统管理员快速定位/解决存在的各种问题。

zabbix由2部分构成,zabbix server与可选组件zabbix agent。
zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux,Solaris, HP-UX, AIX, Free BSD, Open BSD, OS X等平台之上。
zabbix agent需要安装在被监视的目标服务器上,它主要完成对硬件信息或与操作系统有关的内存,CPU等信息的收集。zabbix agent可以运行在Linux ,Solaris, HP-UX, AIX, Free BSD, Open BSD, OS X, Tru64/OSF1, Windows NT4.0, Windows 2000/2003/XP/Vista)等系统之上。

zabbix server可以单独监视远程服务器的服务状态;同时也可以与zabbix agent配合,可以轮询zabbix agent主动接收监视数据(trapping方式),同时还可被动接收zabbix agent发送的数据(trapping方式)。
另外zabbix server还支持SNMP (v1,v2),可以与SNMP软件(例如:net-snmp)等配合使用。

环境需求:
数据库:
MySQL、Oracle、PostgreSQL、SQLite、IBM DB2
Web服务器:
官方要求是Apache,但测试发现Apache、Nginx均可,根据自己需求选择吧
PHP:
PHP5+
另外,PHP需要开启以下扩展
[code]
GD
必须开启对png、jpg以及FreeType2的支持
--with-png-dir --with-jpeg-dir --with-freetype-dir
bcmath
--enable-bcmathctype--enable-ctype
libXML
导入导出zabbix相关配置时需要XML支持
xmlreader
xmlwriter
session
sockets
一些与zabbix服务通讯的地方需要使用到它
--enable-socketsmbstring--enable-mbstring
gettext
图表处理时需要
--with-gettext
ibm_db2
如果zabbix数据库采用IBM_DB2,则需要该扩展支持
mysql
如果zabbix数据库采用MySQL,则需要该扩展支持
oci8
如果zabbix数据库采用Oracle,则需要该扩展支持
pgsql
如果zabbix数据库采用PostgreSQL,则需要该扩展支持
sqlite3
如果zabbix数据库采用SQLite,则需要该扩展支持
[/code]
服务器:
[code]
OpenIPMI
Required for IPMI support.
libssh2
Required for SSH support. Version 1.0 or higher.
fping
Required for ICMP ping items.
libcurl
Required for web monitoring.
libiksemel
Required for Jabber support.
net-snmp
Required for SNMP support.
[/code]
硬盘空间需求:
[code]
zabbix程序自身需求
大约10M
History历史记录
days*(items/refresh rate)*24*3600*bytes
items : 被监听的项目数量
days : 历史记录保存天数
refresh rate : 监听项目数据平均刷新频率
bytes : 平均每条监听项目数据保存所需要的空间大小。它由数据库引擎决定,一般来说是50bytes
Trends趋势图
days*(items/3600)*24*3600*bytes
bytes : 同上,一般来说是128 bytes.
Events事件记录
days*events*24*3600*bytes
bytes :同上,一般是 130 bytes.
[/code]
例如
我预计每分钟大约接收3k条监控信息,并设置这些数据我需要保留5年;
同时,生成的图表信息也记录5年;
触发事件的数据记录事件设定为三年。
那么
我总共需要的储存空间大约为:
监控数据:30*24*3600*(3000/60)*50≈6.5GB
图表数据:3000*24*365* 128 ≈ 3.4GB
事件记录:3*365*24*3600* 130 ≈ 12.3GB
--------------------------------------------------------
共计: 约 22G
下载:
[code]http://www.zabbix.com/download.php[/code]
部署Zabbix Server端:
创建zabbix进程用户
[code language="bash"]
groupadd zabbix
useradd -g zabbix
[/code]
解压zabbix (假定它位于/root目录)
[code language="bash"]
cd /root
tar zxf zabbix-2.0.4.tar.gz
cd zabbix-2.0.4
./configure --prefix=/usr/local/zabbix/ #指定安装目录
--enable-server #打开服务端
--enable-agent #打开代理端(如果不需要对zabbix服务端进行监控则可以不用添加此参数)
--with-mysql=/usr/local/mysql/var/mysql_config #配置数据库(这里根据自己的实际需求进行配置)
[/code]
*我测试机上用到的配置就这些了,使用configure --help可以查看更多配置项,根据自己的实际需求选择安装
[code language="bash"]
make
make install
[/code]
接着,可以把它提供的init.d启动脚本拷贝到系统中去
[code language="bash"]cp misc/init.d/fedora/core/* /etc/init.d/
chmod a+x /etc/init.d/zabbix_*[/code]
编辑一下启动脚本以适应自己的安装环境,主要是配置一下路径信息:BASEDIR为zabbix的安装路径
然后,编辑zabbix_server配置文件 (/usr/local/zabbix/etc/zabbix_server.conf)
下面罗列出我在实验机中使用到的配置信息:
[code]
#库连接配置:
DBHost=localhost #数据库连接地址
DBName=zabbix #zabbix使用的数据库名称
DBUser=zabbix #zabbix数据库连接用户名
DBPassword=kkk #zabbix数据库连接密码
DBSocket=/tmp/mysql.sock #mysql.sock路径
DBPort=3306 #mysql端口
#其他配置:
ListenPort=10051 #监听端口
ListenIP=172.16.103.230 #监听IP地址。这项默认是对本机所有ip进行监听,按需设置。
LogFile=/tmp/zabbix_server.log #日志存放路径设置
PidFile=/usr/local/zabbix/zabbix_server.pid #pid文件存放位置
[/code]
启动server端:
[code language="bash"]service zabbix_server start[/code]
查看是否启动成功:
[code language="bash"]netstat -tunnpl | grep zabbix[/code]
如果显示10051端口已被监听,那么server端无问题
[code]tcp 0 0 172.16.103.230:10051 0.0.0.0:* LISTEN 3285/zabbix_server[/code]
*server端可能也装有agent,它的配置留到后面agent端安装的过程中一起说

Web管理界面:
*需要用到PHP。关于PHP的安装这里不多说了,注意一下前面提到的PHP extension是否都已经安装好了。
*假设我的网站根目录在/var/www
*Nginx进程用户、用户组为“www”

[code language="bash"]
cp -r /root/zabbix-2.0.4/frontends/php/* /var/www
chown -R www:www /var/www
[/code]
然后在浏览器中访问执行配置
欢迎界面:

PHP运行环境检测(如果有没通过的项目,修改php.ini吧):

数据库连接配置:

Zabbix Server端连接配置:

这里Host一项建议填写之前编辑的 zabbix_server.conf 中ListenIP项目配置值

信息确认页面:

配置完成,如果之前并没有对服务器目录中的文件执行所属用户、所属组分配操作的话会出现如下提示,点击Download configuration file按钮将配置文件下载下来并放到网站 conf/ 目录中去。

安装完成,点击Finish进入操作平台

初始用户名:admin
初始密码 :zabbix

========== 至此,Server端安装完成 ==========

Agent端:
在需要被监听的机器上下载对应系统版本的agents package

[code language="bash"]
mkdir /usr/local/zabbix
cd /usr/local/zabbix
wget -c http://www.zabbix.com/downloads/2.0.4/zabbix_agents_2.0.4.linux2_6.i386.tar.gz
tar zxf zabbix_agents_2.0.4.linux2_6.i386.tar.gz
[/code]

接下来,需要对angent进行一些配置
Server安装产生的配置文件位于:zabbix安装目录/etc/zabbix_agentd.conf
agent package产生的配置文件位于:zabbix目录/conf/zabbix_agentd.conf

[code]
#主要需要配置的内容为:
Server=172.16.103.230 #指定Server端的IP地址
Hostname=eyou60 #本机的hostname
#其他一些配置:
PidFile=/tmp/zabbix_agentd.pid #pid文件设定
LogFile=/tmp/zabbix_agentd.log #日志文件设置
LogFileSize=10 #设定单个日志文件的最大大小(单位为M)
ListenPort=10050 #agentd监听端口
ListenIP=172.16.100.60 #监听IP。默认是对本机的所有进行监听,按需设置
#另外不得不说的一个配置是UserParameter,可以通过这个配置实现自定义监控项目,非常实用的一个配置项,在后面具体使用过程中再介绍它。

#配置基本上足够了,如果有别的需求可以自行查看zabbix_agentd.conf文档中的具体说明再按需配置
[/code]
复制zabbix_agentd启动脚本到/etc/init.d中并修改好路径信息

启动agentd
[code language="bash"]service zabbix_agentd start[/code]
查看是否启动成功
[code language="bash"]netstat -tunnpl | grep zabbix[/code]
若10050端口被成功监听,agent端配置基本无误
[code]tcp 0 0 172.16.100.60:10050 0.0.0.0:* LISTEN 6395/zabbix_agentd[/code]

========== 至此,Agent端安装完成 ==========

简单实用说明
配置Web界面为中文:
登录后点击右上角的Profile,在Language一项可以设置为中文界面。然后点击Save保存设置即可。

同时,点击Password可以更改初始登录密码。

另外,这里还可以设置报警方式,支持Email、短信和jabber(话说这个jabber是神马东东 囧rz)

嗯,不多说它们了,自己多折腾折腾。

这里我们主要说明一下常用到的配置

主机组:
这里可以理解成设置一些组别
比如根据服务器所在机房进行分类,设置“酒仙桥机房”、“公司内部机房”等,然后将需要监控的机器分门别类的归置
又或者根据服务器的使用类型进行分类:Web服务器、MySQL服务器、MongoDB服务器等
或者………………
总之就是根据自己的实际使用需求对被监控的服务器进行分类类别设置的地方
设置类别后可以对不同类绑定不同的监控模板,这样就省去了给每一台被监控机器手工指定监控项目的麻烦。当然,某些服务器有特殊的监控需求的话还是得自己手工添加,这里只是说一些通用的设置
配置方法也很简单,设置一个组名称,然后保存即可。

模板:
嗯,前面主机组提到过的,可以被绑定在主机组中,也可以直接分配到被监控的主机上
它同样是对监控项目的一个分类
一个模板通常包含有数个应用集、具体监控项目、触发器、图表、筛选条件等。
点击右上方的“创建模板”
填写好模板名称、显示名称,然后设置一下这个模板属于哪个/哪几个主机组或者主机,保存即可。
主机:
RT所示,这里面罗列出来的就是被监控的所有主机了,在这里面可以对每一台主机进行针对性设置,比如设置这台主机属于哪个组、需要监听些什么项目等。
右上角点击“创建主机”,填写一下表格即可。

当然,这时也可以直接给它绑定好需要的监控模板再执行保存:

发现:
这个应该是zabbix的一个特色功能了。
配置好发现规则之后,只要有新的agent向server发送数据,那么程序就会根据设定好的规则对这台主机进行添加处理,比如加入某个主机组、绑定监控模板等
点击右侧的“创建发现规则”

名称:该发现规则的名称,随意起
由代理节点进行发现:需要使用到proxy,选择没有代理节点吧
IP范围:只对指定IP段发现的新主机按照本规则执行处理
检查:点击“新的”,设置好检查类型、端口范围、键值,点击“添加”

唯一性标准:避免对同一台主机多次添加(实测这个设置不太好用,可能是我的配置还有问题)

配置完成后点击保存即可
到此,实现了对“发现”触发条件的配置,接下来进行进一步配置
进入 配置--动作

在右侧“事件源”中选择“发现”,然后点击“创建动作”

这一页,设置好这个动作的名称即可,然后点击“条件”标签

在这里我们设置一些触发条件,只有被“发现”搜索到的新机器符合我们设置的条件后才会执行后面“操作”中设置的动作行为。

嗯,不得不说zabbix自带的中文包翻译的确实很烂呀,发现状态=“上”??
看着很别扭吧,原版是这样的:

或许还是这样好理解一些- -
先跳过这里,继续配置“操作”

好了,连起来解读一下这两段配置
zabbix通过预设好的“发现”规则,发现有新的主机接入zabbix了,然后zabbix开始在我们给“发现”设定的“动作”中进行筛选,比如新添加的是一台通过zabbix agent协议连接到server的linux主机,它的ip段恰好也在192.168.0.1到192.168.0.127之中,那么zabbix会添加这台主机到主机列表中,并将它加入到“Zabbix servers”主机组,然后为它分配“Discovered hosts”、“Template OS Linux”监控模板。
这么解读一下应该就通常了吧O(∩_∩)O

嗯,关于“发现”功能的配置差不多就这样吧~

最后来说说重点吧,监控项目:
首先,zabbix自带了一些监控内容,比如对服务器CPU、Mem、Swap等的监控,我们可以直接在主机配置过程中添加这些监控模板到主机中实现对这些内容的监控。
这里简要说一下自定义监控项目的配置:

亮点:只要是是能够通过命令行拿到的“状态码”,那么都可以让zabbix来监控
这里以实现一则对Nginx的简单监控为例进行说明

首先配置nginx打开status
在server段添加如下配置:
[code]
location /status{
stub_status on;
access_log off;
}
[/code]
重载nginx配置文件后访问 h ttp://服务器地址/status 后会返回如下信息:
[code]
Active connections: 2
server accepts handled requests
10375 10375 12954
Reading: 0 Writing: 1 Waiting: 1
[/code]
它包含了这台nginx当前状态的一些基本数据,如connections、Server accepts、server handled、server requests……
下面开始编写脚本来分别获取它们
[code]
#!/bin/bash
#file: /root/nginx.sh
HOST=`/sbin/ifconfig eth0 | sed -n '/inet /{s/.*addr://;s/ .*//;p}'`
PORT='80'

function active {
/usr/bin/curl -s "http://$HOST:$PORT/status" | grep 'Active' | awk '{print $NF}'
}

function reading {
/usr/bin/curl -s "http://$HOST:$PORT/status" 2>/dev/null | grep "Reading" | awk '{print $2}'
}

function writing {
/usr/bin/curl -s "http://$HOST:$PORT/status" 2>/dev/null | grep "Writing" | awk '{print $2}'
}

function waiting {
/usr/bin/curl -s "http://$HOST:$PORT/status" 2>/dev/null | grep "Waiting" | awk '{print $2}'
}

function accepts {
/usr/bin/curl -s "http://$HOST:$PORT/status" 2>/dev/null | awk 'NR==3{print $1}'
}

function handled {
/usr/bin/curl -s "http://$HOST:$PORT/ngss" 2>/dev/null | awk 'NR==3{print $2}'
}

function requests {
/usr/bin/curl -s "http://$HOST:$PORT/ngss" 2>/dev/null | awk 'NR==3{print $3}'
}

$1
[/code]
保存
然后
[code]chmod a+x /root/nginx.sh[/code]
执行测试:
[code]
/usr/local/zabbix/script/nginx.sh accepts
97807
[/code]
成功。
接下来编辑zabbix_agentd.conf配置文档
最后一段添加:
[code]UserParameter=nginx.[*],/bin/bash /usr/local/zabbix/script/nginx.sh $1[/code]
这是一个key-value的设置
格式为UserParameter=,
这里设置了一个键nginx.[*]
其中[*]可以是一个或多个任意值,accepts,于是这个时候键就成了nginx.accepts
获取到[*]中的“参数”后它们将会被按顺序分配到$1 $2 $3...中去,
于是这个时候后面的句子就成了之前我们测试过的那种“样式”了:
/bin/bash /usr/local/zabbix/script/nginx.sh accepts
嗯,关于这个key-value,具体的使用方法还是参阅zabbix的官方文档吧
http://www.zabbix.com/documentation/2.0/manual/config/items/userparameters
保存,然后重启zabbix_agentd服务

进入Web管理界面->配置->模板
新建一个Nginx监控模板,如“Nginx Status”
保存

然后点击后面的“项目”开始添加监控项目
比如添加刚刚的accpets数据的监控
名称随意,如 Nginx Accepts
键值: nginx.accpets (还记得刚刚的UserParameter吗?)
类型:Zabbix代理(主动)
数据类型:十进制数字
再设置好更新频率、数据历史记录时间、图表保留时间等之后,保存即可完成一个简单的监控项目。

依照这个方法再逐一完成别的监控项目配置
接下来我们需要一个数据图形来为我们展示监控数据
点击“图形”按钮
新建一副图形
名称可以随意设置,这个会在图形列表中显示出来
然后设置好图形宽高值、图像类别等之后,再在项目中将我们需要展示在图表中的数据添加进来

再根据自己的喜好设置一下每项数据的展示方式,颜色、绘图样式、颜色等

然后点击保存。

接着,就可以在监控页面中查看了:
监测中->图形

========= Zabbix的大致部署流程说明就到这里了,更多使用还请参与zabbix官方文档 =========
http://www.zabbix.com/documentation/2.0

标签: zabbix, zabbix server, zabbix使用, zabbix配置

已有 11 条评论

  1. 保持沉默

    为什么我的触发条件里没看到有“主机IP地址”一项呢?

  2. rxdrd000

    谢谢你的回答,zabbix自带CPU负载监听项目,所以搞不清什么原因

  3. rxdrd000

    我的agent能抓到其他数据就是抓不到cpu负载和内存的数据,不知道什么原因

    1. skidu

      @rxdrd000: 好久没有接触zabbix了,记不太清楚是否自带CPU负载等监听项目。如果没有的话,可以在agent端自行编写脚本然后通过agent传给zabbix server:)

  4. 你好,按照您的做法 数据住不到是怎么回事 图标是不显示的 [root@LocalMe zabbix_agentd.conf.d]# ../../sbin/zabbix_agentd -t nginx.active
    nginx.active [m|ZBX_NOTSUPPORTED]

    1. skidu

      @bing1178: 。。zabbix我都快搞忘了- -
      你这里读不到数据是什么意思呢?agent端脚本以及配置都做好了吗?

      1. @skidu: 哎 意思我全都懂 , 我的版本也是 2.x 就是做好之后 抓不到 数据 我再看看吧 那你们现在 还在用 zabbix 吗

        1. skidu

          @bing1178: 嗯。。之前那个项目停掉了。。就没有继续折腾了。。会不会是防火墙呢?囧rz~~

  5. 别搞这么多代码了·
    元旦快乐呀!

    1. skidu

      @Yang
      同乐同乐呀~~
      呵呵。。这个也是没事瞎折腾着玩的:)
      我还在想怎么和牛叉的spam兄作斗争的事╮(╯▽╰)╭

  6. 完全看不懂 :cahan:

评论已关闭