centos7.9上yum安装zabbix5.0
centos7.9上yum安装zabbix5.0
zabbix5.0发布时间:2020年5月
zabbix5.0 需要php7.2或以上,不支持php8.0
从zabbix6.0开始,不提供rpm包了,只能源码编译
安装zabbix5.0,yum安装
注意:因为是yum安装,所有的软件版本在以后可能会比当前版本更新,一定要注意有版本号的地方要替换为新的版本号!!!
1、关闭selinux和防火墙
set enforce 0 systemctl stop firewalld systemctl disable firewalld
2、安装zabbix的yum源
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum install -y epel-release yum clean all
3、安装zabbix-server和zabbix-agent和redhat软件集合(包含rh-php72)
yum install -y zabbix-server-mysql zabbix-agent zabbix-sql-scripts zabbix-selinux-policy zabbix-java-gateway zabbix-get curl curl-devel centos-release-scl centos-release-scl-rh
4、将[zabbix-frontend]的enabled设置为1
sed -i.bak '/^\[zabbix-frontend\]/{n;n;n;s/enabled=0/enabled=1/}' /etc/yum.repos.d/zabbix.repo
5、安装zabbix前端
yum install -y zabbix-web-mysql-scl zabbix-apache-conf-scl
[root@test_mysql_6 ~]# rpm -qa|grep zabbix
zabbix-web-deps-scl-5.0.35-1.el7.noarch 方便zabbix-web包从redhat软件集合安装php依赖
zabbix-agent-5.0.35-1.el7.x86_64 zabbix-agent,用C语言编写
zabbix-web-5.0.35-1.el7.noarch zabbix web前端安装包,由于centos7上缺少官方的php7.2+包,所以zabbix-web包中删除了直接依赖的php和它的扩展模块,建议启用redhat软件集合库安装zabbix-web-mysql-scl包
zabbix-release-5.0-1.el7.noarch
zabbix-web-mysql-scl-5.0.35-1.el7.noarch zabbix前端支持mysql软件包scl版本
zabbix-apache-conf-scl-5.0.35-1.el7.noarch httpd的zabbix web前端配置
zabbix-server-mysql-5.0.35-1.el7.x86_64 zabbix-server和mysql数据库的支持
zabbix-java-gateway-5.0.35-1.el7.x86_64 jmx监控java的网关
zabbix-get-5.0.35-1.el7.x86_64 zabbix_get工具
6、安装数据库,然后建库建表,zabbix5.0把之前的三个sql文件合并为一个create.sql.gz
注意:zabbix的字符集只能是 character set utf8(utf8就是utf8mb3),排序规则只能是collate utf8_bin!!!!!!!
zabbix-server-mysql-5.0.35的版本随着版本更新,yum安装的时候可能会比当前版本更新!!!
yum install -y mariadb-server systemctl start mariadb #------------------------------------ /usr/local/mysql/bin/mysql -uroot -p'123456' -S /data/mysql/mysql3306/tmp/mysql.sock -e "create database zabbix character set utf8 collate utf8_bin" /usr/local/mysql/bin/mysql -uroot -p'123456' -S /data/mysql/mysql3306/tmp/mysql.sock -e "create user zabbix@'%' identified with mysql_native_password by 'zabbix'" /usr/local/mysql/bin/mysql -uroot -p'123456' -S /data/mysql/mysql3306/tmp/mysql.sock -e "grant all privileges on zabbix.* to zabbix@'%'" /usr/local/mysql/bin/mysql -uroot -p'123456' -S /data/mysql/mysql3306/tmp/mysql.sock -e "set global log_bin_trust_function_creators = 1" zcat /usr/share/doc/zabbix-server-mysql-5.0.35/create.sql.gz | /usr/local/mysql/bin/mysql -uzabbix -pzabbix zabbix -S /data/mysql/mysql3306/tmp/mysql.sock
7、配置zabbix_server.conf里面的数据库信息
DBHost=127.0.0.1
DBPassword=zabbix
DBPort=3306
sed -i.bak 's/# DBHost=localhost/DBHost=127.0.0.1/' /etc/zabbix/zabbix_server.conf sed -i.bak 's/# DBPassword=/DBPassword=zabbix/' /etc/zabbix/zabbix_server.conf sed -i.bak 's/# DBPort=/DBPort=3306/' /etc/zabbix/zabbix_server.conf
8、配置zabbix的apache虚拟站点
cat > /etc/httpd/conf.d/zabbix.conf <<EOF # # Zabbix monitoring system php web frontend # Alias /zabbix /usr/share/zabbix ProxyTimeout 300 <VirtualHost *:9672> ServerName localhost <Directory "/usr/share/zabbix"> Options FollowSymLinks AllowOverride None Require all granted <IfModule dir_module> DirectoryIndex index.php </IfModule> <IfModule mod_php7.c> 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 max_input_vars 10000 php_value always_populate_raw_post_data -1 php_value date.timezone Asia/Shanghai </IfModule> <FilesMatch \.(php|phar)$> SetHandler "proxy:unix:/var/opt/rh/rh-php72/run/php-fpm/zabbix.sock|fcgi://localhost" # SetHandler "proxy:unix:/var/opt/rh/rh-php73/run/php-fpm/zabbix.sock|fcgi://localhost" </FilesMatch> </Directory> <Directory "/usr/share/zabbix/conf"> Require all denied </Directory> <Directory "/usr/share/zabbix/app"> Require all denied </Directory> <Directory "/usr/share/zabbix/include"> Require all denied </Directory> <Directory "/usr/share/zabbix/local"> Require all denied </Directory> <Directory "/usr/share/zabbix/vendor"> Require all denied </Directory> </VirtualHost> EOF
修改/etc/httpd/conf/httpd.conf 入口文件,||是或的意思,没有9672就改为监听9672
grep 9672 /etc/httpd/conf/httpd.conf || sed -i '/Listen 80/a\Listen 9672' /etc/httpd/conf/httpd.conf sed -i '/AddType application\/x-gzip \.gz \.tgz/a\AddType application/x-httpd-php .php' /etc/httpd/conf/httpd.conf cat >> /etc/httpd/conf/httpd.conf <<EOF LoadModule headers_module modules/mod_headers.so LoadModule deflate_module modules/mod_deflate.so <IfModule mod_deflate.c> # 启用压缩 SetOutputFilter DEFLATE # //压缩比率,1-9之间不建议设置太高,虽然有很高的压缩率,但是占用更多的 CPU 资源 DeflateCompressionLevel 6 # 压缩的文件类型,包括php文件,text文本文件,js文件 #AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript AddOutputFilterByType DEFLATE text/* AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp # 排除不需要压缩的文件类型,exe,tgz,gz , pdf,avi,mp3 等 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary </IfModule> EOF
修改权限
chmod -R 755 /etc/zabbix/web/ chmod -R 755 /usr/share/zabbix/include/ chown -R apache:apache /etc/zabbix/web/
测试一下配置文件语法问题,出现Syntax OK表示没问题
/usr/sbin/apachectl -t
9、配置php
cat > /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf <<EOF [zabbix] user = apache group = apache listen = /var/opt/rh/rh-php72/run/php-fpm/zabbix.sock listen.acl_users = apache listen.allowed_clients = 127.0.0.1 pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.max_requests = 200 php_value[session.save_handler] = files php_value[session.save_path] = /var/opt/rh/rh-php72/lib/php/session/ php_value[max_execution_time] = 300 php_value[memory_limit] = 128M php_value[post_max_size] = 32M php_value[upload_max_filesize] = 2M php_value[max_input_time] = 300 php_value[max_input_vars] = 10000 php_value[date.timezone] = Asia/Shanghai php_value[expose_php] = Off php_value[display_errors] = on EOF
10、配置zabbix服务器上的zabbix agent
Server=127.0.0.1 #被动模式(默认),zabbix-server的地址
ServerActive=127.0.0.1 #主动模式(默认),zabbix-server的地址
Hostname=Zabbix server #只适用于主动模式,被动模式无须设置,这里主机名不一定是主机的主机名,也可以是ip或其他标识性字符串,只需保证这个配置在zabbix-server监控的主机内全局唯一即可
cat > /etc/zabbix/zabbix_agentd.conf <<EOF Server=127.0.0.1 ServerActive=127.0.0.1 Hostname=Zabbix server EnableRemoteCommands=1 PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log # ListenPort=10050 # HostnameItem=system.hostname # Include=/etc/zabbix_agentd.userparams.conf # Include=/etc/zabbix_agentd.conf.d/ EOF
优化zabbix-server
sed -i.bak 's/# CacheSize=8M/CacheSize=1G/' /etc/zabbix/zabbix_server.conf sed -i.bak 's/# HistoryCacheSize=16M/HistoryCacheSize=1G/' /etc/zabbix/zabbix_server.conf sed -i.bak 's/# TrendCacheSize=4M/TrendCacheSize=1G/' /etc/zabbix/zabbix_server.conf
11、重启Zabbix server和agent等相关进程,并为它们设置开机自启
systemctl restart httpd.service zabbix-server.service zabbix-agent.service rh-php72-php-fpm.service
systemctl enable httpd.service zabbix-server.service zabbix-agent.service rh-php72-php-fpm.service
12、 打开zabbix的web界面设置zabbix
配置完毕后配置会保存在/etc/zabbix/web/zabbix.conf.php
地址:http://192.168.31.9:9672/zabbix
默认用户名/密码: Admin/zabbix
数据库用户名/密码:zabbix/zabbix
zabbix名称:ZBXSERVER
13、禁用guest用户,修改Admin的密码,修改界面为中文
administration-》user groups-》点击guests这个组-》点击disable
administration-》users-》点击Admin-》点击change password-》输入两次密码-》update
用户名/密码: Admin/1qaz2wsx
User settings-》Language-》Chinese(zh-CN)-》update (如果设置失败,看下面第15步)
Administration-》General-》Other-》Refresh unsupported items-》1m (改为1分钟,zabbix5.2移除了这个选项)
第一次获得监控项的最新监控值需要1m/60s,默认情况,服务器读取变化后的配置文件而获取并执行新的监控项频率,后续需要等待30s获取新的监控值
重新获取/刷新不支持监控项的频率,1m/60s
因为zabbix-server有缓存,从数据库读取出来之后会缓存在缓存里,一般缓存一分钟,减轻数据库压力,所以有时候,可能需要2分钟最新值latest value才有值
ll /usr/lib/zabbix/
total 0
drwxr-xr-x 2 root root 6 May 29 18:38 alertscripts
drwxr-xr-x 2 root root 6 May 29 18:38 externalscripts
14、配置web界面为中文和图表文字为中文
安装中文语言环境/中文语言包
yum install -y langpacks-zh_CN* glibc-common locale -a|grep zh_CN zh_CN zh_CN.gb18030 zh_CN.gb2312 zh_CN.gbk zh_CN.utf8
User settings-》Language-》Chinese(zh-CN)-》update
zabbix5.0中字体关系
/usr/share/zabbix/assets/fonts/graphfont.ttf -> /etc/alternatives/zabbix-web-font -> /usr/share/fonts/dejavu/DejaVuSans.ttf
(1)在Windows的字体文件夹C:\Windows\Fonts\里,复制方正姚体字体文件出来,复制出来,然后粘贴在桌面,把文件TTF后缀改为ttf,FZYTK.ttf
C:\Windows\Fonts
(2)把FZYTK.ttf文件传上去服务器
cd /usr/share/zabbix/assets/fonts/ ll /usr/share/zabbix/assets/fonts/ FZYTK.ttf graphfont.ttf
(3)修改权限
chown zabbix.zabbix -R /usr/share/zabbix/assets/fonts/
(4)修改web界面的php文件,把下面两行代码里的graphfont改为FZYTK
sed -i 's#graphfont#FZYTK#g' /usr/share/zabbix/include/defines.inc.php
(5)修改完这个配置文件后,是立即生效的,把web页面刷新一下即可
15、对被监控主机添加监控模板
zabbix的模板是以(主机群组/监控组)为单位,所以选择模板的时候需要先选择主机群组,再选择主机群组下所拥有的模板即可
一个主机一定要属于一个(主机群组/监控组),这个(主机群组/监控组)可以自己随便新建一个,也可以选择zabbix自带的(主机群组/监控组),也可以同时选择多个(主机群组/监控组),没有硬性要求,当然实际生产环境还是会对主机进行分组,会新建自定义主机群组
zabbix概念是“主机host”在“组Host groups”中,“模板Template”可以套在主机也可以套上组上,如果套上组中,那么所有“主机”都会使用,如果套上“主机”上只有某台主机生效。
添加Linux监控模板
(1)链接新模板
(2)选择主机群组
(3)选择templates/operating systems
(4)选择template os Linux by zabbix agent
(5)点击更新
(6)template os Linux by zabbix agent会添加很多Linux子模块模板,用圆括号括住
(7)过一会会有添加的新模板的数据
f
zabbix5.0优化
注意:在zabbix的部署阶段就要做好数据库的表分区,按天分区!!!!!!!!
history表和trend表 改造为分区表
zabbix-server采集到的监控数据会保存在history表和trends 表中
history表保存每个监控值的历史数据
history的5个表
history – numeric (float) 对应item中的 numeric (float)类型
history_uint – numeric (unsigned integers) 对应item中的numeric (unsigned integers) 类型
history_str – character (up to 255 bytes) 字符串类型数据 对应item中的 character类型
history_log – log 日志数据,一般用于日志监控,对应item中的 log类型
history_text – text 文本类型数据,内容较长 对应item中的 text 类型
trends 表保存趋势数据,每个监控项内最小,最大,平均值
trends – numeric (float) numeric (float)类型趋势数据,对应history表
trends_uint – numeric (unsigned integers) numeric 类型趋势数据,对应history_uint 表
history表和trends 表都没有外键,所以才可以使用分区表对这两个类型的表进行分区,其他表基本都有外键
housekeeper通过delete命令来删除数据,在数据量很大情况下,效率很低
zabbix_partition.sh 脚本会对history相关表按天进行分区,对trend相关表按月进行分区
SQL="/tmp/partition.sql":执行完脚本,会生成一个sql文件,该参数用来指定文件名
HISTORY_KEEP_DAYS=30 :历史数据保留时间,默认为30,单位是天
TREND_KEEP_MONTHS=12: 趋势数据保留时间,默认为12,单位是月
ZABBIX_VERSION=4:指定zabbix-server版本,如果要对zabbix2.x表进行分区,需要把参数设置为2
/tmp/partition.sql 文件会执行以下操作
(1)将history和trend两类表修改为分区表,以clock字段作为分区字段,clock字段是int类型字段,保存时间戳
(2)创建存储过程(drop_old_partitions,create_next_monthly_partitions,create_next_partitions),用于添加和删除分区
(3)创建定时器,定期调用存储过程,event_scheduler定时( EVERY 1 DAY)每天去建新分区和删除旧分区
(4)设置set @@global.event_scheduler = on;
在my.cnf里设置event_scheduler=ON,mysql8.0默认将event_scheduler=ON,所以不用设置
单击Administration-》General-》Housekeeping,禁用history和trend两类表的自动清理功能
注意:如果要打开history和trend两类表的自动清理功能,使用pgsql的TimescaleDB,TimescaleDB自带压缩功能和时序数据库,然后勾选
history
enable internal housekeeping 和 override item history period 勾选
trends
enable internal housekeeping 和 override item trend period 勾选
执行
[root@test_mysql_6 ~]# sh zabbix_partition.sh Bingo! Do not forget to set event_scheduler=on in my.cnf and disable Housekeeping [root@test_mysql_6 tmp]# ll -rw-r--r-- 1 root root 31805 Jul 5 21:35 partition.sql
把sql文件导入mysql
/usr/local/mysql/bin/mysql -uroot -p -S /data/mysql/mysql3306/tmp/mysql.sock zabbix </tmp/partition.sql
zabbix_partition.sh
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cat zabbix_partition.sh #!/bin/bash SQL="/tmp/partition.sql" HISTORY_KEEP_DAYS=120 #需要改 TREND_KEEP_MONTHS=12 #需要改 ZABBIX_VERSION=5 #需要改 cur_year=`date +"%Y"` next_year=$cur_year cur_month=`date +"%m"|sed 's/^0*//'` if [ $cur_month -eq 12 ]; then next_year=$((cur_year+1)) cur_month=1 fi DAILY="history history_log history_str history_text history_uint" MONTHLY="trends trends_uint" echo "Use zabbix;" > $SQL echo -en "\n" >>$SQL if [ $ZABBIX_VERSION -eq 2 ]; then cat >>$SQL <<_EOF_ ALTER TABLE history_log DROP KEY history_log_2; ALTER TABLE history_log ADD KEY history_log_2(itemid, id); ALTER TABLE history_log DROP PRIMARY KEY ; ALTER TABLE history_log ADD KEY history_logid (id); ALTER TABLE history_text DROP KEY history_text_2; ALTER TABLE history_text ADD KEY history_text_2 (itemid, clock); ALTER TABLE history_text DROP PRIMARY KEY ; ALTER TABLE history_text ADD KEY history_textid (id); _EOF_ fi echo -en "\n" >>$SQL for i in $MONTHLY; do echo "ALTER TABLE $i PARTITION BY RANGE( clock ) (" >>$SQL for y in `seq $cur_year $next_year`; do next_month=12 [ $y -eq $next_year ] && next_month=$((cur_month+1)) for m in `seq 1 $next_month`; do [ $m -lt 10 ] && m="0$m" ms=`date +"%Y-%m-01" -d "$m/01/$y +1 month"` pname="p${y}${m}" echo -n "PARTITION $pname VALUES LESS THAN (UNIX_TIMESTAMP(\"$ms 00:00:00\"))" >>$SQL [ $m -ne $next_month -o $y -ne $next_year ] && echo -n "," >>$SQL echo -ne "\n" >>$SQL done done echo ");" >>$SQL echo -en "\n" >>$SQL done for i in $DAILY; do echo "ALTER TABLE $i PARTITION BY RANGE( clock ) (" >>$SQL for d in `seq -$HISTORY_KEEP_DAYS 2`; do ds=`date +"%Y-%m-%d" -d "$d day +1 day"` pname=`date +"%Y%m%d" -d "$d day"` echo -n "PARTITION p$pname VALUES LESS THAN (UNIX_TIMESTAMP(\"$ds 00:00:00\"))" >>$SQL [ $d -ne 2 ] && echo -n "," >>$SQL echo -ne "\n" >>$SQL done echo ");" >>$SQL echo -en "\n" >>$SQL done ############################################################### echo -en "\n" >>$SQL cat >>$SQL <<_EOF_ DELIMITER // DROP PROCEDURE IF EXISTS zabbix.create_zabbix_partitions; // CREATE PROCEDURE zabbix.create_zabbix_partitions () BEGIN _EOF_ for i in $DAILY; do echo " CALL zabbix.create_next_partitions(\"zabbix\",\"$i\");" >>$SQL echo " CALL zabbix.drop_old_partitions(\"zabbix\",\"$i\");" >>$SQL done for i in $MONTHLY; do echo " CALL zabbix.create_next_monthly_partitions(\"zabbix\",\"$i\");" >>$SQL echo " CALL zabbix.drop_old_monthly_partitions(\"zabbix\",\"$i\");" >>$SQL done echo -en "\n" >>$SQL cat >>$SQL <<_EOF_ END // DROP PROCEDURE IF EXISTS zabbix.create_next_partitions; // CREATE PROCEDURE zabbix.create_next_partitions (SCHEMANAME varchar(64), TABLENAME varchar(64)) BEGIN DECLARE NEXTCLOCK timestamp; DECLARE PARTITIONNAME varchar(16); DECLARE CLOCK int; SET @totaldays = 7; SET @i = 1; createloop: LOOP SET NEXTCLOCK = DATE_ADD(NOW(),INTERVAL @i DAY); SET PARTITIONNAME = DATE_FORMAT( NEXTCLOCK, 'p%Y%m%d' ); SET CLOCK = UNIX_TIMESTAMP(DATE_FORMAT(DATE_ADD( NEXTCLOCK ,INTERVAL 1 DAY),'%Y-%m-%d 00:00:00')); CALL zabbix.create_partition( SCHEMANAME, TABLENAME, PARTITIONNAME, CLOCK ); SET @i=@i+1; IF @i > @totaldays THEN LEAVE createloop; END IF; END LOOP; END // DROP PROCEDURE IF EXISTS zabbix.drop_old_partitions; // CREATE PROCEDURE zabbix.drop_old_partitions (SCHEMANAME varchar(64), TABLENAME varchar(64)) BEGIN DECLARE OLDCLOCK timestamp; DECLARE PARTITIONNAME varchar(16); DECLARE CLOCK int; SET @mindays = $HISTORY_KEEP_DAYS; SET @maxdays = @mindays+4; SET @i = @maxdays; droploop: LOOP SET OLDCLOCK = DATE_SUB(NOW(),INTERVAL @i DAY); SET PARTITIONNAME = DATE_FORMAT( OLDCLOCK, 'p%Y%m%d' ); CALL zabbix.drop_partition( SCHEMANAME, TABLENAME, PARTITIONNAME ); SET @i=@i-1; IF @i <= @mindays THEN LEAVE droploop; END IF; END LOOP; END // DROP PROCEDURE IF EXISTS zabbix.create_next_monthly_partitions; // CREATE PROCEDURE zabbix.create_next_monthly_partitions (SCHEMANAME varchar(64), TABLENAME varchar(64)) BEGIN DECLARE NEXTCLOCK timestamp; DECLARE PARTITIONNAME varchar(16); DECLARE CLOCK int; SET @totalmonths = 3; SET @i = 1; createloop: LOOP SET NEXTCLOCK = DATE_ADD(NOW(),INTERVAL @i MONTH); SET PARTITIONNAME = DATE_FORMAT( NEXTCLOCK, 'p%Y%m' ); SET CLOCK = UNIX_TIMESTAMP(DATE_FORMAT(DATE_ADD( NEXTCLOCK ,INTERVAL 1 MONTH),'%Y-%m-01 00:00:00')); CALL zabbix.create_partition( SCHEMANAME, TABLENAME, PARTITIONNAME, CLOCK ); SET @i=@i+1; IF @i > @totalmonths THEN LEAVE createloop; END IF; END LOOP; END // DROP PROCEDURE IF EXISTS zabbix.drop_old_monthly_partitions; // CREATE PROCEDURE zabbix.drop_old_monthly_partitions (SCHEMANAME varchar(64), TABLENAME varchar(64)) BEGIN DECLARE OLDCLOCK timestamp; DECLARE PARTITIONNAME varchar(16); DECLARE CLOCK int; SET @minmonths = $TREND_KEEP_MONTHS; SET @maxmonths = @minmonths+24; SET @i = @maxmonths; droploop: LOOP SET OLDCLOCK = DATE_SUB(NOW(),INTERVAL @i MONTH); SET PARTITIONNAME = DATE_FORMAT( OLDCLOCK, 'p%Y%m' ); CALL zabbix.drop_partition( SCHEMANAME, TABLENAME, PARTITIONNAME ); SET @i=@i-1; IF @i <= @minmonths THEN LEAVE droploop; END IF; END LOOP; END // DROP PROCEDURE IF EXISTS zabbix.create_partition; // CREATE PROCEDURE zabbix.create_partition (SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64), CLOCK int) BEGIN DECLARE RETROWS int; SELECT COUNT(1) INTO RETROWS FROM information_schema.partitions WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_name = PARTITIONNAME; IF RETROWS = 0 THEN SELECT CONCAT( "create_partition(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" ) AS msg; SET @sql = CONCAT( 'ALTER TABLE ', SCHEMANAME, '.', TABLENAME, ' ADD PARTITION (PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', CLOCK, '));' ); PREPARE STMT FROM @sql; EXECUTE STMT; DEALLOCATE PREPARE STMT; END IF; END // DROP PROCEDURE IF EXISTS zabbix.drop_partition; // CREATE PROCEDURE zabbix.drop_partition (SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64)) BEGIN DECLARE RETROWS int; SELECT COUNT(1) INTO RETROWS FROM information_schema.partitions WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_name = PARTITIONNAME; IF RETROWS = 1 THEN SELECT CONCAT( "drop_partition(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ")" ) AS msg; SET @sql = CONCAT( 'ALTER TABLE ', SCHEMANAME, '.', TABLENAME, ' DROP PARTITION ', PARTITIONNAME, ';' ); PREPARE STMT FROM @sql; EXECUTE STMT; DEALLOCATE PREPARE STMT; END IF; END // DELIMITER ; SET @@global.event_scheduler = on; DROP EVENT IF EXISTS zabbix.maintain_partition; CREATE EVENT zabbix.maintain_partition ON SCHEDULE EVERY 1 DAY STARTS '2019-01-01 2:00:00' COMMENT 'maintain zabbix partition tables every day' DO CALL zabbix.create_zabbix_partitions(); _EOF_ echo "Bingo! Do not forget to set event_scheduler=on in my.cnf and disable Housekeeping"
生成出来的分区sql语句(注意:mysql定时器event是从2019年1月1日 开始每天凌晨2点执行 )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@test_zabbixagent_10 tmp]# cat partition.sql Use zabbix; ALTER TABLE trends PARTITION BY RANGE( clock ) ( PARTITION p202301 VALUES LESS THAN (UNIX_TIMESTAMP("2023-02-01 00:00:00")), PARTITION p202302 VALUES LESS THAN (UNIX_TIMESTAMP("2023-03-01 00:00:00")), PARTITION p202303 VALUES LESS THAN (UNIX_TIMESTAMP("2023-04-01 00:00:00")), PARTITION p202304 VALUES LESS THAN (UNIX_TIMESTAMP("2023-05-01 00:00:00")), PARTITION p202305 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-01 00:00:00")), PARTITION p202306 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-01 00:00:00")), PARTITION p202307 VALUES LESS THAN (UNIX_TIMESTAMP("2023-08-01 00:00:00")), PARTITION p202308 VALUES LESS THAN (UNIX_TIMESTAMP("2023-09-01 00:00:00")) ); ALTER TABLE trends_uint PARTITION BY RANGE( clock ) ( PARTITION p202301 VALUES LESS THAN (UNIX_TIMESTAMP("2023-02-01 00:00:00")), PARTITION p202302 VALUES LESS THAN (UNIX_TIMESTAMP("2023-03-01 00:00:00")), PARTITION p202303 VALUES LESS THAN (UNIX_TIMESTAMP("2023-04-01 00:00:00")), PARTITION p202304 VALUES LESS THAN (UNIX_TIMESTAMP("2023-05-01 00:00:00")), PARTITION p202305 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-01 00:00:00")), PARTITION p202306 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-01 00:00:00")), PARTITION p202307 VALUES LESS THAN (UNIX_TIMESTAMP("2023-08-01 00:00:00")), PARTITION p202308 VALUES LESS THAN (UNIX_TIMESTAMP("2023-09-01 00:00:00")) ); ALTER TABLE history PARTITION BY RANGE( clock ) ( PARTITION p20230602 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-03 00:00:00")), PARTITION p20230603 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-04 00:00:00")), PARTITION p20230604 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-05 00:00:00")), PARTITION p20230605 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-06 00:00:00")), PARTITION p20230606 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-07 00:00:00")), PARTITION p20230607 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-08 00:00:00")), PARTITION p20230608 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-09 00:00:00")), PARTITION p20230609 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-10 00:00:00")), PARTITION p20230610 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-11 00:00:00")), PARTITION p20230611 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-12 00:00:00")), PARTITION p20230704 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-05 00:00:00")) ); ALTER TABLE history_log PARTITION BY RANGE( clock ) ( PARTITION p20230602 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-03 00:00:00")), PARTITION p20230603 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-04 00:00:00")), PARTITION p20230604 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-05 00:00:00")), PARTITION p20230605 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-06 00:00:00")), PARTITION p20230606 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-07 00:00:00")), PARTITION p20230607 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-08 00:00:00")), ); ALTER TABLE history_str PARTITION BY RANGE( clock ) ( PARTITION p20230602 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-03 00:00:00")), PARTITION p20230603 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-04 00:00:00")), PARTITION p20230604 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-05 00:00:00")), PARTITION p20230605 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-06 00:00:00")), PARTITION p20230606 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-07 00:00:00")), ) ); ALTER TABLE history_text PARTITION BY RANGE( clock ) ( PARTITION p20230602 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-03 00:00:00")), PARTITION p20230603 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-04 00:00:00")), PARTITION p20230604 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-05 00:00:00")), PARTITION p20230605 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-06 00:00:00")), PARTITION p20230606 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-07 00:00:00")), PARTITION p20230607 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-08 00:00:00")), PARTITION p20230608 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-09 00:00:00")), ); ALTER TABLE history_uint PARTITION BY RANGE( clock ) ( PARTITION p20230602 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-03 00:00:00")), PARTITION p20230603 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-04 00:00:00")), PARTITION p20230604 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-05 00:00:00")), PARTITION p20230605 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-06 00:00:00")), PARTITION p20230606 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-07 00:00:00")), PARTITION p20230607 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-08 00:00:00")), PARTITION p20230704 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-05 00:00:00")) ); DELIMITER // DROP PROCEDURE IF EXISTS zabbix.create_zabbix_partitions; // CREATE PROCEDURE zabbix.create_zabbix_partitions () BEGIN CALL zabbix.create_next_partitions("zabbix","history"); CALL zabbix.drop_old_partitions("zabbix","history"); CALL zabbix.create_next_partitions("zabbix","history_log"); CALL zabbix.drop_old_partitions("zabbix","history_log"); CALL zabbix.create_next_partitions("zabbix","history_str"); CALL zabbix.drop_old_partitions("zabbix","history_str"); CALL zabbix.create_next_partitions("zabbix","history_text"); CALL zabbix.drop_old_partitions("zabbix","history_text"); CALL zabbix.create_next_partitions("zabbix","history_uint"); CALL zabbix.drop_old_partitions("zabbix","history_uint"); CALL zabbix.create_next_monthly_partitions("zabbix","trends"); CALL zabbix.drop_old_monthly_partitions("zabbix","trends"); CALL zabbix.create_next_monthly_partitions("zabbix","trends_uint"); CALL zabbix.drop_old_monthly_partitions("zabbix","trends_uint"); END // DROP PROCEDURE IF EXISTS zabbix.create_next_partitions; // CREATE PROCEDURE zabbix.create_next_partitions (SCHEMANAME varchar(64), TABLENAME varchar(64)) BEGIN DECLARE NEXTCLOCK timestamp; DECLARE PARTITIONNAME varchar(16); DECLARE CLOCK int; SET @totaldays = 7; SET @i = 1; createloop: LOOP SET NEXTCLOCK = DATE_ADD(NOW(),INTERVAL @i DAY); SET PARTITIONNAME = DATE_FORMAT( NEXTCLOCK, 'p%Y%m%d' ); SET CLOCK = UNIX_TIMESTAMP(DATE_FORMAT(DATE_ADD( NEXTCLOCK ,INTERVAL 1 DAY),'%Y-%m-%d 00:00:00')); CALL zabbix.create_partition( SCHEMANAME, TABLENAME, PARTITIONNAME, CLOCK ); SET @i=@i+1; IF @i > @totaldays THEN LEAVE createloop; END IF; END LOOP; END // DROP PROCEDURE IF EXISTS zabbix.drop_old_partitions; // CREATE PROCEDURE zabbix.drop_old_partitions (SCHEMANAME varchar(64), TABLENAME varchar(64)) BEGIN DECLARE OLDCLOCK timestamp; DECLARE PARTITIONNAME varchar(16); DECLARE CLOCK int; SET @mindays = 30; SET @maxdays = @mindays+4; SET @i = @maxdays; droploop: LOOP SET OLDCLOCK = DATE_SUB(NOW(),INTERVAL @i DAY); SET PARTITIONNAME = DATE_FORMAT( OLDCLOCK, 'p%Y%m%d' ); CALL zabbix.drop_partition( SCHEMANAME, TABLENAME, PARTITIONNAME ); SET @i=@i-1; IF @i <= @mindays THEN LEAVE droploop; END IF; END LOOP; END // DROP PROCEDURE IF EXISTS zabbix.create_next_monthly_partitions; // CREATE PROCEDURE zabbix.create_next_monthly_partitions (SCHEMANAME varchar(64), TABLENAME varchar(64)) BEGIN DECLARE NEXTCLOCK timestamp; DECLARE PARTITIONNAME varchar(16); DECLARE CLOCK int; SET @totalmonths = 3; SET @i = 1; createloop: LOOP SET NEXTCLOCK = DATE_ADD(NOW(),INTERVAL @i MONTH); SET PARTITIONNAME = DATE_FORMAT( NEXTCLOCK, 'p%Y%m' ); SET CLOCK = UNIX_TIMESTAMP(DATE_FORMAT(DATE_ADD( NEXTCLOCK ,INTERVAL 1 MONTH),'%Y-%m-01 00:00:00')); CALL zabbix.create_partition( SCHEMANAME, TABLENAME, PARTITIONNAME, CLOCK ); SET @i=@i+1; IF @i > @totalmonths THEN LEAVE createloop; END IF; END LOOP; END // DROP PROCEDURE IF EXISTS zabbix.drop_old_monthly_partitions; // CREATE PROCEDURE zabbix.drop_old_monthly_partitions (SCHEMANAME varchar(64), TABLENAME varchar(64)) BEGIN DECLARE OLDCLOCK timestamp; DECLARE PARTITIONNAME varchar(16); DECLARE CLOCK int; SET @minmonths = 12; SET @maxmonths = @minmonths+24; SET @i = @maxmonths; droploop: LOOP SET OLDCLOCK = DATE_SUB(NOW(),INTERVAL @i MONTH); SET PARTITIONNAME = DATE_FORMAT( OLDCLOCK, 'p%Y%m' ); CALL zabbix.drop_partition( SCHEMANAME, TABLENAME, PARTITIONNAME ); SET @i=@i-1; IF @i <= @minmonths THEN LEAVE droploop; END IF; END LOOP; END // DROP PROCEDURE IF EXISTS zabbix.create_partition; // CREATE PROCEDURE zabbix.create_partition (SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64), CLOCK int) BEGIN DECLARE RETROWS int; SELECT COUNT(1) INTO RETROWS FROM information_schema.partitions WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_name = PARTITIONNAME; IF RETROWS = 0 THEN SELECT CONCAT( "create_partition(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" ) AS msg; SET @sql = CONCAT( 'ALTER TABLE ', SCHEMANAME, '.', TABLENAME, ' ADD PARTITION (PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', CLOCK, '));' ); PREPARE STMT FROM @sql; EXECUTE STMT; DEALLOCATE PREPARE STMT; END IF; END // DROP PROCEDURE IF EXISTS zabbix.drop_partition; // CREATE PROCEDURE zabbix.drop_partition (SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64)) BEGIN DECLARE RETROWS int; SELECT COUNT(1) INTO RETROWS FROM information_schema.partitions WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_name = PARTITIONNAME; IF RETROWS = 1 THEN SELECT CONCAT( "drop_partition(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ")" ) AS msg; SET @sql = CONCAT( 'ALTER TABLE ', SCHEMANAME, '.', TABLENAME, ' DROP PARTITION ', PARTITIONNAME, ';' ); PREPARE STMT FROM @sql; EXECUTE STMT; DEALLOCATE PREPARE STMT; END IF; END // DELIMITER ; SET @@global.event_scheduler = on; DROP EVENT IF EXISTS zabbix.maintain_partition; CREATE EVENT zabbix.maintain_partition ON SCHEDULE EVERY 1 DAY STARTS '2019-01-01 2:00:00' COMMENT 'maintain zabbix partition tables every day' DO CALL zabbix.create_zabbix_partitions();
f
centos6.8 上yum安装zabbix3.2
1、yum安装
做centos6的yum源
1、把所有rpm包放到/tmp/packages/目录下
ll /tmp/packages/
total 17028
drwxr-xr-x 2 root root 4096 May 23 17:14 repodata
-rw-r--r-- 1 root root 345004 May 23 17:13 zabbix-agent-3.2.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 4644164 May 23 17:13 zabbix-debuginfo-3.2.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 241540 May 23 17:13 zabbix-get-3.2.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 737848 May 23 17:13 zabbix-java-gateway-3.2.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 647752 May 23 17:13 zabbix-proxy-mysql-3.2.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 647780 May 23 17:13 zabbix-proxy-pgsql-3.2.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 631564 May 23 17:13 zabbix-proxy-sqlite3-3.2.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 252328 May 23 17:13 zabbix-sender-3.2.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 1840552 May 23 17:13 zabbix-server-mysql-3.2.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 1839560 May 23 17:13 zabbix-server-pgsql-3.2.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 5489008 May 23 17:13 zabbix-web-3.2.6-1.el6.noarch.rpm
-rw-r--r-- 1 root root 5648 May 23 17:13 zabbix-web-japanese-3.2.6-1.el6.noarch.rpm
-rw-r--r-- 1 root root 5208 May 23 17:13 zabbix-web-mysql-3.2.6-1.el6.noarch.rpm
-rw-r--r-- 1 root root 5220 May 23 17:13 zabbix-web-pgsql-3.2.6-1.el6.noarch.rpm
2、执行下面--add-repo会添加tmp_packages_.repo源
yum install -y yum-utils
yum-config-manager --add-repo=file:///tmp/packages/
ll
total 12
-rw-r--r-- 1 root root 1399 May 24 14:04 CentOS-Base.repo
-rw-r--r-- 1 root root 220 May 24 14:04 CentOS-Epel.repo
-rw-r--r-- 1 root root 97 May 24 14:18 tmp_packages_.repo
3、添加gpgcheck=0
echo 'gpgcheck=0' >> /etc/yum.repos.d/tmp_packages_.repo
4、cat tmp_packages_.repo
[tmp_packages_]
name=added from: file:///tmp/packages/
baseurl=file:///tmp/packages/
enabled=1
yum install -y epel-release
yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-java-gateway zabbix-get zabbix-web zabbix-server
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm
yum install -y php56w.x86_64 php56w-cli.x86_64 php56w-common.x86_64 php56w-gd.x86_64 php56w-ldap.x86_64 php56w-mbstring.x86_64 php56w-mcrypt.x86_64 php56w-mysql.x86_64 php56w-pdo.x86_64 php56w-xml php56w-xmlrpc php56w-bcmath
2、改zabbix端口为9672,清空zabbix.conf文件,再复制下面内容
cat > /etc/httpd/conf.d/zabbix.conf <<EOF # # Zabbix monitoring system php web frontend # Alias /zabbix /usr/share/zabbix <VirtualHost *:9672> ServerName localhost <Directory "/usr/share/zabbix"> Options FollowSymLinks AllowOverride None <IfModule mod_authz_core.c> # Apache 2.4 Require all granted </IfModule> <IfModule !mod_authz_core.c> # Apache 2.2 Order allow,deny Allow from all </IfModule> </Directory> <Directory ~ "^/usr/share/zabbix/(conf|api|include)/"> <IfModule mod_authz_core.c> # Apache 2.4 Require all denied </IfModule> <IfModule !mod_authz_core.c> # Apache 2.2 Order deny,allow Deny from all </IfModule> <files *.php> <IfModule mod_authz_core.c> # Apache 2.4 Require all denied </IfModule> <IfModule !mod_authz_core.c> Order deny,allow Deny from all </IfModule> </files> </Directory> </VirtualHost> EOF
3、安装mysql
安装步骤省略
注意:做一个软链接
mkdir -p /var/lib/mysql
ln -s /data/mysql/mysql3306/tmp/mysql.sock /var/lib/mysql/mysql.sock
4、在 MySQL上创建zabbix数据库.
mysql -uroot -p'123456' -S /data/mysql/mysql3306/tmp/mysql.sock -e " create database zabbix character set utf8 collate utf8_bin;"
mysql -uroot -p'123456' -S /data/mysql/mysql3306/tmp/mysql.sock -e "grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix'; "
5、导入表结构和数据.
#查看当前zabbix版本导入相应版本sql脚本
rpm -q zabbix-server-mysql
gzip -d /usr/share/doc/zabbix-server-mysql-3.2.6/create.sql.gz
mysql -uzabbix -pzabbix -S /data/mysql/mysql3306/tmp/mysql.sock --default-character-set=utf8 zabbix </usr/share/doc/zabbix-server-mysql-3.2.6/create.sql
6、配置zabbix_server.conf里面的数据库信息
vi /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
DBSocket=/data/mysql/mysql3306/tmp/mysql.sock
DBPort=3306
7、设置php.ini
sed -i 's/^;date.timezone =/date.timezone = Asia\/Shanghai /' /etc/php.ini
sed -i 's/^expose_php = On/expose_php = Off/' /etc/php.ini
sed -i 's/^max_execution_time = 30/max_execution_time = 300/' /etc/php.ini
sed -i 's/^post_max_size = 8M/post_max_size = 32M/' /etc/php.ini
sed -i 's/^max_input_time = 60/max_input_time = 300/' /etc/php.ini
sed -i 's/^display_errors = Off/display_errors =on/' /etc/php.ini
sed -i 's/^;always_populate_raw_post_data = -1/always_populate_raw_post_data = -1/' /etc/php.ini
在/etc/httpd/conf/httpd.conf 加入
grep 9672 /etc/httpd/conf/httpd.conf || sed -i '/Listen 80/a\Listen 9672' /etc/httpd/conf/httpd.conf
sed -i '/AddType application\/x-gzip \.gz \.tgz/a\AddType application/x-httpd-php .php' /etc/httpd/conf/httpd.conf
修改权限
chmod -R 755 /etc/zabbix/web/
chmod -R 755 /usr/share/zabbix/include/
chown -R apache:apache /etc/zabbix/web/
/usr/sbin/apachectl -t
/etc/init.d/httpd restart
8、 打开zabbix的web界面设置zabbix
/etc/init.d/zabbix-server restart
/etc/init.d/zabbix-agent restart
地址:http://122.152.212.203:9672/zabbix
默认用户名/密码: Admin/zabbix
数据库用户名/密码:zabbix/zabbix
zabbix名称:ZBXSERVER
配置完毕后会生成/etc/zabbix/web/zabbix.conf.php
Configuration file
"/etc/zabbix/web/zabbix.conf.php"
created: OK
9、设置开启自动启动
chkconfig httpd on
chkconfig mysql on
chkconfig zabbix-server on
chkconfig zabbix-agent on
/etc/init.d/zabbix-server start
10、禁用guest用户,修改Admin的密码
administration-》user groups-》点击guests这个组-》点击disable
administration-》users-》点击Admin-》点击change password-》输入两次密码-》update
用户名/密码: Admin/1qaz2wsx
11、配置zabbix服务器上的zabbix agent
vi /etc/zabbix/zabbix_agentd.conf
Server=127.0.0.1 ServerActive=127.0.0.1 Hostname=Zabbix server EnableRemoteCommands=1 PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log # ListenPort=10050 # HostnameItem=system.hostname # Include=/etc/zabbix_agentd.userparams.conf # Include=/etc/zabbix_agentd.conf.d/
其他都删掉,只保留上面几行
重启zabbix-agent
service zabbix-agent start
apache+php+mysql+zabbix yum zabbix 后访问报500错误
http://blog.sina.com.cn/s/blog_6311af050102vr6i.html
http://knowledge92.blog.51cto.com/7143076/1702892
apache+php+mysql+zabbix
这个是apache里的错误日志
[Sun May 17 10:09:09 2015] [error] [client 192.168.6.9] PHP Warning: require_once(/etc/zabbix/web/maintenance.inc.php): failed to open stream: Permission denied in /usr/share/zabbix/include/classes/core/ZBase.php on line 292
[Sun May 17 10:09:09 2015] [error] [client 192.168.6.9] PHP Fatal error: require_once(): Failed opening required '/etc/zabbix/web/maintenance.inc.php' (include_path='.:/usr/share/pear:/usr/share/php') in /usr/share/zabbix/include/classes/core/ZBase.php on line 292
原因是apache的启动用户对该目录 /etc/zabbix/web/maintenance.ini.php和/usr/share/zabbix/include/classes/core/ZBase.php 没有访问权限,把这两个目录的属组改为apache的启动用户即可
Fatal error: require_once(): Failed opening required '/etc/zabbix/web/maintenance.inc.php' (include_path='.:/usr/share/pear:/usr/share/php') in /usr/share/zabbix/include/classes/core/ZBase.php on line 269
修改权限
chmod -R 755 /etc/zabbix/web/
chmod -R 755 /usr/share/zabbix/include/
zabbix默认1分钟采集一次指标
update interval
优化zabbix-server参数
进程类参数
StartPollers=5 :配置poller的数量,该进程负责收集通过zabbix-agent采集到的数据,被动模式是zabbix-agent是的默认模式,如果监控的主机数很多,增加这个进程数量,默认为5
StartIPMIPollers=0 :配置ipmi poller的数量,该进程通过收集ipmitool监控服务器的物理特征,如温度,电压,风扇工作状态,如果要监控服务器的物理特,参数必须大于0
StartTrappers=5 :trapper数量,该进程负责收集通过zabbix-sender,zabbix-agent主动模式,proxy主动模式采集到的数据,如果有很多数据是通过这3种方式采集的,增加该进程的数量
StartPingers=1 ;收集icmp的ping数据
StartDiscoverers=1 ;配置自动发现的数量,处理network发现和low-level发现LLD相关任务,这两个是zabbix高级功能,用在机器数量多,运维自动化场景,如果超过500台机器,需要增加该进程数量
StartHTTPPollers=1 :配置http pollers数量,负责收集通过http请求web拨测采集到的web数据
StartJavaPollers=5:设置java poller的数量,进程负责收集通过JMX采集到的数据
StartSNMPTrapper=0:snmp trapper数量,进程负责收集通过snmp采集到的数据
StartVMwareCollectors=0:vmware collector数量,进程负责采集vmware 虚拟机数据,默认为0,如果要监控vmware esxi主机,参数必须大于0
缓存类参数
CacheSize=8M :zabbix初始化时占用多少系统共享内存用于存储配置信息,HOST,ITEM,TRIGGER数据,视监控主机数量和监控项调整
HistoryCacheSize=8M :用于设置划分多少系统共享内存用于存储采集的历史数据,此数值越大,数据库读压力越小
TrendCacheSize=4M :用于设置划分多少系统共享内存用于存储计算出来的趋势数据,此参数值从一定程度上可影响数据库读压力
如果监控主机数很多,那么CacheSize、HistoryCacheSize、TrendCacheSize三个参数调整到1GB以上
如果缓存类参数设置的过小,会导致zabbix-server发生OOM(跟操作系统的OOM不是一个概念),zabbix-server的OOM是指zabbix缓存不足,发生OOM时,zabbix-server的日志中会有相关记录,zbx_mem_realloc():out of memory
cat /var/log/zabbix/zabbix_server.log|grep memory
sed -i.bak 's/# CacheSize=8M/CacheSize=1G/' /etc/zabbix/zabbix_server.conf
sed -i.bak 's/# HistoryCacheSize=16M/HistoryCacheSize=1G/' /etc/zabbix/zabbix_server.conf
sed -i.bak 's/# TrendCacheSize=4M/TrendCacheSize=1G/' /etc/zabbix/zabbix_server.conf
修复zabbix数据库的字符集
创建zabbix数据库时候一定要是字符集 utf8mb3 排序规则utf8_bin
create database zabbix character set utf8 collate utf8_bin
1、用mysqldump备份zabbix 这个数据库
2、关闭zabbix-server进程
3、强制修改zabbix数据库的字符集
alter database zabbix character set utf8 collate utf8_bin;
查看当前数据库的字符集和排序规则
(test)root@localhost:mysql.sock 21:34:59 [(none)]> use zabbix (test)root@localhost:mysql.sock 21:35:02 [zabbix]> select @@character_set_database, @@collation_database; +--------------------------+----------------------+ | @@character_set_database | @@collation_database | +--------------------------+----------------------+ | utf8mb3 | utf8_bin | +--------------------------+----------------------+ 1 row in set (0.00 sec) 或者 (test)root@localhost:mysql.sock 21:49:19 [zabbix]> SHOW VARIABLES LIKE 'character_set_database'; +------------------------+---------+ | Variable_name | Value | +------------------------+---------+ | character_set_database | utf8mb3 | +------------------------+---------+ 1 row in set (0.01 sec) (test)root@localhost:mysql.sock 21:49:19 [zabbix]> SHOW VARIABLES LIKE 'collation_database'; +--------------------+----------+ | Variable_name | Value | +--------------------+----------+ | collation_database | utf8_bin | +--------------------+----------+
查看当前服务器的字符集和排序规则
(test)root@localhost:mysql.sock 21:51:18 [zabbix]> select @@character_set_server, @@collation_server; +------------------------+--------------------+ | @@character_set_server | @@collation_server | +------------------------+--------------------+ | utf8mb4 | utf8mb4_0900_ai_ci | +------------------------+--------------------+ 1 row in set (0.00 sec) 或者 (test)root@localhost:mysql.sock 21:50:37 [zabbix]> SHOW VARIABLES LIKE 'character_set_server'; +----------------------+---------+ | Variable_name | Value | +----------------------+---------+ | character_set_server | utf8mb4 | +----------------------+---------+ 1 row in set (0.00 sec) (test)root@localhost:mysql.sock 21:50:37 [zabbix]> SHOW VARIABLES LIKE 'collation_server'; +------------------+--------------------+ | Variable_name | Value | +------------------+--------------------+ | collation_server | utf8mb4_0900_ai_ci | +------------------+--------------------+
zabbix api
先用curl命令调用一下api看是否正常
认证并取得token字段
curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"user.login","params":{"user":"Admin","password":"1qaz2wsx"},"auth": null,"id":0}' http://192.168.1.40:9672/zabbix/api_jsonrpc.php;
安装python前置包
pip install requests==2.23 pip install certifi==2018.8.13
zabbix_api.py完整脚本如下,脚本是用Python2.7
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Author : huazai # @Time : 2023/7/6 17:33 # @File : zabbix_api.py # @Description : # @comment : import requests, json, time, datetime API_URL = "http://192.168.1.40:9672/zabbix/api_jsonrpc.php" #这里要改 USER = "Admin" #这里要改 PASSWORD = "1qaz2wsx" #这里要改 class ZabbixAPI(object): def __init__(self, url, user, passwd, timeout=None): self.timeout = timeout self.url = url self.auth_id = self.get_auth_id(user, passwd) # HTTP请求 def http_request(self, data, timeout=None): headers = {"Content-Type": "application/json"} request = requests.post(self.url, data=data, headers=headers, timeout=timeout) print request r = request.json() if r.has_key("error"): raise ValueError(r["error"]) else: return r["result"] # 获取认证ID,所有的API请求都需要带上这个认证ID def get_auth_id(self, user, passwd): data = json.dumps({ "jsonrpc": "2.0", "method": "user.login", "params": { "user": user, "password": passwd }, "id": 0 }) return self.http_request(data=data) # 基于主机名获取hostid def host_get(self, host): data = json.dumps({ "jsonrpc": "2.0", "method": "host.get", "params": { "output": ["hostid"], "filter": {"host": host} }, "auth": self.auth_id, "id": 1, }) result = self.http_request(data=data) return result[0].get('hostid') # 设置维护策略,其中,duration是维护周期,默认24h def maintenance_create(self, host, duration=24): data = json.dumps({ "jsonrpc": "2.0", "method": "maintenance.create", "params": { "name": host, "active_since": int(time.time()), "active_till": int(time.time()) + duration * 3600, "hostids": [ self.host_get(host) ], "timeperiods": [ { "timeperiod_type": 0, "period": duration * 3600, } ] }, "auth": self.auth_id, "id": 1 }) return self.http_request(data=data) # 获取指定时间段的告警信息 def problem_get(self, time_from): data = json.dumps({ "jsonrpc": "2.0", "method": "problem.get", "params": { "output": ["eventid", "objectid", "clock", "name", "severity"], "sortfield": ["eventid"], "sortorder": "DESC", "time_from": time_from, # "limit": 1001 }, "auth": self.auth_id, "id": 1 }) return self.http_request(data=data) # 基于triggerid获取触发对象 def trigger_get(self, trigger_ids): data = json.dumps({ "jsonrpc": "2.0", "method": "trigger.get", "params": { "triggerids": trigger_ids, "output": ['triggerid'], "monitored": 1, "skipDependent": 1, "selectHosts": ['name'], "filter": { "value": 1 } }, "auth": self.auth_id, "id": 1 }) return self.http_request(data=data) # 格式化秒数 def format_second(seconds): minutes, seconds = divmod(seconds, 60) hours, minutes = divmod(minutes, 60) days, hours = divmod(hours, 24) if days != 0: result = "%dd %dh %dm %ds" % (days, hours, minutes, int(seconds)) elif hours != 0: result = "%dh %dm %ds" % (hours, minutes, int(seconds)) elif minutes != 0: result = "%dm %ds" % (minutes, int(seconds)) else: result = "%ds" % (int(seconds)) return result def main(): zabbix_client = ZabbixAPI(API_URL, USER, PASSWORD) hostid = zabbix_client.host_get("mysqlnode1") print hostid time_from = int(time.mktime((datetime.datetime.now() - datetime.timedelta(days=1)).timetuple())) problem_result = zabbix_client.problem_get(time_from) trigger_ids = [each_problem["objectid"] for each_problem in problem_result] trigger_info = {} for each_trigger in zabbix_client.trigger_get(trigger_ids): triggerid = each_trigger['triggerid'] hostname = each_trigger['hosts'][0]['name'] trigger_info[triggerid] = hostname for each_problem in problem_result: problem_time = int(each_problem["clock"]) trigger_id = each_problem["objectid"] problem_name = each_problem["name"] problem_time_format = datetime.datetime.fromtimestamp(problem_time).strftime('%Y-%m-%d %H:%M:%S') host = trigger_info[trigger_id] last_time = format_second(time.time() - problem_time) print problem_time_format, host, problem_name, last_time zabbix_client.maintenance_create("mysqlnode1", 12) if __name__ == "__main__": main()
这个脚本的功能有以下3个:
通过主机名获取hostid
给指定主机设置维护时间
获取1天之内还没恢复的告警信息
python zabbix_api.py <Response [200]> <Response [200]> 10084 <Response [200]> <Response [200]> <Response [200]> <Response [200]>
看一下结果跟web界面是否一样
grafana接入zabbix流程
grafana安装zabbix数据源插件,安装面板适配zabbix数据源
zabbix数据源通过zabbix-api获取数据
[root@test_mysql_6 ~]# /usr/bin/zabbix_get -s 127.0.0.1 -p 10050 -k "vm.memory.size[available]" 2414075904 [root@test_mysql_6 ~]# /usr/bin/zabbix_get -s 127.0.0.1 -p 10050 -k "agent.ping" 1 [root@test_mysql_6 ~]# /usr/sbin/zabbix_agentd -t vm.memory.size[available] vm.memory.size[available] [u|2411057152]
Apache的httpd启用gzip压缩优化
压缩zabbix的web页面的图片,长文本,减少流量,加快访问速度
1、查看apache是否支持动态加载,否则就要静态重新编译,默认已经支持
[root@test_mysql_6 ~]# /usr/sbin/apachectl -l Compiled in modules: core.c mod_so.c http_core.c
2、如果支持动态加载,在apache的动态库目录下看一下有没有mod_deflate.so和mod_headers.so这两个动态库,一般都会有,yum安装都会预先安装了很多动态库
[root@test_mysql_6 ~]# ll /usr/lib64/httpd/modules/ -rwxr-xr-x 1 root root 15312 May 30 22:01 mod_unixd.so -rwxr-xr-x 1 root root 11176 May 30 22:01 mod_userdir.so -rwxr-xr-x 1 root root 15320 May 30 22:01 mod_usertrack.so -rwxr-xr-x 1 root root 11112 May 30 22:01 mod_version.so -rwxr-xr-x 1 root root 11192 May 30 22:01 mod_vhost_alias.so -rwxr-xr-x 1 root root 19488 May 30 22:01 mod_watchdog.so [root@test_mysql_6 ~]# ll /usr/lib64/httpd/modules/mod_{deflate,headers}.so -rwxr-xr-x 1 root root 31840 May 30 22:01 /usr/lib64/httpd/modules/mod_deflate.so -rwxr-xr-x 1 root root 23760 May 30 22:01 /usr/lib64/httpd/modules/mod_headers.so
3、修改配置文件,文件最后添加下面内容
cat >> /etc/httpd/conf/httpd.conf <<EOF LoadModule headers_module modules/mod_headers.so LoadModule deflate_module modules/mod_deflate.so <IfModule mod_deflate.c> # 启用压缩 SetOutputFilter DEFLATE # //压缩比率,1-9之间不建议设置太高,虽然有很高的压缩率,但是占用更多的 CPU 资源 DeflateCompressionLevel 6 # 压缩的文件类型,包括php文件,text文本文件,js文件 #AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript AddOutputFilterByType DEFLATE text/* AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp # 排除不需要压缩的文件类型,exe,tgz,gz , pdf,avi,mp3 等 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary </IfModule> EOF
4、测试一下配置文件语法问题
/usr/sbin/apachectl -t
5、重启httpd服务
systemctl restart httpd.service
6、查看是否已经加载了mod_deflate.so和mod_headers.so这两个动态库
apachectl -M | grep -iE "deflate|headers"
7、测试访问网站某个url,
curl -i --compressed "http://192.168.100.169:9672/zabbix/zabbix.php?action=dashboard.view" HTTP/1.1 200 OK Date: Sat, 12 Aug 2023 14:27:43 GMT Server: Apache/2.4.6 (CentOS) Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Set-Cookie: PHPSESSID=obkf9c14td9704adld4uqbtk2r; path=/zabbix; HttpOnly Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 817 Content-Type: text/html; charset=UTF-8 <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge"/> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="Author" content="Zabbix SIA" /><title>Warning [refreshed every 30 sec.]</title> <link rel="icon" href="favicon.ico"> <link rel="apple-touch-icon-precomposed" sizes="76x76" href="assets/img/apple-touch-icon-76x76-precomposed.png"> <link rel="apple-touch-icon-precomposed" sizes="120x120" href="assets/img/apple-touch-icon-120x120-precomposed.png"> <link rel="apple-touch-icon-precomposed" sizes="152x152" href="assets/img/apple-touch-icon-152x152-precomposed.png"> <link rel="apple-touch-icon-precomposed" sizes="180x180" href="assets/img/apple-touch-icon-180x180-precomposed.png"> <link rel="icon" sizes="192x192" href="assets/img/touch-icon-192x192.png"> <meta name="csrf-token" content=""/> <meta name="msapplication-TileImage" content="assets/img/ms-tile-144x144.png"> <meta name="msapplication-TileColor" content="#d40000"> <meta name="msapplication-config" content="none"/> <link rel="stylesheet" type="text/css" href="assets/styles/blue-theme.css?1685346787"></head> <body><div class="wrapper"><main><output class="msg-bad msg-global">You are not logged in<div class="msg-details"><ul class="msg-details-border"><li>You must login to view this page.</li><li>If you think this message is wrong, please consult your administrators about getting the necessary permissions.</li></ul></div><div class="msg-buttons"><button type="button" id="login" name="login" onclick="javascript: document.location = "index.php?request=zabbix.php%3Faction%3Ddashboard.view";">Login</button></div></output></main></div><script type="text/javascript"> setTimeout('document.location.reload();', 30000);
谷歌浏览器
响应标头和请求标头
响应标头:gzip
请求标头:gzip,deflate
f
如果是公网网站,可以使用站长工具
https://tool.chinaz.com/Gzips/?q=www.qq.com
f