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 

 
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"
View Code

 

生成出来的分区sql语句(注意:mysql定时器event是从2019年1月1日 开始每天凌晨2点执行 )

[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();

    
    
    
    
View Code

 

 

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

#!/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()
View Code

 


这个脚本的功能有以下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获取数据

 


zabbix-agent 读取并显示采集到的数据
 
zabbix_get (显示) -》zabbix_agentd(显示)
[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 = &quot;index.php?request=zabbix.php%3Faction%3Ddashboard.view&quot;;">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

posted @ 2017-05-24 18:06  xiaohuazi  阅读(1278)  评论(0编辑  收藏  举报