Zabbix简介
本文系统环境是CentOS7x86_64, Zabbix 3.x。
Zabbix (音同 zæbix),是由 Alexei Vladishev 开发的一种网络监视、管理系统,基于 Server-Client 架构。Zabbix 的授权是属于 GPLv2。
Zabbix可用于监视各种网络服务、服务器和网络机器等状态。是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
Zabbix也可经由SNMP、TCP、ICMP、SSH等对目标进行监视。
Zabbix的系统构成
Zabbix系统由以下各独立模块组成:
- Zabbix Server,服务端(以C开发)。Server端通过收集SNMP和Agent发送的数据,写入数据库,再通过PHP+Apache在Web端展示;
- Zabbix Agent,客户端(基本支持所有操作系统),并将监控主机数据发送给Server;
- Zabbix Frontend,Web管理端(以PHP和JavaScript构成);
- Zabbix Proxy(可选组件)。用于分布式监控。
Zabbix的特点
Zabbix是一个高度集成的网络监控解决方案,一个简单的安装包中提供多样性功能。
- 数据收集;
- 灵活的阀值(触发器)定义;
- 高度可配置化的告警;
- 实现图表绘制;
- Web监控功能;
- 丰富的可视化选项;
- 历史数据存储;
- 配置简单;
- 使用模板;
- 网络发现;
- Zabbix API;
- 权限管理系统;
- 功能强大并易于扩展的监控代理。
定义
Zabbix的常用术语含义。
主机(host): 一台你想监控的网络设备,用IP或域名表示。
主机组(host group): 主机的逻辑组,它包含主机和模板。
监控项(item): 你想要接收的主机的特定数据,一个度量数据。
触发器(trigger): 一个被用于定义问题阀值和评估监控项接收到的数据的逻辑表达式。
事件(event): 单次发生的需要注意的事情。
异常(problem): 一个处在异常状态的触发器。
动作(action): 一个对事件作出反应的预定义的操作。
升级(escalation): 一个在动作内执行操作的自定义场景。
媒介(media): 发送报警通知的手段。
通知(notification): 利用已选择的媒体途径把事情相关信息发送给用户。
远程命令(remote command): 预先定义好的,满足一定条件后,可在被监控主机上自动执行的命令。
模板(template): 一组可以被应用到一个或多个主机上的实体的集合。
应用(application): 一组监控项组成的逻辑分组。
Web场景(Web scenario): 利用一个或多个HTTP请求来检查网站的可用性。
前端(frontend): Zabbix提供的Web界面。
Zabbix API: Zabbix API允许你使用JSON RPC协议来创建、更新和获取Zabbix对象信息或执行任何其他的自定义的任务。
Zabbix server: Zabbix软件监控的核心程序,主要功能是与Zabbix proxies和agent进行交互、触发器计算、发送告警通知,并将数据集中保存等。
Zabbix agent: 部署在监控对象上,能够主动监控本地资源和应用。
Zabbix proxy: 帮助Zabbix server收集数据,分担Zabbix server的负载。
Zabbix进程
Agent
zabbix agent部署在监控的目标上,主动监测本地的资源和应用(硬件驱动,内存,处理器统计等)。
zabbix agent手机本地的操作信息并将数据报告给zabbix server用于进一步处理。
zabbix agent有被动(passive)和主动(active)两种检查方式。
Server
zabbix server是zabbix软件的核心程序。它通过轮询和捕获数据,计算是否满足触发器条件,向用户发送通知。
它是zabbix监控代理和Proxy代理报告系统可用性和完整性数据的核心组件。zabbix server自身可以通过简单远程检查网络服务(如Web服务器和邮件服务器)。
server是一个包含了被存储了所有配置,统计方面的和可操作数据的中央仓库,它是监控系统问题升级以致于激活警告管理器的zabbix中的实体。
基本的zabbix server分三个不同的组件:zabbix server,web前端,数据库存储。
zabbix的所有配置信息都存储在服务器和web前端进行交互的数据库中。
zabbix server进程是以守护进程(Daemon)运行的。
Proxy
zabbix proxy是一个可以从一个或多个受监控的设备设备收集监控数据,并将信息发送到zabbix server的进程,基本上是代表server工作。
所有收集的数据都在本地进行缓存,然后传送到proxy所属的zabbix server。
zabbix proxy是完成远程区域、分支机构、没有本地管理员的网络的集中监控的理想解决方案。
zabbix proxy需要使用独立的数据库,以守护进程的方式运行。
Java gateway
zabbix守护进程原生支持监控JMX程序,它被称为zabbix java gateway。zabbix gateway是用Java语言写成。
要查得一台主机特定的JMX计数器值,zabbix server向zabbix java gateway发送请求,后者使用JMX管理API去请求远程的有关应用。应用不许额外安装软件,只需要启动时在命令行指定 -Dcom.sun.management.jmxremote
即可(是在java程序)。
每个zabbix server或zabbix agent只能配置一个java gateway。
Sender
zabbix sender是一种命令行应用,它可以将性能数据发送到zabbix server进行处理。该应用通常用在长时间运行的用户脚本,用于定期发送可用性和性能数据。
zabbix_sender -z zabbix -s "xxx" -k db.connections -0 43
-z :server主机
-s :受监控主机的技术名称
-k :监控项的键
-o :要发送的值
Get
zabbix get也是一种命令行应用,用于与zabbix agent进行通信,并从agent那里获取所需的信息。
该应用通常被用于zabbix agent故障排除
zabbix_get -s $host -p xxx -k system.cpu.load[all,avg15]
-s --host
-p --port
-I --source-address
-k --key
-h --help
-V --version
安装Zabbix
Zabbix安装要求
硬件:
- 内存,最小128MB;
- 磁盘,最小256MB;
- CPU,可能需要大量CPU资源;
- SMS(短信)通知服务,串行通讯口(serial communication port)和串口GSM调制解调器(serial GSM modem)。可选项。
支持平台:
- Linux;
- IBM AIX;
- FreeBSD;
- NetBSD;
- OpenBSD;
- Mac OS X;
- Solaris;
- Windows(Only Agent).
软件:
Zabbix基于Apache Web服务器、领先的数据库引擎和PHP脚本语言进行构建。
数据库管理系统:
- MySQL 5.0.3 及以上;
- Oracle 10g 及以上;
- PostgreSQL 8.1 及以上;
- SQLite 3.5及以上;
- IBM DB2 9.7 及以上。
前端:
- Apache 1.3.12 及以上;
- PHP 5.4.0及以上;
PHP-Extension:
软件 | 版本 | 备注 |
---|---|---|
gd | 2.0及以上 | PHP GD扩展包必须支持PNG图片 |
bcmatch | php-bcmatch | |
ctype | php-ctype | |
libXML | 2.6.15及以上 | php-xml |
xmlreader | php-xmlreader | |
xmlwrite | php-xmlwriter | |
session | php-session | |
sockets | php-net-socket | |
mbstring | php-mbstring | |
gettext | php-gettext | |
ldap | php-ldap | |
mysqli | 使用MySQL作为Zabbix后端数据库所需的组件 | |
pgsql | 使用PostgreSQL作为Zabbix后端数据库所需的组件 | |
sqlite3 | 使用SQLite作为Zabbix后端数据库所需的组件 |
客户端浏览器:
必须启用Cookie和JavaScript功能。
服务器:
要求 | 描述 |
---|---|
OpenlPMI | 支持IPMI功能所需组件 |
libssh2 | 支持SSH功能 |
fping | 支持ICMP ping功能 |
libcurl | 支持Web监控,VMware监控及SMTP认证 |
libiksemel | 支持Jabber功能 |
libxml2 | 支持VMware监控 |
net-snmp | 支持SNMP监控 |
Java网关:
Java gateway编译和运行在Java 1.6 及以上版本。
数据库容量:
Zabbix配置数据需要使用固定的磁盘空间,而这个空间不会过多增长。
Zabbix数据库容量主要依赖于以下参数:
- 每秒处理值的数量(Number of processed values per second);
- 历史(History)数据的回收清理设置(Housekeeper);
- 趋势(Trends)数据的回收清理设置(Housekeeper);
- 事件(Events)数据的回收清理设置(Housekeeper)。
时钟同步:
对于Zabbix稳定运行而言,服务获取精确的系统时间是非常重要的。对于所有运行Zabbix组件的系统,强烈建议这些系统的时间保持同步。
ntpd
是一个临幸的用于同步主机和其他服务器之间的时间的后台程序。
安装、启动、配置Zabbix
Zabbix-repo仓库:repo.zabbix.com
该仓库服务器同时提供yum
和apt
源码库。
配置源码库
1. 从官方下载源码库
#rpm -ivh http://repo.zabbix.com/zabbix/$version/rhel/7/$arch/$zabbix-release.rpm
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-1.el7.noarch.rpm
2. 手动配置zabbix.repo
vim /etc/yum.repos.d/zabbix.repo
[zabbix]
name=Zabbix-Repo
baseurl=http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/
gpgcheck=0
enable=1
安装Zabbix部署包
使用MySQL数据库安装Zabbix Server、Web前端:
yum install -y zabbix-server-mysql zabbix-get
注意:此处Zabbix数据库使用MySQL,请自行安装MySQL。
安装Zabbix Agent:
yum install -y zabbix-agent
安装初始化数据库
查看刚刚安装的 zabbix-server-mysql:
解压得到的sql脚本create.sql
只会在对应的数据库中初始化zabbix所需要的数据库表,但是不会创建zabbix数据库。所以后面我们还需要手动创建zabbix
数据库。
rpm -ql zabbix-server-mysql
cd /usr/share/doc/zabbix-server-mysql-3.x.xx/
#有一个create.sql.gz的压缩文件
gunzip create.sql.gz
#得到create.sql
在MySQL中创建zabbix数据库:
msyql -uxxx -p
mysql>CREATE DATABASE 'zabbix' DEFAULT CHARACTER SET 'utf8';
mysql>SHOW DATABASES;
mysql>GRANT ALL ON zabbix.* TO 'zabbix'@'localhost' identified by 'zabbix';
mysql>FLUSH PRIVILEGES;
#导入sql脚本
mysql -uroot -p -Dzabbix < ./create.sql
USE zabbix;
SHOW TABLES;
配置zabbix server并启动
编辑zabbix server配置文件:
vim /etc/zabbix/zabbix_server.conf
#常会修改的参数
#数据库配置
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
DBPort=3306
DBSocket=/var/lib/mysql/mysql.sock
#服务监听端口
ListenPort=10051
#服务端源IP
SourceIP=
#日志记录方式,file使用指定文件作为日志文件,system将日志发往syslog,console将日志发送控制台
LogType=file
LogFile=/var/log/zabbix/zabbix_server.log
启动zabbix服务端:
systemctl start zabbix-server
#此处可能由于没有关闭SELinux而报错
tail /var/log/zabbix/zabbix_server.log
cannot set resource limit: [13] Permission denied
#关闭SELinux
setenforce=0
vim /etc/selinux/config
SELINUX=disabled
#查看zabbix-server默认监听的10051端口
netstat -nltp
安装zabbix web
zabbix web可以安装在单独的主机上,只要能连接到zabbix database所在数据库就行。但为了方便,都安装在了server上。
zabbix web需要LAMP环境:
#可能需要自己配置PHP remi源,注意PHP及扩展版本问题
yum install -y httpd php php-mysql php-mbstring php-gd php-bcmatch php-ldap php-xml
安装zabbix web所需的两个包:
yum install -y zabbix-web zabbix-web-mysql
rpm -ql zabbix-web
#zabbix-web位于/usr/share/zabbix/
编辑zabbix的前端Apach-PHP配置文件
zabbix前端的Apache配置文件位于 /etc/httpd/conf.d/zabbix.conf:
vim /etc/httpd/conf.d/zabbix.conf
#需修改时区
php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value always_populate_raw_post_data -1
php_value date.timezone Asia/Shanghai
#添加httpd的虚拟主机访问zabbix web
<VirtualHost IP:80>
servername zabbix.me
documentroot /usr/share/zabbix
默认数据
</VirtualHost>
#开启httpd服务
systemctl start httpd
添加hosts后就可以利用域名访问zabbix-web端了。
echo -e "192.168.1.9 \t zabbix.me" >> /etc/hosts
在web端配置zabbix
在浏览器访问 http://zabbix.me 初始化zabbix配置。
配置好后就需要用账号密码进行登录zabbix-web端dashboard。
登录进Dashboard后,可修改语言为中文。
如果你的Zabbix无法看到中文选项,那么可能需要如下操作:
vim /usr/share/zabbix/include/locales.inc.php
#修改
'zh_CN' => ['name' => _('Chinese (zh_CN)'), 'display' => true],
如果又遇到中文乱码的问题,则可以从windows中挑选一些好看的中文字体,将对应字体文件放置到zabbix web的字体目录中。
windows中字体后缀.TTF,Linux中为.ttf。注意修改大小写。
cd /usr/share/zabbix/fonts
#只有一个默认字体 graphfont.ttf
#将新字体放置到此目录下
#修改配置文件中对应字体名称
vim /usr/share/zabbix/include/define.inc.php
#将默认字体名字修改为字体目录下 你需要的字体名
define('ZBX_FONT_NAME', 'graphfont');
define('ZBX_GRAPH_FONT_NAME', 'graphfont'); // font file name
#栗子,如perpetua字图PER.ttf
define('ZBX_FONT_NAME', 'PER');
define('ZBX_GRAPH_FONT_NAME', 'PER'); // font file name
Zabbix Web界面菜单:
- 管理菜单,用于管理zabbix自身及zabbix相关设置;
- 配置菜单,用于配置监控相关设置;
- 报表菜单,为管理员生成一段时间内的监控统计信息;
- 检测中菜单,用于查看被监控的相关数据;
- 资产记录菜单,查看被监控的主机有哪些,以及相关的资产信息。
安装zabbix agent
Agent端安装也非常方便,直接在Client上安装两个包即可。
#配置zabbix源
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.4-1.el7.noarch.rpm
#aliyun镜像
#rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
#安装
yum install -y zabbix-agent zabbix-sender
rpm -ql zabbix-agent
#/etc/zabbix/zabbix_agentd.conf
zabbix的“主动模式”与“被动模式”都在/etc/zabbix/zabbix_agentd.conf
中定义。
配置最常用的agent端:
vim /etc/zabbix/zabbix_agentd.conf
####GENERAL PARAMETERS 通用配置
PidFile=
LogFile=
####Passive checks related 被动模式配置
#指定允许哪台服务器拉取本机数据
Server=
#指定agent端工作于被动模式时监听的端口号
ListenPort=10050(默认)
#指定agent端工作与被动模式时所监听的IP地址
ListenIP=0.0.0.0(默认)
#指定预生成的agent进程数量
StartAgents=
####Active checks related
#agent工作于主动模式时,将消息推送到哪台Server上
ServerActive=IP1,IP2...
#指定当前主机主机名,Server端通过对应的主机名识别主机
Hostname=
#指明agent端每隔多少秒将采集的数据发往Server端
RefreshActiveChecks=
#栗子
Server=192.168.1.9
ServerActive=192.168.1.9
Hostname=zabbix.me
启动zabbix-agent
systemctl zabbix-agent start
#查看状态,默认端口10050
netstat -nltp
zabbix-agent状态
快速开始zabbix-web菜单
zabbix-web界面中包含有监测中、资产记录、报表、配置、管理五项菜单。
登录和配置用户
在浏览器输入 zabbix.me (修改hosts),登录zabbix-web后台。
默认用户名:Admin,密码:zabbix。它是超级管理员。
为了防止暴力破解和词典攻击,连续尝试五次登录失败,zabbix界面将暂停30秒。
可以通过管理(Management)菜单下的用户(User),新建、查看、管理用户信息。
zabbix在安装后自定义了两个用户:
- Admin用户是zabbix的超级管理员,拥有所有权限;
- Guest用户是一个特殊的默认用户。如果你没有登录,你访问zabbix的时候其实就是“guest”权限。guest默认没有任何权限。
你可以创建一个用户(user)并将其加入特定的用户组(Group)以提升用户权限。
新建用户
新建主机
zabbix中的主机(host)是一个你想要监控的网络实体(物理的、虚拟的)。对于主机的定义非常灵活。它可以是一台物理服务器,一个网络交换机,一个虚拟机或一些应用。
可以通过配置(Configuration)菜单下的主机(Host),查看已配置主机相关信息。
默认有一个“Zabbix Server”的定义好的主机。
点击创建主机(Create host)后,填写对应的主机名称、添加对应的主机群组,zabbix-agent的IP地址和端口,以及其它信息。
新建监控项
监控项是zabbix中获得数据的基础。没有监控项,就没有数据。因为一个主机中只有监控项定义了”单一的指标“或者”需要获得的数据“。
可以通过配置(Configuration)菜单下的主机(Item),找到需要配置监控项(Item)的主机,然后创建监控项。
主机默认是没有定义任何监控项的。
填写对应的监控名称、类型、键值、主机接口、信息类型等等信息。
添加监控项
可在监控(Monitoring)菜单中最新数据(Latest data)查看之前定义的监控项和获得的值。
还可选择以图形(Graph)或值来查看监控项的相关信息。
新建触发器
监控项只用于手机数据。如果要自动评估收到的数据,我们则需要定义触发器(trigger)。
触发器包含了一个表达式,这个表达式定义了数据的可接受的阈值级别。
如果收到的数据超过了定义好的级别,触发器将被触发,或者进入异常状态(problem)。
从而引起我们的注意,让我们知道有问题发生。如果数据再次恢复到合理范围,触发器将会转到正常状态(OK)。
可以通过配置(Configuration)菜单下的主机(Hosts)选项,找到某主机的触发器(Triggers)创建触发器。
填写对应的触发器名称、表达式、描述等信息。
创建触发器获取问题通知
当监控项收集了数据后,触发器会根据异常状态触发报警。根据一些报警机制,它也会通知我们一些重要的事情,而不是直接在zabbix-web端进行查看。
这就是通知(Notification)的功能。
E-mail是最常用的异常通知发送方式。当然还有SMS(短信),脚本等媒体类型。
可以通过管理(Administration)菜单中的报警媒体类型(Media types),点击预定义媒体类型列表中的Email,来配置Email。
为了建立一个通知,我们需要在配置菜单下动作中,创建动作(Create action)。
一旦满足了触发器的条件,变回触发执行动作。如收到E-mail等...
新建模板
如果我们配置上前台主机,一些自动化操作会带来更多便利性。没错,模板(templates)功能就可以实现。
模板允许对有用的监控项、触发器和其他对象进行分组,只需要一步就可以对监控主机应用模板,已达到反复重用的目的。
当一个模板链接到一个主机后,主机会继承这个模板中的所有对象。简单而言,一组预先定义好的检查会被快速应用到主机上。
Zabbix为各种操作系统、设备以及应用准备好了一些预定义的模板。你可以快速部署使用他们。
但是请注意,一些模板需要根据你的实际情况和使用环境进行适当俄调整。 比如,一些检查项是不需要的,一些轮询周期过于频繁等。
在配置菜单下的模板(Templates)下,点击创建模板(Create template)。填写对应的模板名称,群组等信息。
创建模板完毕后,可将模板链接到主机。之后,模板及其所有对象被添加到了主机。
配置
主机和主机组
一般来讲,zabbix主机是指你希望监控的那些设备。如服务器、工作站、交换机等。
创建主机是使用zabbix过程的首要任务。
配置一台主机
配置--主机--创建主机--填写相关参数信息。
可以在已经存在的主机上使用 Clone或Full Clone创建一个新主机。
Clone将保留所有的主机参数和模板链接;
Full Clone将额外保留指数实体(应用集、监控项、触发器、视图、规则、Web场景)。
新建主机下:
- 主机(Host):包含了通用的主机属性;
- 模板(Template):允许将模板链接诶到主机,所有实体将从模板继承;
- IPMI:包含IPMI管理属性;
- 宏(Macros):允许定义主机级别的用户宏;
- 主机资产记录(Host inventory):允许为主机收工输入库存信息;
- 允许你请求与主机的加密的连接。
资产管理(Inventory)
你可以将联网设备的资产信息保存在zabbix里。
资产信息实在配置主机时人工录入建立的资产信息数据,或者通过使用某些自动填充选项完成的录入。
构建资产库:
- 手动模式: 在配置一台主机的时候,手动输入资产信息;
- 自动模式: 在配置主机的时候,选择自动。
之后便可以在资产记录菜单中的概述,主机项中查看相关信息。
批量更新(Mass update)
有时候可能需要一次更改多个主机的某些属性,使用批量更新(mass update)功能来代替打开每个主机进行编辑。
批量更新可批量处理主机、模板、IPMI、资产、加密相关信息。
监控项(Items)
监控项是从主机收集的数据信息。
配置主机后,需要添加一些监控项以开始获取数据。快速添加多个监控项的一种方法是将预定义的模板附加到主机。
在单个监控项中,可指定从主机收集哪些数据信息。
为此,可使用监控项key。 如system.cpu.load将收集处理器负载的数据。
要给 key 指定更过参数,请在后面添加方括号[]。 如system.cpu.load[avg5], 返回最近5分钟的CPU负载平均值。
创建一个监控项
可在主机中新建一个监控项。
不支持的监控项:如果由于某种原因无法检索该值,则该监控项可能不被支持。这些监控项仍然以固定的间隔重新检查。
监控项的key:
- key名称允许使用字符: 0-9a-zA-Z_-.
- key参数,用 逗,号 分隔: xxx[par1,par2...]
- key参数也可以为空,此时使用默认值: key
- key参数带引号,则允许任何Unicode字符,如果包含双引号则需要 \反斜杠 转义
- key参数是一个数组,它需要包含在方括号中
自定义间隔(Custom intervals)
创建关于监控项的自定义时间规则。
灵活间隔被设计为重新定义默认监控项的的更新间隔,但调度间隔用于指定独立执行的检查计划。
灵活的间隔(Flexible intervals):允许重定义特定时间段的默认间隔。
- 间隔(Interval): 指定时间段的更新间隔;
- 期间(Period): 灵活间隔有效的时间段;
- 举个栗子: 60(interval), 1-7,00-24(period)。监控项每隔60s检查一次。
调度间隔(Scheduling intervals):用于在特定时间检查监控项。
调度间隔定义为, md<filter>wd<filter>h<filter>m<filter>s<filter>
。
- md: month days(1-31)
- wd: week days(1-7)
- h: hours(0-23)
- m: minutes(0-59)
- s: seconds(0-58)
- <filter>: 指定其前缀的值----[from-to/step]。
其实类似于Linux中定时任务的写法,只不过这里把单位(md,wd,h,m,s)写在了数值的前面。
举个栗子:
md1-15 #1-15号
wd3 #星期三
h0-12 #上半天
m1,3,5,7,9 #每个1,3,5,7,9分钟
s/10 #每个10s
#组合体
wd1-5h9-18m/10 #每个工作日的上班时间每个10分钟
监控项类型(Items type)
监控项类型包含从系统获取数据的多种方式。每个监控项类型都有一组自己支持的监控项key和所需的参数。
监控项
zabbix提供的监控项类型:
- zabbix代理检查(agent checks)
- SNMP代理检查
- SNMP traps
- IPMI检查
- 简单检查(simple checks)
- VMware监控(monitoring)
- 日志文件监控
- 计算监控项(Calculated items)
- zabbix内部检查(internal checks)
- SSH检查
- Telnet检查
- 外部检查(External checks)
- 汇总检查(Aggregate checks)
- 捕捉器监控项(Trapper items)
- JMX监控
- ODBC监控
zabbix代理(zabbix agent):
这些检查与zabbix代理进行通信实现数据的采集。
- zabbix agent-passive: 被动模式,Server向Agent索要数据;
- zabbix agent-active: 主动模式,Agent主动上报数据给Server。
可支持的监控项,可在新建监控项是在键值里面查看。
SNMP代理(SNMP agent):
在启用SNMP的设备(如打印机,交换机,路由器...)上使用SNMP监控,为了能够监控SNMP代理在这些设备上提供的数据,zabbix服务器初始化配置时必须具有SNMP支持。
仅通过UDP协议执行SNMP检查。
配置SNMP监控:
- 使用SNMP接口为设备创建一个主机;
- 找出要监控项目的SNMP字符串;
- 创建一个监控项。
IPMI检查:
你可以在zabbix中监控 智能平台管理接口(IPMI) 设备的运行状况和可用性。
要执行IPMI检查,zabbix服务器必须首先配置IPMI支持。
简单检查:
简单检查通常用于远程无代理监控服务。
日志文件监控:
zabbix可用于集中监控和分析 具有/不具有 日志转动能力的日志文件。
当日志文件包含某些字符串或字符串模式时,通知信息可用于警告用户。
计算监控项:
计算监控项是创建虚拟数据源的一种方式。这些值将根据算术表达式定期计算。所有计算都由Server完成。
内部检查:
内部检查可以监控zabbix的内部检查。即Server或Agent Server的运行情况。
SSH检查:
运行SSH检查是作为无代理监控的,SSH检查不需要zabbix代理。
执行SSH检查zabbix服务器必须初始化配置为SSH2支持。
SSH检查提供两种身份验证方法,一种是用户/密码,另一种是基于密钥文件。
zabbix SSH 密钥配置:
vim /etc/zabbix/zabbix_server.conf
#SSHKeyLocation=
SSHKeyLocation=/home/zabbix/.ssh
usermod -m -d /home/zabbix zabbix
chown zabbix:zabbix /home/zabbix
chmod 700 /home/zabbix
cd /home/zabbix && su zabbix
ssh-keygen -t rsa
外部检查:
外部检查是由zabbix Server通过运行shell脚本或二进制的检查。
外部检查不需要再被监控的主机上运行任何代理。
汇总检查:
在汇总检查中,zabbix通过直接从数据库中查询监控信息,然后进行信息聚合。
聚合检查不需要再被监控的主机上运行任何代理。
捕捉器监控项:
捕捉器监控项接收传入的数据,而不是查询它。对于想要推送到zabbix的任何数据都是适用的。
要使用捕捉器监控项,需要在zabbix中建立一个捕捉器监控项,将数据送给zabbix。
JMX监控项:
JMX监控可用于监视Java应用程序的JMX计数器。
JMX监视器以zabbix守护进程方式运行,名为zabbix java gateway。
ODBC监控:
ODBC监控对应于zabbix web管理端中的数据库监控器监控项类型。
ODBC是用于访问 数据库管理系统(DBMS) 的C语言中间件API。
zabbix可以查询ODBC支持的任何数据库。为了实现监控,zabbix不直接连接到数据库,而是使用ODBC中设置的ODBC接口和驱动。
该功能允许为多个目的更加有效地监控不同的数据库。
历史与趋势
历史与趋势是zabbix中存储数据的两种方式。
历史保持每个收集的值,而趋势是每小时的平均信息。
建议保持的历史数据尽可能少,但可以保留更多的趋势数据。
用户自定义参数(user parameter)
有时你想运行一个代理检查,但它不是zabbix预定义的。这时就能用到用户参数。
用户参数是由zabbix代理之星的命令,最多可以返回512KB的数据。
key 是唯一的。
用户参数用法:
UserParameter=<key>,<command>
#栗子
UserParameter=ping,echo 1
#使用ping键为一个监控项返回 1
#复杂栗子
UserParameter=mysql.ping,mysqladmin -uroot -ppwd ping | grep -c 'alive'
#mysqld状态为alive返回1,否则0
#灵活的用户参数
UserParameter=key[*],command
#[*]定义该key接受括号内的参数
#栗子
UserParameter=ping[*],echo $1
UserParameter=mysql.ping[*],mysqladmin -u$1 -p$2 ping | grep -c 'alive'
#mysql.ping[zabbix,passwd]
UserParameter=wc[*],grep -c "$2" $1
#wc[/etc/passwd,root]
用户自定义参数扩展zabbix代理:
是将key添加到被监控的主机哦!
#编写命令--SQL查询总数
mysqladmin -uxxx -pxxx status | cut -f4 -d":" | cut -f1 -d"S"
#将命令添加到zabbix_agentd.conf
vim /etc/zabbix/zabbix_agentd.conf
#找到如下字段
### Option: UserParameter
UserParameter=mysql.totalquery,mysqladmin -uroot -pxxx status | cut -f4 -d":" | cut -f1 -d"S"
#mysql.totalquery这个key是唯一的标识符
#测试此参数
##测试参数可用与否很重要哈
zabbix_agentd -t mysql.totalquery
#重启zabbix-agent,将重新加载配置
zabbix_get -s $host -k mysql.totalquery
可加载模块(loadable modules)
可加载模块提供了一种关于zabbix性能扩展的选项。
可加载模块基本上只zabbix守护程序使用的共享库,并在启动时加载。
可加载模块具有很多优点,卓越的性能和可实现任何逻辑的能力,更重要的是使用和共享了zabbix模块的开发能力。
windows性能计数器(windows perfomance counter)
使用perf_counter[]key有效的监控windows性能计数器
批量更新(mass update)
使用批量更新功能,可一次更改多个监控属性。
值映射(value mapping)
对于接收值更人性化的表示,可以使用包含数值和字符串之间的映射的值映射。
如:
- 0 ---> error
- 1 ---> true
- F ---> Full
- D ---> Differential
- I ---> Incremental
- ...
应用集(Application)
应用集对逻辑组中的监控项进行分组。
如,对MongoDB的可用性,空间,负载,慢查询,执行命令...,可归于 MongoDB应用于中。
队列(queue)
队列显示正在等待刷新的监控项。
队列只是一个逻辑表达的数据。
队列显示的统计信息是zabbix服务器性能是否健康的指标。
在 管理--队列 下对去队列。
值缓存(value cache)
为了计算触发表达式,以及让计算/聚合监控项和一些宏更快,zabbix服务器支持值的缓存选项。
在内存中的缓存可用于访问历史数据,而不用之间调用数据库。如果缓存中不存在历史值,则从数据库请求缺少的值,并相应地跟新缓存。
要启用值缓存功能,修改zabbix_server.conf中可选的ValueCacheSize参数。
触发器(Trigger)
触发器是评估有项目采集的数据并表示当前系统状况的逻辑表达式。
触发器表达式允许定义一个什么状况的数据是“可接受”的阈值。如果超过了可接受状态,则触发器会被触发。
配置一个触发器(configuring a trigger)
在主机里面配置触发器。
触发器表达式(trigger expression)
一个简单有效的表达式看起来像:
{<server>:<key>.<function>(<parameter>)}<operator><constant>
#如
{192.168.1.7:agent.ping.time()}=0
函数参数(function parameters):
大多数数字型的函数接受秒数来作为参数。
#600s内所有值的总和
sum(600)
#随后5个值总和
sum(#5)
avg()
count()
last()
min()
max()
#5m 可被 300s 代替
#1k 代表 1024bytes
运算符(operators):
优先级 | 运算符 | 定义 |
---|---|---|
1 | - | 负号(minus) |
2 | not | 逻辑非(NOT) |
3 | *, / | 乘,除 |
4 | +, - | 加,减 |
5 | <, <=, >, >= | - |
6 | =, <> | 相等,不等于 |
7 | and | 逻辑与 |
8 | or | 逻辑或 |
触发器示例:
{www.zabbix.com:system.cpu.load[all,avg1].last()}>5
{www.zabbix.com:system.cpu.load[all,avg1].last()}>5 or {www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2
{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100k
{$url1:net.tcp.service[smtp].last()}=0 and {$url2:net.tcp.service[smtp].last()}=0
{$host:icmpping.count(30m,0)}>5
{$host:system.cpu.load[all,avg1].min(5m)}>2 and {$hsot:system.cpu.load[all,avg1].time()}>000000 and {$host:system.cpu.load[all,avg1].time)()}<060000
...
滞后(Hysteresis):
有时候需要一个触发器状态OK和PROBLEM之间的间隔,而不是简单的阈值。
要做到这一点,我们首先定义一个PROBLEM事件的触发器表达式,然后为OK选择 ‘Recovery expression’,并未OK事件书如不同的表达式
如:
#Problem expression
{server:temp.last()}>20
#Recovery expression
{server:temp.last()}<=15
#两者之间便有了几个滞后值
触发器依赖(trigger dependency)
有时候,一台主机的可用性取决于另一台主机。如一台路由器后的上网设备。
这就是主机之间某些依赖关系可能有用的地方,依赖关系设置的通知可能会被抑制,而只发送根本问题的通知。
zabbix中触发器的依赖,一个触发器可能有多个依赖于它的触发器。
路由器和路由器后的Server同时宕机,如果有依赖关系,则zabbix不会执行服务器的触发动作。
值得注意的是,如果触发器所依赖的触发器被禁用,则次触发器的事件和动作将不会被抑制。
批量更新
使用批量更新,可一次更改一些触发器的某些属性。
触发器严重性(trigger severity)
触发器严重性定义了触发器的重要程度:
- 未分类(not classified), 灰色
- 信息(information), 淡蓝
- 警告(warning), 黄色
- 一般严重(average), 橙色
- 严重(High), 淡红
- 灾难(disaster), 红色
自定义触发器严重性(customising trigger)
在 管理 -- 一般 -- 触发器严重性,里面自定义触发器严重性。
预测触发功能(predictive trigger function)
有时候有即将到来的问题的迹象。可以发现这些迹象,以便提前采取行动,以减小影响。
zabbix具有基于历史数据预测受监视系统的未来行为的工具,这些工具通过预测触发功能实现。
事件标签(event tag)
在zabbix中可以自定义事件标签,在触发器级别上定义事件标签。在事件标签定以后,相应的新事件被标记为时间标签数据。
在拥有自定义时间标签的情况下,可以变得更加灵活。
例如:
- 识别日志文件中的问题并单独关闭他们;
- 用它来过滤通知;
- 查看前端的事件标签信息;
- 从项目值中提取的信息作为标签值;
- 在通知中更好地识别问题;
- 通过使用模板级别的标签来建华配置任务;
- 使用低级别发现的标签创建触发器。
事件(Events)
zabbix可以生成一下几种类型的事件:
- trigger events-触发器事件;
- discovery events-发现事件;
- auto registration events-自动注册事件;
- internal events-内部事件;
事件以时间戳,并可以发送Email等基础动作。
在 监控-问题 里面查看信息信息。
触发器事件生成(trigger events generation)
触发器状态的变化是事件最常见和最重要的来源。每次触发器的状态改变时,都会生成一个事件。
改时间包含了触发器状态变更的详细信息、发生时间以及信息的状态。
触发器会创建两种类型的事件:问题(problem)和正常(OK)
手动关闭问题事件(manual closing of problems)
当触发器状态从“问题(problem)”变成“正常(OK)”时,很难判断是通过触发器表达式的方式解决。这时就需要手动解决。
只有在触发器中启用 “允许手动关闭” 选项,问题事件才可以被手动关闭。
其他事件来源(other event source)
zabbix定期扫描网络发现规则中定义的IP范围,可以为每个规则单独配置检查频率。一旦发现主机或服务,就会生成一个发现事件。
zabbix可以生成以下事件:
Service Up/Down
Host Up/Down
Service Discovered/Lost
Host Discovered/Lost
事件关联(event correlation)
通常,在zabbix中正常事件会关闭所有的问题事件,但在某些情况下需要更细致的方法。可以根据事件标签关联问题事件。
如,当监控日志文件时,在日志文件中想要发现某些问题,并将它们单独关闭,而不是一起关闭。
可视化(visualisation)
图形(graphs)
大量的监控数据被采集到zabbix中,如果能用可视化的表现形式来查看,那就直观和容易多了。
zabbix为用户提供了如下图形:
- 监控项数据的内置简单图形 “simple graphs”;
- 创建更复杂的自定义图形 “customised graphs”;
- 特定图形 "ad-hosc graphs"快速访问几个监控项的数据比较。
简单图形(simple graphs):
zabbix提供的简单图形,用来可视化显示监控项采集到的数据。并不需要配置就可以查看。
通过 监控-最新数据-图形 来展示图形。
自定义图形(customised graphs):
自定义图形,提供定制功能。这就有点厉害了。这个是手动配置的。
可以为单个主机、多个主机、单个模板、多个模板创建自定义图形。
在 配置-主机-图形-创建图形 里编辑图形属性;
图形编辑后可点击预览。
特设图形(ad-hoc graphs):
简单图形和自定义图形都不允许快速创建多个监控项目数据的比较图形,工作量小且没有维护。
在 检测-最新数据-旋转监控项前复选框-显示数据图(显示堆叠数据图) 下, 里面也包含了 正常和层积 的图形风格。
拓扑图(networking maps)
运维人员如果想要了解网络环境的基础设施状况,可以在zabbix中创建网络拓扑图。
配置拓扑图(configurating network maps):
在 监控-拓扑图 下,可以创建拓扑图。点击拓扑图中的 构造函数 选项,来打开编辑区域。
然后在编辑区域中添加元素和链接元素。
链接指示器(link indicators):
可以为网络拓扑图中的元素之间的链接分配一些触发器,当这些触发器状况为“Problem”时,可以在链接上体现出来。
如果多个触发器进入"Problem"状态,则严重程度最高的将决定链接的颜色和样式。
聚合图形(screen)
在zabbix的聚合图形页面上,你可把各种来源的信息聚集到一起,一边在单个屏幕上快速查看。
在 监测-图形聚合 下,对其进行创建、配置、管理和查看。
基本上,聚合图形是一个表格,你选择把每个表格有多少单元格以及其中要显示的元素。
元素如下:
- 简单图形;
- 简单图形原型;
- 用户自定义图形;
- 自定义图形原型;
- 拓扑图;
- 其他聚合图形;
- 纯文本信息;
- 服务器信息;
- 触发器信息;
- 主机/主机组信息;
- 系统状态;
- 数据概述;
- 时钟;
- 事件历史;
- 动作历史;
- URL。
幻灯片演示(slide shows)
在幻灯片演示中,可以配置多个聚合图形以设定的间隔逐个显示。
在 监测-聚合图形-幻灯片演示 下。
模板(template)
模板是可以方便地应用于多个主机的一组实体。
配置模板(configuring a template):
配置模板需要首先通过定义一些参数来创建模板,然后添加实例。
在 配置-模板-创建模板
链接模板(linking):
链接是将模板应用于主机的过程,之后主机将拥有模板的所有实体。
嵌套(nesting):
嵌套是一种包含一个或多个其它模板的模板方式。
可以在一个嵌套模板中奖一些模板链接在一起。
嵌套的好处在于,您只需要讲一个模板链接到主机,并且主机会自动继承链接的模板的所有实体。
事件通知(notifications upon events)
当配置了一些项目和触发器,并且由于触发器改变状态,现在正在发生一些事件,之后就要考虑 action。
发送通知是zabbix提供的主要操作之一。
为了能够发送和接收通知,必须:
- 定义一些media;
- 配置action,向指定的media发送消息。
action由condition和operation组成。当条件满足是,执行操作。
操作主要是 发送消息和执行远程命令。
media类型
媒体是zabbix中发送通知和警报的传送通道。
E-mail:
在 管理-媒体类型 下,配置Email。
SMS:
zabbix支持使用连接到zabbix-server的串行端口的串行GSM调制解调器发送SMS消息。
确保:
- 串行设备的速度(在Linux下通常为/dev/ttyS0) 与 GSM调制解调器的速度相匹配。zabbix没有设置串行链路的速度,它使用默认设置。
- zabbix用户对串行设备有读写访问权限。
- GSM调制解调器输入PIN码,并在电源复位后保留PIN码。或者在SIM卡上禁用PIN。
管理-媒体类型下
要为用户分配电话号码:管理-用户-报警媒介,添加报警媒介(如电话号码等)
Jabber:
zabbix支持发送jabber消息。
Ez Texting:
可以使用 zabbix技术合作伙伴 Ez Texting发送信息。
脚本:
警报脚本在zabbix服务器上执行,这些脚本位于服务器配置文件中定义的目录中(AlertScriptsPath)。
cat /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts
#创建报警脚本
vim /usr/lib/zabbix/alertscripts/zabbix_test.sh
#!/bin/bash
to=$1
subject=$2
body=$3
cat <<EOF | mail -s "$subject" "to"
$body
EOF
然后我们在创建脚本媒体的时候,写入相关参数。
actions
可以根据所有支持的类型的时间定义操作:
- 触发事件:当trigger的状态从OK转到Problem或回转时;
- 发现事件;
- 自动注册事件;
- 内部事件;
配置-动作-创建动作
条件(condition):
只有在事件与定义的条件匹配的情况下才执行操作。
注意运算类型:似与非似
操作(operation):
操作:发送信息,执行远程命令。
1.发送消息;
2.远程命令(不支持在zabbix-agent上执行远程命令,需要在zabbix-server到代理的命令才能直接连接。远程命令限制255字符,可以将过个命令放置于新行上来执行过个命令。及时目标主机处于维护状态,也会执行远程命令);
配置-动作-操作,在操作细节中修改操作类型为远程命令。
支持自定义脚本、SSH、Telnet等方式。
在信息中使用宏(using macros in messages):
在消息主题和消息文本中,可使用宏来更有效的问题报告。
恢复操作(recovery operation):
恢复操作允许在问题解决时通知我们。
恢复操作支持消息和远程命令。
宏(macros)
zabbix支持许多在多种情况下使用的宏。宏是一个变量,由如下特殊语法标识。
{MACRO}
根据在上下文汇总,宏解析为一个特殊的值。有效地使用宏可以节省时间,病史zabbix更加高效。
宏可以在监控项键值参数中使用。宏只能用在监控项键值参数的一部分中。
如item.key[server_{HOST.HOST}_local]
。
宏函数(macro function):
宏函数能提供自定义宏值的功能。
宏函数语法:
{<macro>.<func>(<params>)}
#<macro>, 要定义的宏
#<func>, 要应用的函数
#<params>, 以逗号分隔的函数参数列表
#栗子
{{ITEM.VALUE}.regsub{pattern, output}}
用户宏(user macro):
除了支持开箱即用的宏之外,zabbix还支持更灵活的用户宏。
用户宏可在全局、模板和主机级别进行定义。有一个特殊语法:
{$MACRO}
用户宏可用于:
- 监控项名称;
- 监控项键值参数;
- 触发器名称和描述;
- 触发器表达式参数和常量;
- 许多其他位置。
自动发现宏:
有一种自动发现(LLD)函数中使用的宏类型,可用于创建监控项、触发器和图形原型。然后,当发现真实的文件系统、网络接口等,这些宏将替换为真实的值,并且以这些值来创建真实的监控项、触发器和图形。
{#MACRO}
用户和用户组(user and group)
zabbix中所有用户都通过web前端去访问zabbix应用程序。并为每一个用户分配唯一的登录名和密码,被加密储存于zabbix数据库中。
配置用户(configuring user)
管理-用户,创建和管理用户。
权限(permission)
可定义相应的用户类型,如用户,管理员和超级管理员。
用户组(groups)
管理-用户组,创建和配置用户组。
服务监控(service monitoring)
服务监控,旨在帮助那些想要高级业务监控的人。
在很多情况下,我们关注的不是底层细节,而是提供的可用性服务。
服务是分层表示监控数据。
IT
Workstations
workstation1
workstation2Services
配置-服务,最高节点的服务是'root'。
你可以通过添加低级服务节点和各个节点服务创建下层层次结构。
Web监控(web monitoring)
配置-主机-web监测,创建或修改web监测信息。
可使用zabbix检查几个网站可用性方面。(zabbix中包含libcurl库才行)
要使用web监控,需要定义web场景。包括一个或多个HTTP请求或步骤。Zabbix-Server根据预定义的命令周期性的执行这些步骤。
所有web场景会手机下列数据:
- 整个场景中所有步骤的平均下载速度;
- 失败的步骤数量;
- 最后一次错误信息
web场景的所有步骤,都会收集下列数据:
- 平均下载速度;
- 响应时间
- HTTP状态吗
Web监控项(web monitoring items)
在创建web场景时,会自动添加一些新监控项进行监控。
创建场景后,zabbix会自动添加以下监控项进行监控,将它们链接到所选的应用程序。
- 场景<scenario>的下载速度;
- 场景<scenario>的失败步骤;
- 场景<scenario>的最后一个错误消息;
举个栗子:
##创建Web监测
#配置-主机-Web监测-创建web监测
URL:web.zabbix.me/monitor.php
要求的状态码:200
超时:20s
##创建web监测触发器
#配置-主机-触发器-创建触发器
严重性:一般严重
#触发条件:状态码!=200
表达式:N<>200
##创建触发报警对应的动作
#配置-动作-创建动作
#触发条件
触发器示警度=一般严重 or 触发器=web.zabbix.me
#操作:发送Email
发送给zabbix administrator用户群组
仅送到Email
默认信息/自定义信息
##在媒体类型中定义Email相关信息
#管理-报警媒体类型-Email
SMTP服务器:smtp.xxx.com
smtp端口:465
SMTP电邮:发件人Email
安全链接:SSL/TLS
认证:Usernameand passwd
用户名:xxx
密码: xxx
##接下来就可以测试接收报警Email了
虚拟机监控(VM monitoring)
zabbix支持对VMware的监控,使用low-levle-discovery(LLD)自动发现VMware hypervisors和虚拟机,并根据事先定义的主机原型,为这些虚拟机建立主机,添加监控。
zabbix中提供了几个模板,可以直接用来解控VMware vCenter 或 ESX hypervisor。
虚拟机监控分为两个步骤:
- 首先,zabbix是通过VMware collector进程来监控虚拟机。这些进程通过SOAP协议从VMware服务获取必要的信息,对其进行预处理并储存到zabbix-server共享内存中;
- 然后,zabbix-pollers通过zabbix简单检查VMware keys来检索这些数据。
要使虚拟机监控正常工作,需要libxml2库和libcurl库的支持。
配置-自动发现-创建自动发现
配置-主机-自动发现
维护(maintenance)
可在zabbix中为主机和主机组定义维护周期。
有两种维护类型:“继续对目标进行监控数据的收集” 和 “停止对目标进行监控数据的收集”
要在维护期间正常接收问题通知,必须在动作配置中的选项中取消选择暂停操作。
为了确保定期维护按照预期的时间进行,需要对zabbix的所有部分使用通用时区。
配置-维护-创建维护期
维护期的主机显示的是橙色背景!
事件确认(event acknowledgment)
zabbix中的问题事件可以由用户确认。
如果用户获得了有关问题时间的通知,可以访问zabbix前端,从时间导航到确认屏幕并确认问题。
当他们确认时,可输入评论或其他一些相关描述。
这样其他系统用户同样的问题,他们便会立即看到是否已被解决和目前的评论。
以这种方式,可以更协调的进行解决多个系统用户的问题的工作流程。
要确认事件,用户必须至少要有对相应触发器的读取权限。
在Dashboard下,在出现的问题里,点击确认,进入确认事件。
也可在监控-问题下查看问题详细信息。
配置导出/导入(Configuration export/import)
zabbix导入/导出功能,使得可以在一个zabbix系统与另一个zabbix系统之间交换各种配置实体。
类似于数据库的导入导出。即也可以对zabbix做备份。
可导出/导入的对象有:主机组; 模板; 主机; 拓扑; 图片; 聚合图形; 值映射。
数据也可导出:
- XML - 在前端
- XML or JSON - 在zabbix API
导出的详细信息:
- 所有支持的元素都导出到一个文件中;
- 不导出从连链接模板继承的主机和模板实体;
- 由低级别发现创建的实体依赖于他们的任何实体不会导出。
导入详细信息:
- 第一次遇到错误停止导入;
- 导入支持XML和JSON文件;
- 使用“删除缺失”选项导入主机/模板时,导入的XML文件中不存在主机/模板宏也将被删除。
将Zabbix展现在Nginx上
毕竟现在Nginx用的多,那就把Apache换成Nginx吧!
Nginx仓库:http://nginx.org/packages/
自己安装Nginx:
- 下载
nginx-release-xx.rmp
仓库源来安装; - 手动创建
/etc/yum.repo.d/nginx.repo
; - 直接下载
ngix.rpm
来安装; - 直接下载源码来安装。
相较于Apache,Nginx也只是配置个server就行了。优化什么的自己弄。
vim /etc/nginx/conf.d/zabbix.me
server {
listen 80;
server_name zabbix.me;
root /usr/share/zabbix;
location / {
if (!f $request_filename) {
rewrite ^([^\?]+)$ /index.php?1=$1 last;
}
}
location ~ \.php$ {
root /usr/share/zabbix;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
}
nginx -t
systemctl start nginx
下载就可以正常访问zabbix-web
端了!
网友评论