前言
小菜运维仅仅只是一位菜鸟运维
废话不多说,小菜运维最近计划在公司内网部署一套 Zabbix Server 环境,用于监控公司线上WEB项目的运行状态,经过一番调研,最终决定采用 Nginx 部署 Zabbix,而放弃 Zabbix官网 推荐的 Apache 部署方案,主要原因还是目前公司运行环境都是基于 Nginx 搭建的。如果想使用 Apache 进行部署,完全可以参照 Zabbix官网教程 进行操作即可。
前置条件
环境准备:本文除 Zabbix 外,不再介绍其他组件的安装过程,假设你已经安装好了其他相关组件。
序号 | 组件 | 版本 |
---|---|---|
0 | Centos | 7 |
1 | Zabbix | 4.2 |
2 | MySQL | 5.7 |
3 | PHP | 7.0 |
4 | Nginx | 1.14.2 |
安装Zabbix
我们将参照 Zabbix官网教程,通过yum的方式进行安装。
- 访问 Zabbix官网下载页,如下图选择平台环境,这里我们选择的数据库是 MySQL;
- 官方的安装是通过yum进行的,在上一步完成后会自动在下面生成相关操作的shell命令,这里我们先完成前两步,也就是通过yum方式完成安装 zabbix-server 和 zabbix-agent;
# a. Install Zabbix repository
rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
yum clean all
# b. Install Zabbix server, frontend, agent
yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent
到这里,我们已经实现了 zabbix-server 和 zabbix-agent 的安装了,比通过源码编译安装的方式容易了很多,没错,菜鸟运维就是不喜欢源码编译安装!接下来要做的就是完成 zabbix 运行所需的数据库和WEB容器的配置;
创建Zabbix数据库
我们假设数据库用户为 root,密码为 Zabbix01,数据库实例名称为 zabbix_server 。对于创建数据库实例,我们可以参照官网教程在服务器通过命令行实现,也可以通过 Navicat 等客户端实现。
- 通过Navicat客户端工具创建数据库,注意字符集最好选择 utf8mb4;
- 通过命令行创建数据库;
# 通过命令行创建数据库
mysql -uroot -p
mysql> create database zabbix_server character set utf8mb4 collate utf8mb4_general_ci;
mysql> grant all privileges on zabbix_server.* to 'root@%' identified by 'Zabbix01';
mysql> quit;
初始化Zabbix数据库
Zabbix 的数据库初始化SQL脚本默认存储在 /usr/share/doc/zabbix-server-mysql-4.2.0/create.sql.gz,我们可以将其下载到本地解压后通过 Navicat 导入数据库,或通过执行命令行的方式导入。
- 通过Navicat客户端导入数据;
- 通过命令行方式导入数据;
# 执行初始化SQL脚本
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uroot -p zabbix_server
配置Zabbix数据库连接信息
Zabbix 的配置文件默认存储在 /etc/zabbix 目录,其中 zabbix_server.conf 为 zabbix-server 的配置文件,zabbix_agentd.conf 为 zabbix-agent 的配置文件。
编辑 /etc/zabbix/zabbix_server.conf,配置 Zabbix 数据库连接信息:
# 编辑 /etc/zabbix/zabbix_server.conf
vi /etc/zabbix/zabbix_server.conf
# 修改以下配置项
DBHost=localhost
DBName=zabbix_server
DBUser=root
DBPassword=Zabbix01
启动zabbix-server服务
配置完数据库信息后,我们可以暂时跳过 PHP 和 Nginx 的配置过程,尝试启动 zabbix-server 服务,先确保 zabbix-server 服务是可正常启动的。
# 启动zabbix-server服务
systemctl restart zabbix-server
这时你可能会发现 zabbix-server 服务启动失败了,如果你的 zabbix-server 服务可正常启动,那么你可以跳过这部分直接看 Nginx 的配置环节了,或者跟我们一起看一下控制台给出的错误提示信息:
我们根据提示通过journalctl -xe命令查看一下详细信息,具体内容如下图:
我们发现报错原因是不能正常加载 libmysqlclient.so.18 库文件,对于类似的错误可能大家都遇到过,我们也不再深入探讨其原因和解决方案,在这里只给出一种小菜运维的「简单粗暴」处理方法,重新安装mysql-libs。如果大家尝试无效的话还请大家自行百度一下解决方案。
小菜运维的解决方案:
# libmysqlclient.so.18: cannot open shared object file: No such file or directory
yum -y reinstall mysql-libs
重新安装完成 mysql-libs 之后,我们再次尝试启动 zabbix-server 服务没有报错,然后查看一下 zabbix-server 服务运行状态发现服务已经启动成功。
# 启动zabbix-server服务
systemctl start zabbix-server
# 查看zabbix-server服务运行状态
systemctl status zabbix-server
配置Nginx的location
我们知道 zabbix 是 PHP 开发的,PHP7.0 已经内置了 PHP-FPM,我们要做的就是配置 Nginx 使其支持 php-fpm,这里我们不再介绍如何安装 Nginx 以及配置 php-fpm,我们只给出经测试可用的 Nginx server 配置文件以及相关异常错误的排除过程。
找到你的 Nginx 的配置文件,参照如下的 server 配置做出相应修改。需要注意的是 Zabbix 的WEB页面文件默认保存在 /usr/share/zabbix 目录,所以这里我们 将server的root指向了 /usr/share/zabbix 目录 。
# 重点说三遍!!!此处只给出重点配置项的参考,其他常规配置项自行补充
# 重点说三遍!!!此处只给出重点配置项的参考,其他常规配置项自行补充
# 重点说三遍!!!此处只给出重点配置项的参考,其他常规配置项自行补充
server {
# 其他常规配置项自行补充
root /usr/share/zabbix;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ [^/]\.php(/|$) {
#fastcgi_pass remote_php_ip:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
}
执行命令重新加载Nginx的配置文件使修改生效:
# 重新加载Nginx配置文件
nginx -s reload
接下来,我们尝试通过浏览器访问一下 http://server_ip_or_name/zabbix,看看是否能够顺利加载 zabbix的欢迎页面?很扫兴,服务端返回了 500 错误码。
很明显服务端处理出错了,面对这种情况,我们应该如何排查错误呢?错误可能是 Nginx 的配置错误,可能是 php-fpm 的处理错误,也可能是 zabbix 的配置错误,首先我们需要先定位出错误出现在哪里。
小菜运维排查错误的第一反应就是要查看错误日志,Nginx 是一个WEB容器,其日志只记录了请求访问日志和 Nginx 本身的错误日志,不会记录 PHP 的运行错误信息,Nginx 把对 PHP 的请求转发给 php-fpm fastcgi 进程来处理,默认的 php-fpm 只会输出 php-fpm 的错误信息,在 php-fpm 的错误日志里也看不到 PHP 的错误日志,
原因是 php-fpm 的配置文件 php-fpm.conf 中默认是关闭了 worker 进程的错误输出,直接把他们重定向到 /dev/null,当然这个可以通过修改 php-fpm.conf 来解决。那么 Zabbix 服务本身有没有日志输出呢?答案是肯定的,默认情况下 Zabbix 的日志是保存在文件 /var/log/zabbix/zabbix_server.log 中,这个配置项我们可以在上面提到的 zabbix-server 默认配置文件 /etc/zabbix/zabbix_server.conf 中进行查看和编辑。
我们查看日志文件 /var/log/zabbix/zabbix_server.log 如下:
在 zabbix-server 日志中我们发现有一条错误信息 [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2),也就是说 zabbix-server 不能通过 socket 文件 '/var/lib/mysql/mysql.sock' 连接 MySQL 数据库,那么 '/var/lib/mysql/mysql.sock' 是哪里来的呢?带着这个疑惑,小菜运维又一次打开了 zabbix-server 的配置文件 /etc/zabbix/zabbix_server.conf,在 zabbix-server.conf 中我们找到了被注释掉的配置项 DBSocket,而且默认值为空。
很显然,配置项 DBSocket 应该配置 MySQL 数据库的 socket 文件,难道我们服务器上 MySQL 的 socket 就是配置的 '/var/lib/mysql/mysql.sock'?带着疑问我们先查找了一下文件 /var/lib/mysql/mysql.sock 并发现该文件并不存在,然后我们又打开MySQL的配置文件 /etc/my.cnf,发现我们安装的 MySQL 默认的 socket 配置项配置的是 /tmp/mysql.sock
我们编辑配置文件 zabbix-server.conf,将配置项 DBSocket 设置为 /tmp/mysql.sock
然后重新启动zabbix-server服务并再次尝试从浏览器访问 http://server_ip_or_name/zabbix,依然很扫兴,服务端仍然返回了 500 错误码!
# 重新启动zabbix-server服务
systemctl restart zabbix-server
同样的还是查看 zabbix-server 服务日志文件 /var/log/zabbix/zabbix_server.log
这次从日志 zabbix_server.log 中我们看到,zabbix-server 服务正常启动,没有再报错了! zabbix-server 服务没有报错,而服务端也正常做出了响应,只不过响应码是 500 错误码,说明 Nginx 配置没有问题,问题应该是出在了 php-fpm 。上面已经提到过了,php-fpm 默认是不输出错误日志到日志文件的,所以我们需要先配置 php-fpm 日志输出到日志文件,在这里我们就不再介绍如何配置了,直接给出 php-fpm 的错误日志信息和解决方案。
在 php-fpm 错误日志中我们看到错误提示信息 Failed opening required '/etc/zabbix/web/maintenance.inc.php',很明显这是一个文件权限问题导致的错误,因为我们 Nginx 的启动用户组为 www:www,而 /etc/zabbix/web 目录所属用户组为 root:root,导致 Nginx 无法读取文件 '/etc/zabbix/web/maintenance.inc.php',我们尝试修改 /etc/zabbix/web 目录的用户群组为 www:www,然后再次重启 zabbix-server 服务:
# 指定/etc/zabbix/web拥有者为www:www
chown -R www:www /etc/zabbix/web
# 重新启动zabbix-server服务
systemctl restart zabbix-server
我们又一次尝试从浏览器访问 http://server_ip_or_name/zabbix,这一次终于顺利进入 zabbix 欢迎页面了!
点击页面 「Next step」按钮,进入到 Check of pre-requisites 页面:
在 Check of pre-requisites 页面我们看到 PHP 检查项 max_input_time 的当前值60比 zabbix 的所需值300小,检查没有通过,所以我们需要先编辑 php.ini 文件,设定相关 PHP 配置项满足要求,其中 zabbix 必须的配置项有 max_execution_time 、max_input_time 、date.timezone 等,大家可以根据 Check of pre-requisites 页面的提示信息进行配置:
# 小菜运维的PHP配置文件为/usr/local/php/etc/php.ini
cd /usr/local/php/etc
# 编辑PHP配置文件php.ini
vi php.ini
# 开始修改PHP配置项
# max_input_time = 300
# PHP配置项修改完成
# 重启php-fpm服务
systemctl restart php-fpm
强制刷新 Check of pre-requisites 页面,我们看到所有 PHP 配置项检查都已通过,继续点击页面 「Next step」 按钮,进入到 Configure DB connection页面:
依次填写数据库各配置项,然后继续点击页面 「Next step」 按钮,进入到 Zabbix server details 页面,在 Zabbix server details 页面我们需要填写 zabbix-server 实例的 Host 、Port 、Name,这些主要是用来和 zabbix-agent 做通信时使用的,这里我们只是简单的配置了 zabbix-server 实例的名称为 zabbix server,其他均取了默认值,如果以后有特殊需要的话可以到相应配置文件下进行修改:
继续点击 Zabbix server details 页面 「Next step」 按钮,进入到 Pre-installation summary 确认页面:
继续点击 Pre-installation summary 页面 「Next step」按钮,进入到 Install 安装完成页面:
记住上图中标注的文件 /etc/zabbix/web/zabbix.conf.php,有兴趣的可以打开看看该文件内容。
继续点击 Install 页面 「Finish」 按钮,我们看到 zabbix 的登录页面了,默认登录帐号为 Admin,密码为 zabbix,输入帐号密码点击 「Sign in」 按钮完成登录就可进入 zabbix-server 主页了:
到此,祝贺你,我们已经成功完成 zabbix-server 的安装了!
Zabbix中文乱码处理
zabbix 默认已经内置中文支持,可以通过系统配置选项切换系统语言类型,但是由于服务器字体缺失导致zabbix 图表的中文会存在乱码现象。
- 切换中文语言
我们在主页,点击右上角用户图标进入用户个人资料设置页,在 Language 配置项选择 Chinese(zh_CN),然后点击 「Update」 按钮即可自动完成语言切换;
- 修复中文乱码
zabbix 虽然本身已经支持中文,但是在图表的标注上还存在中文乱码,这是由于 zabbix 的图表字体默认配置的是 graphfont,而在 zabbix 字体目录下却不存在相应字体造成的;
要解决这个问题,我们首先要到本地 windows 操作系统目录 C:\Windows\Fonts 下找一款你喜欢的中文字体,将其ttf字体文件上传到服务器目录 /usr/share/zabbix/fonts 下,然后在服务器端编辑文件 /usr/share/zabbix/include/defines.inc.php,将配置项 ZBX_GRAPH_FONT_NAME 的值由 graphfont 改为 simfang (这里小菜运维选择的字体是 「仿宋 常规」,对应的字体文件为 simfang.ttf);
# 小菜运维的PHP配置文件为/usr/local/php/etc/php.ini
vi /usr/share/zabbix/include/defines.inc.php
# 开始修改ZBX_GRAPH_FONT_NAME
# define('ZBX_GRAPH_FONT_NAME', 'simfang'); // font file name
# ZBX_GRAPH_FONT_NAME修改完成
再次强制刷新页面,我们发现图表的中文乱码现象已经不存在了。
踩坑经历
1. libmysqlclient.so.18: cannot open shared object file: No such file or directory
问题表现:systemctl start zabbix-server 启动失败
问题排查:journalctl -xe
解决方法:yum -y reinstall mysql-libs
2. Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
问题表现:访问 http://server_ip_or_name/zabbix 返回500错误码
问题排查:依次排查 zabbix_server.log、php-fpm 日志
解决办法:配置 zabbix_server.conf的DBSocket 和 MySQL 一致
3. Failed opening required '/etc/zabbix/web/maintenance.inc.php'
问题表现:访问 http://server_ip_or_name/zabbix 返回500错误码
问题排查:依次排查 zabbix_server.log、php-fpm 日志
解决办法:将目录 /etc/zabbix/web 指定拥有者为 Nginx 用户 chown -R www:www /etc/zabbix/web
4. session.save_path is correct (/var/lib/php/session) in Unknown on line
问题表现:zabbix 在某步点击「Next step」无法进入下一页面
问题排查:依次排查 zabbix_server.log、php-fpm 日志,多是因权限不足导致
解决办法:配置 PHP 的 session 存储目录如 session.save_path = /var/lib/php/session,并授权 Nginx 用户拥有该目录 chown -R www:www /var/lib/php/session
zabbix服务管理
# zabbix-server
systemctl status zabbix-server
systemctl start zabbix-server
systemctl stop zabbix-server
systemctl restart zabbix-server
# zabbix-agent
systemctl status zabbix-agent
systemctl start zabbix-agent
systemctl stop zabbix-agent
systemctl restart zabbix-agent
# zabbix默认配置文件目录
cd /etc/zabbix
# zabbix默认日志存储目录
cd /var/log/zabbix