前言
小菜运维仅仅只是一位菜鸟运维
废话不多说,小菜运维最近计划在公司内网部署一套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修改完成
再次强制刷新页面,我们发现图表的中文乱码现象已经不存在了。
踩坑经历
- libmysqlclient.so.18: cannot open shared object file: No such file or directory
问题表现:systemctl start zabbix-server启动失败
问题排查:journalctl -xe
解决方法:yum -y reinstall mysql-libs - 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一致 - 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 - 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