基于Zabbix构建企业级监控

基于Zabbix构建企业级监控_第1张图片
图片来自网络

文/Bruce.Liu1

文章大纲

  1. Zabbix简介
    1.1. Zabbix介绍
    1.2. Zabbix概述
    1.3. Zabbix进程介绍
    1.4. Zabbix说明
  2. Zabbix最佳实践
    2.1. 背景介绍
    2.2. 安装nginx
    2.3. PHP安装+NGINX配置
    2.4. 安装zabbix
    2.5. 智能监控的实现

1.Zabbix简介

1.1.Zabbix介绍

Zabbix是一个企业级的、开源的、分布式的监控套件解决方案,由一个国外的团队持续维护更新(Alexei Vladishev),当前处于活跃开发状态,Zabbix SIA提供支持;软件可以自由下载使用,运作团队靠提供收费的技术支持赢利。Zabbix通过C/S模式采集数据,通过B/S模式在web端展示和配置。
官方网站:http://www.zabbix.com

Zabbix可以监控网络和服务的监控状况. Zabbix利用灵活的告警机制,允许用户对事件发送基于Email的告警. 这样可以保证快速的对问题作出相应. Zabbix可以利用存储数据提供杰出的报告及图形化方式. 这一特性将帮助用户完成容量规划.

Zabbix支持polling和trapping两种方式. 所有的Zabbix报告都可以通过配置参数在WEB前端进行访问. Web前端将帮助你在任何区域都能够迅速获得你的网络及服务状况. Zabbix可以通过尽可能的配置来扮演监控你的IT基础框架的角色,而不管你是来自于小型组织还是大规模的公司.

Zabbix是零成本的. 因为Zabbix编写和发布基于GPL V2协议. 意味着源代码是免费发布的.
Zabbix公司也提供商业化的技术支持.

Alexei Vladishev创建了Zabbix项目,当前处于活跃开发状态,Zabbix SIA提供支持.

1.2.Zabbix概述

在知道zabbix是什么之后,我们最关心的是zabbix有什么特性,了解特性之后,我们才能决定是否会使用zabbix在知道zabbix是什么之后,我们最关心的是zabbix有什么特性,了解特性之后,我们才能决定是否会使用zabbix。
Zabbix是一个高度集成的网络监控套件,通过一个软件包即可提供如下特性:

数据收集

  • 可用性及性能检测
  • 支持SNMP(trapping及polling)、IPMI、JMX监控
  • 自定义检测
  • 自定义间隔收集收据
  • server/proxy/agents吸能

灵活的阀值定义

  • 允许灵活地自定义问题阀值,Zabbix中称为触发器(trigger), 存储在后端数据库中

高级告警配置

  • 可以自定义告警升级(escalation)、接收者及告警方式
  • 告警信息可以配置并允许使用宏(macro)变量
  • 通过远程命令实行自动化动作(action)

实时绘图

  • 通过内置的绘图方法实现监控数据实时绘图

扩展的图形化显示

  • 允许自定义创建多监控项视图
  • 网络拓扑(network maps)
  • 自定义的面板(screen)和slide shows,并允许在dashboard页面显示
  • 报告
  • 高等级(商业)监控资源

历史数据存储

  • 数据存储在数据库中
  • 历史数据可配置
  • 内置数据清理机制

配置简单

  • 主机通过添加监控设备方式添加
  • 一次配置,终生监控(译者注:除非调整或删除)
  • 监控设备允许使用模板

模板使用

  • 模板中可以添加组监控
  • 模板允许继承

网络自动发现

  • 自动发现网络设备
  • agent自动注册
  • 自动发现文件系统、网卡设备、SNMP OID等

快速的web接口

  • web前端采用php编写
  • 访问无障碍
  • 你想怎么做就能做么做
  • 审计日志

Zabbix API

  • Zabbix API提供程序级别的访问接口,第三方程序可以很快接入

权限系统

  • 安全的权限认证
  • 用户可以限制允许维护的列表

全特性、agent易扩展

  • 在监控目标上部署
  • 支持Linux及Windows

二进制守护进程

  • C开发,高性能,低内存消耗
  • 易移植

具备应对复杂环境情况

  • 通过Zabbix proxy可以非常容易的创建远程监控

1.3.Zabbix进程介绍

基于Zabbix构建企业级监控_第2张图片
图片来自网络

zabbix_agentd
客户端守护进程,此进程收集客户端数据,例如cpu负载、内存、硬盘使用情况等

zabbix_get
zabbix工具,单独使用的命令,通常在server或者proxy端执行获取远程客户端信息的命令。通常用户排错。例如在server端获取不到客户端的内存数据,我们可以使用zabbix_get获取客户端的内容的方式来做故障排查。

zabbix_sender
zabbix工具,用于发送数据给server或者proxy,通常用于耗时比较长的检查。很多检查非常耗时间,导致zabbix超时。于是我们在脚本执行完毕之后,使用sender主动提交数据。

zabbix_server
zabbix服务端守护进程。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway的数据最终都是提交到server
备注:当然不是数据都是主动提交给zabbix_server,也有的是server主动去取数据。

zabbix_proxy
zabbix代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到server里。为什么要用代理?代理是做什么的?卖个关子,请继续关注运维生存时间zabbix教程系列。

zabbix_java_gateway
zabbix2.0之后引入的一个功能。顾名思义:Java网关,类似agentd,但是只用于Java方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到server或者proxy。

1.4.Zabbix说明

具备常见的商业监控软件所具备的功能(主机的性能监控、网络设备性能监控、数据库性能监控、FTP等通用协议监控、多种告警方式、详细的报表图表绘制)支持自动发现网络设备和服务器;支持分布式,能集中展示、管理分布式的监控点;扩展性强,server提供通用接口,可以自己开发完善各类监控。

基于Zabbix构建企业级监控_第3张图片
图片来自网络

Server
指安装zabbix服务的服务器(以下简称服务器端),是最重要的部份,主要安装在linux系统上(支持多种操作系统),采用mysql存储监控数据并使用apache+php的方式呈现。

proxy
指安装在被监控设备上的zabbix代理(以下简称代理),被监控设备上的数据由代理收集后统一上传到服务器端由服务器端收集、整理并呈现。

agent
指支持SNMP协议的设备(也可以是服务器),通过设定SNMP的参数将相关监控数据传送至服务器端(大部份的交换机、防火墙等网络设备都支持SNMP协议)。

2. Zabbix最佳实践

2.1.背景介绍

2.1.1.软件参考文档

参考文档:
官方文档:https://www.zabbix.com/documentation/3.4/

软件下载:
NGINX软件:http://nginx.org/download/nginx-1.5.1.tar.gz
PHP软件:http://www.php.net/downloads.php or http://php.net/get/php-5.5.38.tar.gz/from/a/mirror
MySQL5.7 Yum Repository:https://dev.mysql.com/get/mysql57-community-release-el6-11.noarch.rpmMySQL5.7
Zabbix软件:https://www.zabbix.com/download
redis软件:http://download.redis.io/releases/redis-2.8.23.tar.gz
python软件:https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz
setuptools软件:https://pypi.python.org/pypi/setuptools
pip软件:https://pypi.python.org/pypi/pip#downloads

2.1.2.系统环境介绍
  • 系统版本
    CentOS release 6.7 (Final) x86_64

  • NGINX
    nginx-1.5.1(source code)

  • PHP
    php-5.5.38

  • MySQL版本
    mysql-5.7.20.-x86_64(RPM)

  • Zabbix版本
    zabbix-server-mysql-3.4.4-2
    zabbix-web-3.4.4-2
    zabbix-web-mysql-3.4.4-2
    zabbix-agent-3.4.4-2

2.1.3.安装系统要求
  • 涉及所有服务器关闭iptables、NetworkManager服务、selinux安全配置
# /etc/init.d/NetworkManager stop
# chkconfig NetworkManager off
# /etc/init.d/iptables stop
# chkconfig iptables off

/etc/selinux/config 改成disable

2.2.安装nginx

2.2.1.必要软件准备
  • 安装pcre
    为了支持rewrite功能,我们需要安装pcre
yum install pcre* 
  • 安装openssl
    需要ssl的支持,如果不需要ssl支持,请跳过这一步
# yum install openssl*
2.2.2.安装nginx

--with-http_stub_status_module:支持nginx状态查询
--with-http_ssl_module:支持https
--with-http_spdy_module:支持google的spdy,想了解请百度spdy,这个必须有ssl的支持
--with-pcre:为了支持rewrite重写功能,必须制定pcre

执行如下命令:

# ./configure --prefix=/usr/local/nginx-1.5.1 \
--with-http_ssl_module --with-http_spdy_module \
--with-http_stub_status_module --with-pcre
2.2.3.启动、关闭、重置nginx
  • 启动:直接执行以下命令,nginx就启动了,不需要改任何配置文件
/usr/local/nginx-1.5.1/sbin/nginx
  • 使用curl命令来读取web信息
# curl -s http://localhost | grep nginx.com
nginx.com.

  • 关闭:
/usr/local/nginx-1.5.1/sbin/nginx -s stop
  • 重置:当你有修改配置文件的时候,只需要reload以下即可
/usr/local/nginx-1.5.1/sbin/nginx -s reload

2.3.PHP安装+NGINX配置

2.3.1.安装PHP 5.5.38
  • 下载
cd /usr/local/src/
wget http://www.php.net/get/php-5.5.38.tar.bz2/from/jp1.php.net/mirror
  • 安装依赖包
    确保安装之前有安装gd,png,curl,xml等等lib开发库。如果不确定,执行以下命令:
yum install gcc make gd-devel libjpeg-devel libpng-devel libxml2-devel bzip2-devel libcurl-devel -y
  • 编译安装PHP 5.5.38

以下参数支持,ftp,图片函数,pdo等支持,因为使用了php自带的mysqlnd,所以不需要额外安装mysql的lib库了.如果你是64位系统,参数后面加上--with-libdir=lib64,如果不是可以跳过。

tar -xjf php-5.5.38.tar.bz2
cd php-5.5.38
./configure  --prefix=/usr/local/php-5.5.38 \
--with-config-file-path=/usr/local/php-5.5.38/etc --with-bz2 --with-curl \
--enable-ftp --enable-sockets --disable-ipv6 --with-gd \
--with-jpeg-dir=/usr/local --with-png-dir=/usr/local \
--with-freetype-dir=/usr/local --enable-gd-native-ttf \
--with-iconv-dir=/usr/local --enable-mbstring --enable-calendar \
--with-gettext --with-libxml-dir=/usr/local --with-zlib \
--with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd \
--enable-dom --enable-xml --enable-fpm --with-libdir=lib64 --enable-bcmath
make
make install

备注:如果PHP不需要curl和ftp的支持,可以将以上的--with-curl --enable-ftp去掉.

  • 配置php
cp php.ini-production /usr/local/php-5.5.38/etc/php.ini
cp /usr/local/php-5.5.38/etc/php-fpm.conf.default /usr/local/php-5.5.38/etc/php-fpm.conf
  • 启动php-fpm
/usr/local/php-5.5.38/sbin/php-fpm

执行以上命令,如果没报错一般情况下表示启动正常,如果不放心,也可以通过端口判断是PHP否启动

# netstat -lnt | grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
2.3.2.配置nginx
  • 安装nginx
    参考以上文章

  • 配置测试站点test.zabbix.com

mkdir -p /data/logs/nginx/ # 
mkdir -p /data/site/test.zabbix.com/ # 站点根目录
vim /data/site/test.zabbix.com/info.php

  • nginx配置
    在nginx.conf的http断中加上如下内容:
    /usr/local/nginx-1.5.1/conf/nginx.conf
user  root;        # root用户启动nginx
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    #
server {
        listen       80;
        #server_name monitor.ttlsa.com;
        #access_log  /data/logs/nginx/monitor.ttlsa.com.access.log  main;
 
        index index.html index.php index.html;
        root /data/site/test.zabbix.com;        # 测试页面的临时站点
        # root /usr/share/zabbix;        #默认rpm安装的zabbix web前端站点目录就是/usr/share/zabbix
 
        location /
        {
                try_files $uri $uri/ /index.php?$args;
        }
 
        location ~ ^(.+.php)(.*)$ {
                fastcgi_split_path_info ^(.+.php)(.*)$;
                include fastcgi.conf;
                fastcgi_pass  127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param  PATH_INFO          $fastcgi_path_info;
        }
}
}
  • 配置讲解

nginx将会连接回环地址9000端口执行PHP文件,需要使用tcp/ip协议,速度比较慢.建议大家换成使用socket方式连接。

  • 启动nginx
/usr/local/nginx-1.5.1/sbin/nginx
2.3.3.访问测试
# curl http://localhost/info.php

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">