作者:Teo

Zabbix 监控



Zabbix 监控


zabbix server端及agent端 编译安装      \\ 版本 zabbix4.2.7 php5.6.16 nginx1.17 mysql5.6.47
    # mysql -uroot -p                  \\ 首先安装LNMP   此为数据库与zabbix同一主机上
        create database zabbix character set utf8;                                \\ 创建zabbix 表
        grant all privileges on zabbix.* to zabbix@'%' identified by '123456';     \\ 创建用户 及授权
    # yum install epel*
    # yum install unixODBC-devel mysql-devel net-snmp-devel libxml2-devel libcurl-devel libevent-devel   \\ libevent-devel base源
    # mv /etc/my.cnf /etc/my.cnf.bak          \\ 安装mysql-devel会在/etc/下生成my.cnf 会影响mysql启动 需要删除
    # tar zxf zabbix-4.2.7.tar.gz
    # cd zabbix-4.2.7
    # ./configure --prefix=/usr/local/zabbix/ --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --with-unixodbc
    # make -j4
    # make install
    # groupadd zabbix
    # useradd -g zabbix zabbix -s /sbin/nologin 
    # cp -r /data/soft/zabbix-4.2.7/frontends/php/ /data/www/zabbix     \\ 复制zabbix 网页文件
    # cd /data/soft/zabbix-4.2.7/database/mysql
    # mysql -uzabbix -p
        use zabbix
        source schema.sql;
        source images.sql;
        source data.sql;
    # mkdir /var/lib/mysql
    # ln -s /data/mysqldb/run/mysql.sock /var/lib/mysql/mysql.sock
    # vim /usr/local/zabbix/etc/zabbix_server.conf
        DBUser=zabbix                      \\ 需要改 数据库用户名
        DBPassword=123456                   \\ 需要改 数据库密码
        DBSocket=/var/lib/mysql/mysql.sock   \\ 此项可不修改...连接mysql时基于本地数据需要改 可以到mysql配置文件中查看 
                                              \\ socket文件位置 数据库不在本地不需要修改 最好使用此目录避免出现更多报错 
    # vim /etc/php.ini
        max_execution_time = 300
        max_input_time = 300
        post_max_size = 16M
        date.timezone = Asia/Shanghai
        always_populate_raw_post_data = -1             \\ 解决 php PHP option "always_populate_raw_post_data"
    # vim /usr/local/nginx/nginx.conf
        location ~ \.php$ {
            root           /data/www/;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #include        fastcgi_params;          \\ 注释掉
            include        fastcgi.conf;              \\ ... ... 修改此项目 否则zabbix网页会提示 没有权限访问
        }
    # chmod 757 /data/www/zabbix/conf                   \\ 给写权限 
    # cd /data/www/zabbix/assets/fonts                   \\ 字体目录
    # rz msyhbd.ttf                                       \\ 可以拷贝windos字体到此目录下面
    # vim /data/www/zabbix/include/defines.inc.php         \\ 修改字体配置文件  解决图片文字乱码问题
        define('ZBX_GRAPH_FONT_NAME',           'msyhbd');  \\ 改变中文字体
                                              \\ zabbix 解决 PHP LDAP Warning , 亦可以解决其他php未编译选项如 php bcmath fail
    # cp -frp /usr/lib64/libldap* /usr/lib/    \\ 复制必要文件 否则会报错
    # cd /data/soft/php-5.6.16/ext/ldap         \\ 解决 PHP bcmath  Fail
    # /usr/local/php/bin/phpize
    # ./configure --with-php-config=/usr/local/php/bin/php-config
    # make && make install
        Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
    # ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
    # extension=/usr/local/php/lib/php/extensi+ons/no-debug-non-zts-20131226/
    # systemctl restart php-fpm
    # vim /etc/init.d/zabbix_server                    \\ 创建启动文件 亦可以导入
        #!/bin/sh
        #chkconfig: 2345 80 05
        #description: zabbix
        case $1 in
        start)
        #/zabbix/start_zabbix.sh
        /usr/local/zabbix/sbin/zabbix_server -c /usr/local/zabbix/etc/zabbix_server.conf
        sleep 3
        ps -ef |grep zabbix|grep -v grep |grep -v start
        process=`ps -ef |grep zabbix|grep -v grep |grep -v start|wc -l`
        echo zabbix process $process
        ;;
        stop)
        #/zabbix/stop_zabbix.sh
        ps -ef |grep zabbix|grep -v grep |awk '{print $2}' |xargs kill -9
        ps -ef |grep zabbix|grep -v grep
        ;;
        restart)
        #/zabbix/stop_zabbix.sh
        #/zabbix/start_zabbix.sh

        ;;
        status)
        ps -ef |grep zabbix|grep -v grep |grep -v status
        process=`ps -ef |grep zabbix|grep -v grep |grep -v status |wc -l`
        echo zabbix process $process
        ;;
        *)
        ;;
        esac
    # chmod +x /etc/init.d/zabbix_server
    # chkconfig --add zabbix_server
    # chkconfig zabbix_server on
    # systemctl restart zabbix_server
    # ss -tnl                             \\ 10051 被监听
    # vim /usr/local/zabbix/etc/zabbix_agentd.conf
        Server=127.0.0.1                     \\ 允许哪些ip来获取信息 server端可以有多个  授权ip地址
        ServerActive=127.0.0.1                \\ 主动发起请求同时个服务器
        Hostname=Zabbix server                 \\ 最好dns解析后的主机名
        EnableRemoteCommands=1                  \\ 允许远程命令
        LogRemoteCommands=1                      \\ 远程命令的日志
    # cd /etc/init.d
    # rz zabbix_agentd                             \\ 复制 agent 启动文件
    # vim /etc/init.d/zabbix_agentd                 \\ 修改此配置文件 此配置文件为纯agent准备的 需要修改目录
        BASEDIR=/usr/local/zabbix
    # chkconfig --add zabbix_agentd
    # chkconfig zabbix_agentd on
    # systemctl restart zabbix_agentd
    # ss -tnl                            \\ 10050 被监听   http://192.168.10.10/zabbix    admin   zabbix

    注: 编译php的时候 加入 --with-ldap 选项 在make的时候会报错       \\ 解决zabbix PHP LDAP Warning
        collect2: error: ld returned 1 exit status
     ❶ 可以 去掉 --with-ldap 后用单独编译解决
     ❷ # vim /data/soft/php-5.6.16/MakeFile    \\ 需要make一次报错 之后才有此文件 然后在执行make
        找到 开头是 'EXTRA_LIBS' 这一行 在结尾加上 '-llber' 然后执行 make && make install
     ❸ 官网 源码包地址: https://www.zabbix.com/cn/download_sources


zabbix-agent 编译安装

    # groupadd zabbix
    # useradd -g zabbix zabbix -s /sbin/nologin 
    # yum install gcc pcre-devel
    # tar zxf zabbix-4.2.7.tar.gz
    # cd zabbix-4.2.7
    # ./configure --prefix=/usr/local/zabbix-agent --enable-agent
    # make
    # make install
    # vim /usr/local/zabbix-agent/etc/zabbix_agentd.conf
        Server=192.168.10.11
        ServerActive=192.168.10.11
        Hostname=10.15bianyi
        UnsafeUserParameters=1                                          \\ 是否启用用户自定义监控脚本,1启用,0不启用
        Include=/usr/local/zabbix-agent/etc/zabbix_agentd.conf.d/*.conf  \\ 开启 自定本脚本目录
    # vim /etc/init.d/zabbix_agentd                                       \\ 创建配置文件 亦可导入
        #!/bin/bash
        #
        # chkconfig: 345 95 95  
        # desctription: Zabbix Agentd
        #
        # @name:        zabbix_agentd
        # @author:      Alexander Hagenah <hagenah@topconcepts.com>
        # @created:     18.04.2006
        #
        # Modified for Zabbix 2.0.0
        # May 2012, Zabbix SIA
        #
        # Source function library.
        . /etc/init.d/functions

        # Variables
        # Edit these to match your system settings

                # Zabbix-Directory
                BASEDIR=/usr/local/zabbix-agent

                # Binary File
                BINARY_NAME=zabbix_agentd

                # Full Binary File Call
                FULLPATH=$BASEDIR/sbin/$BINARY_NAME

                # PID file
                PIDFILE=/tmp/$BINARY_NAME.pid

                # Establish args
                ERROR=0
                STOPPING=0

        #
        # No need to edit the things below
        #

        # application checking status
        if [ -f $PIDFILE  ] && [ -s $PIDFILE ]
                then
                PID=`cat $PIDFILE`

                if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null && [ $BINARY_NAME == `ps -e | grep $PID | awk '{print $4}'` ]
                then
                        STATUS="$BINARY_NAME (pid `pidof $APP`) running.."
                        RUNNING=1
                else
                        rm -f $PIDFILE
                        STATUS="$BINARY_NAME (pid file existed ($PID) and now removed) not running.."
                        RUNNING=0
                fi
        else
                if [ `ps -e | grep $BINARY_NAME | head -1 | awk '{ print $1 }'` ]
                        then
                        STATUS="$BINARY_NAME (pid `pidof $APP`, but no pid file) running.."
                else
                        STATUS="$BINARY_NAME (no pid file) not running"
                fi
                RUNNING=0
        fi

        # functions
        start() {
                if [ $RUNNING -eq 1 ]
                        then
                        echo "$0 $ARG: $BINARY_NAME (pid $PID) already running"
                else
                        action $"Starting $BINARY_NAME: " $FULLPATH
                        touch /var/lock/subsys/$BINARY_NAME
                fi
        }

        stop() {
                echo -n $"Shutting down $BINARY_NAME: "
                killproc $BINARY_NAME
                RETVAL=$?
                echo
                [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$BINARY_NAME
                RUNNING=0
        }


        # logic
        case "$1" in
                start)
                        start
                        ;;
                stop)
                        stop
                        ;;
                status)
                        status $BINARY_NAME
                        ;;
                restart)
                        stop
                        sleep 10
                        start
                        ;;
                help|*)
                        echo $"Usage: $0 {start|stop|status|restart|help}"
                        cat <<EOF

                                start           - start $BINARY_NAME
                                stop            - stop $BINARY_NAME
                                status          - show current status of $BINARY_NAME
                                restart         - restart $BINARY_NAME if running by sending a SIGHUP or start if not running
                                help            - this screen

        EOF
                exit 1
                ;;
        esac

        exit 0
    # chmod +x /etc/init.d/zabbix_agentd
    # chkconfig --add zabbix_agentd
    # chkconfig zabbix_agentd on
    # systemctl restart zabbix_agentd
    # ss -tnl                                   \\ 10051 被监控


添加监控项目   
    配置 --> 主机群组 --> 创建主机群组   组1
    主机 --> 创建主机
        主机名称            192.168.10.11
        可见的名称          测试服务器01
        群组                组1
        agent代理程序的接口  192.168.10.11
    模板 --> 选择
        Template App Nginx Status Connections     \\ nginx 监控
        Template Tcp_connect Status                \\ TCP 监控
        Template DB MySQL                           \\ mysql 系统自带 只添加 脚本及配置文件即可
        Redis Discovery                              \\ redis 监控
        Template ports Discovery                      \\ 端口 监控

        Template OS Linux                              \\ linux 默认
        SA_Linux                                        \\ 不知啥玩意


zabbix 配置文件 调优             \\ 会解决很多zabbix 服务器的警报 如 75% busy 等
    # vim /etc/zabbix/zabbix_server.conf
        CacheSize=·256M           \\ 缓存大小, 单位字节.    用于存储主机、监控项、触发器数据的共享内存大小.服务器内存有4G
        CacheUpdateFrequency=180   \\ Zabbix 缓存更新频率, 单位秒.  默认60
        HistoryCacheSize=64M        \\ 历史缓存数据大小, 单位字节.   默认16M
        HistoryIndexCacheSize=10M    \\ 历史索引缓存大小, 单位字节.用于索引历史缓存中历史数据的共享内存大小. 默认4M
        StartPollersUnreachable=80    \\ 不可达主机 (包括IPMI 和 Java)的轮询器实例数量。  默认1
        StartPollers=100        \\ 轮询器实例数量。根据具体情况设置大小 解决Zabbix alerter processes more than 75% busy
        StartDiscoverers=10      \\ 自动发现子进程实例个数    默认1
        StartTrappers=15          \\ trappers进程实例数量 至少要运行一个trapper进程来显示前端的服务器可用性和视图队列。
        Timeout=30                 \\ agent, SNMP 设备或外部检查的超时时长(单位秒)
        TrendCacheSize=128M         \\ 趋势缓存的大小,单位字节  用于存储趋势数据的共享内存大小。
        ValueCacheSize=128M          \\ 历史数据缓存大小, 单位bytes.缓存item历史数据请求的共享内存大小. 0即禁止缓存 (不建议).


添加 Nginx 监控到 Zabbix
    # mkdir -p /usr/local/zabbix-agent/scripts
    # cd /usr/local/zabbix-agent/scripts/          \\ 复制 nginx_status.sh 自定义监控脚本
    # vim nginx_status.sh                           \\ 创建 nginx监控脚本
        #!/bin/bash
        # Script to fetch nginx statuses for tribily monitoring systems
        # Set Variables
        #HOST=`/sbin/ifconfig eth1 | sed -n '/inet /{s/.*addr://;s/ .*//;p}'` 
        HOST=`curl -s ifconfig.me`
        PORT="81"
        # Functions to return nginx stats
        function alive {
        alive=`/usr/bin/curl -s "http://$HOST:$PORT/nginx_status" 2> /dev/null| grep 'Active' | awk '{print $NF}'`
        if [ -z ${alive} ];
        then
                echo 0
        else
                echo 1
        fi
        }
        function active {
        /usr/bin/curl -s "http://$HOST:$PORT/nginx_status" 2> /dev/null| grep 'Active' | awk '{print $NF}'
        }
        function reading {
        /usr/bin/curl -s "http://$HOST:$PORT/nginx_status" 2> /dev/null| grep 'Reading' | awk '{print $2}'
        }
        function writing {
        /usr/bin/curl -s "http://$HOST:$PORT/nginx_status" 2> /dev/null| grep 'Writing' | awk '{print $4}'
        }
        function waiting {
        /usr/bin/curl -s "http://$HOST:$PORT/nginx_status" 2> /dev/null| grep 'Waiting' | awk '{print $6}'
        }
        function accepts {
        /usr/bin/curl -s "http://$HOST:$PORT/nginx_status" 2> /dev/null| awk NR==3 | awk '{print $1}'
        }
        function handled {
        /usr/bin/curl -s "http://$HOST:$PORT/nginx_status" 2> /dev/null| awk NR==3 | awk '{print $2}'
        }
        function requests {
        /usr/bin/curl -s "http://$HOST:$PORT/nginx_status" 2> /dev/null| awk NR==3 | awk '{print $3}'
        }
        # Run the requested function  
        $1

    # chmod +x nginx_status.sh
    # cd /usr/local/zabbix-agent/etc/zabbix_agentd.conf.d/
    # vim nginx_status.conf                                    \\ 创建nginx监控 配置文件
        UserParameter=nginx.alive,/bin/sh /usr/local/zabbix-agent/scripts/nginx_status.sh alive
        UserParameter=nginx.connections.active,/bin/sh /usr/local/zabbix-agent/scripts/nginx_status.sh active
        UserParameter=nginx.accepts,/bin/sh /usr/local/zabbix-agent/scripts/nginx_status.sh accepts
        UserParameter=nginx.handled,/bin/sh /usr/local/zabbix-agent/scripts/nginx_status.sh handled
        UserParameter=nginx.requests,/bin/sh /usr/local/zabbix-agent/scripts/nginx_status.sh requests
        UserParameter=nginx.connections.reading,/bin/sh /usr/local/zabbix-agent/scripts/nginx_status.sh reading
        UserParameter=nginx.connections.writing,/bin/sh /usr/local/zabbix-agent/scripts/nginx_status.sh writing
        UserParameter=nginx.connections.waiting,/bin/sh /usr/local/zabbix-agent/scripts/nginx_status.sh waiting
    # systemctl restart zabbix_agentd.service                            \\ 键值为 nginx.alive nginx.accepts等
    # /usr/local/zabbix-agent/scripts/nginx_status.sh  active             \\ 本机测试 有返回数值
    # /usr/local/zabbix/bin/zabbix_get -s 192.168.10.11 -k nginx.alive     \\ 在服务器端测试 有返回数值

    为 Nginx 创建模板                        \\ web端 为自定义监控 nginx 及 tcp 创建 监控项目
        配置 --> 模板 --> 创建模板             \\ 为 nginx 创建 模板
            模板名称 Template App Nginx Status Connections
            群组      Templates
        编辑模板
            应用集 --> 创建应用集
                名称 nginx_status
            监控项 --> 创建监控项
                名称 nginx.alive
                类型 Zabbix 客户端          \\ 键值 nginx.alive  nginx.connections.active  nginx.accepts   
                键值 nginx.alive             \\ nginx.handled  nginx.requests  nginx.connections.reading   
                应用集 nginx_status           \\ nginx.connections.writing   nginx.connections.waiting 
            触发器 --> 创建触发器
                名称 Nginx server status        \\ 监控 nginx 运行状态
                严重性 严重
                表达式 {Template App Nginx Status Connections:nginx.alive.last()}=0
                描述 nginx服务器状态
            图形 --> 创建图形
                名称 nginx_status
            监控项 --> 添加

    注: 需要nginx开启status页面 下面为配置文件 直接导入到nginx配置文件目录即可
        # vim agent_nginx.conf
            server {
                listen       81 default;
                server_name  _;
                #return 500;

            location /nginx_status {
                 stub_status on;
                 access_log off;
                 allow 47.91.219.10;
                 allow 47.91.219.64;
                 allow 47.91.219.0/24;
                 deny all;
            }
            }


添加 Tcp 监控到 Zabbix
    # mkdir -p /usr/local/zabbix-agent/tmp                    \\ 创建tcp数据存储目录
    # chown -R zabbix.zabbix /usr/local/zabbix-agent/tmp       \\ 给权限 需要写入数据
    # vim /usr/local/zabbix-agent/scripts/tcp_status.sh         \\ 创建监控脚本文件 亦可导入
        #!/bin/bash
        #tcp_status
        [ $# -ne 1 ] && echo "Usage:CLOSE-WAIT|CLOSED|CLOSING|ESTAB|FIN-WAIT-1|FIN-WAIT-2|LAST-ACK|LISTEN|SYN-RECV SYN-SENT|TIME-WAIT" && exit 1
        ss_file=/usr/local/zabbix-agent/tmp/ss.txt
        tcp_status_fun(){
          tcp_stat=$1
          ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s)print k,s[k]}' > ${ss_file}
          tcp_stat_value=$(grep ${tcp_stat} $ss_file | awk {'print $NF'})
          if [ -z "$tcp_stat_value" ];then
            tcp_stat_value=0
          fi
          echo $tcp_stat_value   
        }
        tcp_status_fun $1
    # chmod +x /usr/local/zabbix-agent/scripts/tcp_status.sh
    # vim /usr/local/zabbix-agent/etc/zabbix_agentd.conf.d/tcp_status.conf          \\ 创建配置文件 亦可导入
        UserParameter=tcp_status[*],/usr/local/zabbix-agent/scripts/tcp_status.sh $1
    # systemctl restart zabbix_agentd.service
    # /usr/local/zabbix/bin/zabbix_get -s 192.168.10.11 -p 10050 -k tcp_status[ESTAB]   \\ 在服务器端 测试 有返回值

    为 Tcp 创建 模板
        配置 --> 模板 --> 创建模板
            模板名称 Template Tcp_connect Status
            群组     Templates
        编辑模板
            应用集 --> 创建应用集
                名称 tcp_status
            监控项 --> 创建监控项
                名称 tcp_status[ESTAB] 
                类型 Zabbix 客户端          \\ 键值tcp_status[]的值 CLOSED  CLOSING  ESTAB  FIN-WAIT-1  FIN-WAIT-2 
                键值 tcp_status[ESTAB]       \\ LAST-ACK  LISTEN  SYN-RECV SYN-SENT  TIME-WAIT CLOSE-WAIT
                应用集 tcp_status           
            图形 --> 创建图形
                名称 tcp_status
                监控项 --> 添加


添加 Mysql 监控到 Zabbix
    # vim /usr/local/zabbix-agent/scripts/mysql_status.sh                 \\ 创建监控脚本文件 亦可导入
        #!/bin/bash 
        HOST="localhost"
        USER="root"
        PASSWORD="123456"
        PORT="3306"
        CONNECTION="mysqladmin -h ${HOST} -u ${USER} -P ${PORT} -p${PASSWORD}"
        if [ $# -ne "1" ];then
            echo "arg error!"
        fi
        case $1 in
            Uptime)
                result=`${CONNECTION} status 2>/dev/null |awk '{print $2}'`
                echo $result
                ;;
            Questions)
                result=`${CONNECTION} status 2>/dev/null |awk '{print $6}'`
                echo $result
                ;;
            Com_update)
                result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_update" |awk '{print $4}'`
                echo $result
                ;;
            Slow_queries)
                result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Slow_queries" |awk '{print $4}'`
                echo $result
                ;;
            Com_select)
                result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_select" |awk '{print $4}'`
                echo $result
                ;;
            Com_rollback)
                result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_rollback" |awk '{print $4}'`
                echo $result
                ;;
            Com_insert)
                result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_insert" |awk '{print $4}'`
                echo $result
                ;;
            Com_delete)
                result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_delete" |awk '{print $4}'`
                echo $result
                 ;;
            Com_commit)
                result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_commit" |awk '{print $4}'`
                echo $result
                ;;
            Bytes_sent)
                result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Bytes_sent" |awk '{print $4}'`
                echo $result
                ;;
            Bytes_received)
                result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Bytes_received" |awk '{print $4}'`
                echo $result
                ;;
            Com_begin)
                result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_begin" |awk '{print $4}'`
                echo $result
                ;;*)
                echo "Usage:$0(Uptime|Questions|Com_update|Slow_queries|Com_select|Com_rollback|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)"
                ;;
        esac
    # chmod +x /usr/local/zabbix-agent/scripts/mysql_status.sh                       \\ 不需要防火墙开启3306端口
    # vim /usr/local/zabbix-agent/etc/zabbix_agentd.conf.d/userparameter_mysql.conf   \\ 密码创建配置文件 需要加入mysql密码
        UserParameter=mysql.status[*],/usr/local/zabbix-agent/scripts/mysql_status.sh $1
        UserParameter=mysql.ping,mysqladmin -u root -h localhost -p123456 ping 2>/dev/null | grep -c alive
        UserParameter=mysql.version,mysql -V

    为 mysql 添加 监控模板
        Template DB MySQL               \\ 使用mysql 系统自带模板即可   只添加 脚本及配置文件即可


添加 Redis 监控到 Zabbix
    # vim /usr/local/zabbix-agent/scripts/redis_discovery.py      \\ 创建监控脚本 脚本为python脚本 需要python环境 默认有
        #!/usr/bin/env python
        import os
        import json 
        t=os.popen("""sudo netstat -tlpn |grep redis|grep 0.0.0.0|awk '{print $4}'|awk -F: '{print $2}' """)
        ports = []
        for port in  t.readlines():
                r = os.path.basename(port.strip())
                ports += [{'{#REDISPORT}':r}]
        print json.dumps({'data':ports},sort_keys=True,indent=4,separators=(',',':'))
    # chmod +x /usr/local/zabbix-agent/scripts/redis_discovery.py
    # vim /usr/local/zabbix-agent/etc/zabbix_agentd.conf.d/redis_discovery_port.conf    \\ 创建配置文件 需加入密码foobared
        UserParameter=redis.discovery,/usr/bin/python /usr/local/zabbix-agent/scripts/redis_discovery.py
        UserParameter=redis_stats[*],redis-cli -p $1 -h 127.0.0.1 -a foobared info | grep -w $2 | cut -d : -f2
    # echo 'Defaults:zabbix !requiretty' >> /etc/sudoers                  \\ 给zabbix用户sudo权限
    # echo 'zabbix ALL=(root) NOPASSWD:/bin/netsta' >> /etc/sudoers
    # /usr/local/zabbix-agent/scripts/redis_discovery.py                    \\ 本机测试 会获取到端口

    为 Redis 添加 监控模板
        配置 --> 模板 --> 创建模板                 \\ 为 Redis 创建 模板
            模板名称 Redis Discovery
            群组      Templates
        编辑模板
            应用集 --> 创建应用集
                名称 redis_status
            监控项 --> 自动发现规则
                名称 Redis Status Discovery
                类型 Zabbix 客户端
                键值 redis.discovery
                更新间隔 60s
                资源周期不足 1d
            监控项 --> 自动发现规则 --> 监控项原型
                名称 Redis $1 Port Blocked clients
                类型 Zabbix 客户端
                键值 redis_stats[{#REDISPORT},blocked_clients]
                更新间隔 60s
                应用集 redis_status

                名称及键值 逐一添加                    \\ 其他的信息类型 默认即可
                    Redis $1 Port Blocked clients
                    redis_stats[{#REDISPORT},blocked_clients]

                    Redis $1 Port Connected clients
                    redis_stats[{#REDISPORT},connected_clients]
                    信息类型 文本

                    Redis $1 Port Connected slave
                    redis_stats[{#REDISPORT},connected_slaves]

                    Redis $1 Port Connection rate
                    redis_stats[{#REDISPORT},total_connections_received]

                    Redis $1 Port Expired keys
                    redis_stats[{#REDISPORT},expired_keys]

                    Redis $1 Port mem_fragmentation_ratio
                    redis_stats[{#REDISPORT},mem_fragmentation_ratio]
                    信息类型 浮点数

                    Redis $1 Port Rejected Connections
                    redis_stats[{#REDISPORT},rejected_connections]

                    Redis $1 Port Request rate
                    redis_stats[{#REDISPORT},instantaneous_ops_per_sec]

                    Redis $1 Port Role
                    redis_stats[{#REDISPORT},role]
                    信息类型 文本

                    Redis $1 Port Uptime in seconds
                    redis_stats[{#REDISPORT},uptime_in_seconds]

                    Redis $1 Port Used memory
                    redis_stats[{#REDISPORT},used_memory]

                    Redis $1 Port Used_Memory_Peak
                    redis_stats[{#REDISPORT},used_memory_peak]

                    Redis $1 Port Used_memory_rss
                    redis_stats[{#REDISPORT},used_memory_rss]

            监控项 --> 自动发现规则 --> 触发器类型
                名  称 Redis-{#REDISPORT}服务使用内存异常,请检查
                严重性 一般严重
                表达式 {Redis Discovery:redis_stats[{#REDISPORT},used_memory].last()}<0
                
                名  称 Redis-{$REDISPORT}redis内存交换至swap
                严重性 警告
                表达式 {Redis Discovery:redis_stats[{#REDISPORT},mem_fragmentation_ratio].last()}<1

                名  称 Redis-{$REDISPORT}最大客户端数量已达到最大值
                表达式 {Redis Discovery:redis_stats[{#REDISPORT},rejected_connections].last()}>0 and {Redis Discovery:redis_stats[{#REDISPORT},Connected_clients].last()}>9800

            监控项 --> 自动发现规则 --> 图形原型

                名    称 Redis-{#REDISPORT} Port Connections
                添加原型 看着加
                名    称 Redis-{#REDISPORT} Port key
                添加原型 Redis {#REDISPORT} Port Expired keys

                名    称 Redis-{#REDISPORT} Port mem_fragmentation_ratio
                添加原型 Redis {#REDISPORT} Port mem_fragmentation_ratio

                名    称 Redis-{#REDISPORT} Uptime_in_seconds
                添加原型 Redis Discovery: Redis {#REDISPORT} Port Uptime in seconds

                名    称 Redis-{#REDISPORT} Port Used memory
                添加原型 Redis {#REDISPORT} Port Used memory


添加 端口 到 Zabbix
    # vim /usr/local/zabbix-agent/scripts/check_port.py           \\ 注意for下面的代码有缩进 否则会报错
        #!/usr/bin/env python
        import os
        import json
        portlist = []
        new_port_list = []
        port_dict = {"data":None}
        cmd = '''netstat -tnlp|egrep -i "$1"|awk {'print $4'}|'''
        cmd += '''awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort -n| uniq 2>/dev/null'''
        auto_localport = os.popen(cmd).readlines()
        for ports in auto_localport:
            new_port = ports.strip()
            portlist.append(new_port)
        for port in portlist:
            pdict = {}
            pdict["{#TCP_PORT}"] = port
            new_port_list.append(pdict)
            port_dict["data"] = new_port_list
            jsonStr = json.dumps(port_dict,sort_keys=True,indent=4)
        #python3
        #print(jsonStr)
        #python2
        print jsonStr

    # vim /usr/local/zabbix-agent/etc/zabbix_agentd.conf.d/check_port.conf
        UnsafeUserParameters=1
        UserParameter=tcpportlisten,/usr/local/zabbix-agent/scripts/check_port.py
    # chmod +s /bin/netstat                                               \\ 给 netstat 命令加 普通用户执行权限
    # zabbix_get -s 192.168.10.12 -p 10050 -k tcpportlisten                \\ 在主服务器端  可获取到端口

    为 端口 添加 监控模板
        配置 --> 模板 --> 创建模板                 \\ 为 Redis 创建 模板
            模板名称 Template ports Discovery
            群组     Templates
        编辑模板
            监控项 --> 自动发现规则
                名称 Template Ports Discovery
                类型 Zabbix 客户端
                键值 tcpportlisten
                更新间隔 30s
                资源周期不足 1d
            监控项 --> 自动发现规则 --> 监控项原型
                名称 tcp port $1
                类型 Zabbix 客户端
                键值 net.tcp.listen[{#TCP_PORT}]
                更新间隔 30s
            监控项 --> 自动发现规则 --> 触发器类型
                名称 tcp_port{#TCP_PORT}status
                严重性 严重                              \\ count(#3,0,eq) > 1表示最近3次的返回值为0,这个条件触发一次则报警.
                表达式 {Template ports Discovery:net.tcp.listen[{#TCP_PORT}].count(#3,0,eq)}>1    


为 节点 自动添加 agetn 脚本       \\ 可删除之前的版本 安装包为4.0 集成了mysql redis tcp nginx 端口 监控
    # vim agent.sh
        #!/bin/bash
        ip=`curl -s ifconfig.me`
        old_ver=`rpm -qa zabbix-agent`
        old_url=`find /usr/local/ -name zabbix_agentd.conf | awk -F'/' 'BEGIN{OFS="/"} {print $1,$2,$3,$4}'`
        if [ ${#old_ver} -ne 0 ];then
                yum remove -y zabbix-agent
        fi
        if [ ${#old_url} -ne 0 ];then
                rm -rf $old_url
        fi
        rm -rf /etc/init.d/zabbix_agentd
        id zabbix
        if [ $? -ne 0 ];then
                groupadd zabbix
                useradd -g zabbix zabbix -s /sbin/nologin
        fi
        chmod +s /bin/netstat
        echo 'Defaults:zabbix !requiretty' >> /etc/sudoers
        echo 'zabbix ALL=(root) NOPASSWD:/bin/netsta' >> /etc/sudoers
        wget http://www.syk.my/download/zabbix-agent.tar.gz
        tar zxvf zabbix-agent.tar.gz -C /usr/local/
        rm -rf zabbix-agent.tar.gz
        mv /usr/local/zabbix-agent/zabbix_agentd /etc/init.d/
        chown zabbix.zabbix /usr/local/zabbix-agent/tmp
        chkconfig --add zabbix_agentd
        chkconfig zabbix_agentd on
        systemctl restart zabbix_agentd
        #cat > /etc/nginx/conf.d/agent_nginx.conf <<-EOF
        #server {
        #    listen       81 default;
        #    server_name  _;
        #    location /nginx_status {
        #        stub_status on;
        #        access_log off;
        #        allow $ip;
        #        allow 154.80.251.90;
        #        allow 43.243.95.0/24;
        #        deny all;
        #    }
        #}
        #EOF


Zabbix服务器 添加 Telegram 发送告警
  方法一: 使用tg
    https://my.telegram.org/auth?to=apps    \\ 访问此网址获取用户私钥
        +639770000000                        \\ telegram的电话
        vc7nuXtw-Mf                           \\ 会发送到 telegram 的验证码
        App title: test123
        Short name: test123                     \\ 填写两项即可
        Public keys:                             \\ 复制所有内容

    # yum install lua-devel openssl-devel libconfig-devel readline-devel libevent-devel git uuid-devel  libuuid libuuid-devel
    # cd /usr/local
    # git clone --recursive https://github.com/vysheng/tg.git   \\ 下载tg文件 亦可以导入
    # cd tg
    # ./configure --disable-json
    # make
    # vim /usr/locla/tg/tg-server.pub        \\ 复制进去 上面复制的私钥
    # /usr/local/tg/bin/telegram-cli -k /usr/local/tg/tg-server.pub   \\ 登录 第一次登录要验证码
        phone number: +639770000000
        code ('CALL' for phone code):  48904  \\ 验证码会发送到telegrams
        msg qi aaaaaaaa                        \\ 给qi发送信息 如果提示错误 FAIL: 38: can not parse arg #1 先用手机发送 在用此发送即可
        quit                                    \\ 退出
    # /usr/local/tg/bin/telegram-cli -k /usr/local/tg/tg-server.pub -WDCRE -P 8890 -d &>/dev/null &  \\ 8890端口在后台运行程序
    # vim /usr/local/zabbix/etc/zabbix_server.conf
        AlertScriptsPath=/usr/local/zabbix/alertscripts    \\ 定义 自定义脚本目录
    # /usr/local/zabbix/alertscripts/tg.sh
        #!/bin/sh
        echo -e "msg $1 $2 $3" | nc localhost 8890
    # /etc/profile.d/telegram-cli.sh                               \\ 创建开机启动脚本 添加到开机启动
        /usr/local/tg/bin/telegram-cli -k /usr/local/tg/tg-server.pub -WDCRE -P 8890 -d &>/dev/null &
    # systemctl restart zabbix_server.service

  方法二: 使用机器人
    申请telegram机器人
        telegram搜索框中搜索 @BotFather
        /start       找到机器人后与其对话输入 /start
        /newbot      继续输入 /newbot
        zabbizteo1bot 输入你创建机器人的昵称 随便起但不能重复 后面要跟bot 如zabbizteo1bot 有 Done提示即完成
            t.me/zabbizteo1bot                             \\ 点进去 发送 /start  及随便发送其他信息
                /start
            1353054608:AAEleccGmr-z8a6nq7uK6KzLFsIFokMCHfc   \\ api秘钥  即token
        创建群组 里面拉入 此机器人                  \\ 群组名字随便11223344 如果需要群组的话创建 不需要不用创建
        浏览器访问访问 https://api.telegram.org/bot替换为你的秘钥/getUpdates    来获取id
            https://api.telegram.org/bot1353054608:AAEleccGmr-z8a6nq7uK6KzLFsIFokMCHfc/getUpdates
                {"ok":true,"result":[{"update_id":812594943,
                chat":{"id":779671758,"first_name":"Teo","type":"private"}
                chat":{"id":-325911383,"title":"11223344","type":"group"   
        779671758   用户id
        -325911383  组id                                        \\ 组id前面有 -
        Linux 服务器测试 使用机器人发送信息 浏览器也可以             \\ 浏览器测试未成功 可能格式有误
            curl -X POST "https://api.telegram.org/bot你的秘钥/sendMessage" -d "chat_id=你的ID &text=测试123"
                curl -X POST "https://api.telegram.org/bot1353054608:AAEleccGmr-z8a6nq7uK6KzLFsIFokMCHfc/sendMessage" -d "chat_id=779671758 &text=测试1234"      \\ 单个用户发送

                curl -X POST "https://api.telegram.org/bot1353054608:AAEleccGmr-z8a6nq7uK6KzLFsIFokMCHfc/sendMessage" -d "chat_id=-325911383 &text=测试1234"       \\ 给组发送
        # vim /usr/local/zabbix/etc/zabbix_server.conf
            AlertScriptsPath=/usr/local/zabbix/alertscripts                 \\ 定义 自定义脚本目录
        # vim /usr/local/zabbix/alertscripts/alert.sh                        \\ 亦可导入
            #!/bin/bash
            #方式一:直接调用telegram-bot api 接口发送消息
            MSG=$3
            Token='1354261576:AAHrlPtKslxFNyh-Zgx8me7STc3_rPNqvDI'
            ChatID='-325911383'
            curl -X GET "https://api.telegram.org/bot$Token/sendMessage" -d "chat
        # systemctl restart zabbix_server.service

    添加 Telegram 发送告警功能
        管理 --> 报警媒介类型 --> 创建媒体类型
            名称 Telegram_group
            类型 脚本
            脚本名称 tg.sh                         \\ 方法二 alert.sh
            脚本参数 {ALERT.SENDTO}
                    {ALERT.SUBJECT}
                    {ALERT.MESSAGE}
        管理 --> 用户 --> Admin --> 报警媒介 --> 添加   \\ 可以添加多个人
            类型 Telegram_group
            收件人 11223344                      \\ 此为 telegram 要发送的 联系人名或群名字 方法二名字在脚本总
        配置 --> 动作 --> 创建动作
            动作
                名称 Telegram_group
                新的触发条件
                    触发器示警度 大于等于 信息      \\ 看情况即可
            操作
                默认操作步骤持续时间 1m
                默认标题 故障!:告警节点:{TRIGGER.NAME}
                消息内容 问题详情:  {ITEM.NAME}:{ITEM.VALUE}      \\ 此处有换行 方法一 只识别一行 需要在同一行
                        告警主机:  {HOST.NAME}                    \\ 方法二 可以直接使用  可当换行使用
                        告警时间:  {EVENT.DATE} {EVENT.TIME}       \\ 方法二 可在内容前面加个 . 为单独一行
                        告警等级:  {TRIGGER.SEVERITY}
                        告警信息:  {TRIGGER.NAME}
                        告警项目:  {TRIGGER.KEY1}
                        当前状态:  {TRIGGER.STATUS}.{ITEM.VALUE} 
                        事件ID:  {EVENT.ID}zbxtg:graphs
                        zbxtg:graphs_period=10800
                        zbxtq:itemid:{ITEM.ID1}
                        zbxtg:title:{HOST.HOST} - {TRIGGER.NAME}
                操作 --> 新的 --> 操作细节
                    发送到用户 --> 添加 --> Admin
                    仅送到 --> Telegram_group
                    更新
            恢复操作
                默认标题 恢复!:恢复节点:{TRIGGER.NAME}
                消息内容 问题详情:  {ITEM.NAME}:{ITEM.VALUE}
                        恢复主机:  {HOST.NAME}
                        恢复时间:  {EVENT.DATE} {EVENT.TIME}
                        事件等级:  {TRIGGER.SEVERITY}
                        恢复项目:  {TRIGGER.KEY1}
                        当前状态:  {TRIGGER.STATUS}.{ITEM.VALUE} 
                        事件ID:  {EVENT.ID}    zbxtg:graphs
                        zbxtg:graphs_period=10800
                        zbxtq:itemid:{ITEM.ID1}
                        zbxtg:title:{HOST.HOST} - {TRIGGER.NAME}
                操作 --> 新的 --> 操作细节
                    发送到用户 --> 添加 --> Admin
                    仅送到 --> Telegram_group
                    更新


外部邮箱账号发送报警邮件设置 smtp
    # yum install mailx                 \\ 登录qq邮箱 --> 设置 --> 开启服务IMAP/SMTP服务(需要短信验证)
    # yum install sendmail
    # systemctl stop postfix              \\ 需要停止postfix
    # systemctl disable postfix
    # systemctl restart sendmail
    # vim /etc/mail.rc                       \\ 最后添加即可
        set smtp=smtps://smtp.qq.com:465      \\ 第三方发邮件的smtp服务器地址   smtps://smtp.gmail.com:465
        set from=113487@qq.com                 \\ 对方收到邮件时显示的发件人    a09669461688@gmail.com
        set smtp-auth-user=113487@qq.com        \\ 第三方发邮件的用户名        a09669461688@gmail.com
        set smtp-auth-password=ppkcmcfkbpdtcafi  \\ 授权码 在邮箱中开启smtp服务器会有授权码 google邮箱可以使用密码
        set ssl-verify=ignore
        set nss-config-dir=/root/.certs
        set smtp-auth=login                         \\ SMTP的认证方式
    # mkdir -p /root/.certs/                         \\ 配置证书
    # echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
    # certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
    # certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
    # certutil -L -d /root/.certs
    # echo -e "Hello" | mail -v -s "test" 113487@qq.com      \\ 测试 可以给自己发送
    # vim /usr/local/zabbix/alertscripts/mail.sh
        #!/bin/bash
        sendto=$1
        subject=$2
        message=$3
        echo -e "$message" | mail -v -s "$subject" $sendto

    注: 使用谷歌邮箱  设置 --> 查看所有设置 --> 转发和 POP/IMAP --> 启用 IMAP
        方法一: 谷歌邮箱需要开启 安全性较低的应用的访问权限 https://myaccount.google.com/lesssecureapps
        方法二: 开启 管理谷歌账号 --> 安全性 --> 两步验证 
                后设置应用专用密码 https://security.google.com/settings/security/apppasswords
 
    添加 邮件 发送告警功能
        管理 --> 报警媒介类型 --> 创建媒体类型
            名称 mail_script
            类型 脚本
            脚本名称 mail.sh
            脚本参数 {ALERT.SENDTO}
                    {ALERT.SUBJECT}
                    {ALERT.MESSAGE}
        管理 --> 用户 --> Admin --> 报警媒介 --> 添加   \\ 可以添加多个人
            类型 mail_script
            收件人 113487@qq.com                         \\ 此为要发送的邮箱账号 即$1
        配置 --> 动作 --> 创建动作
            动作
                名称 mail_script
                新的触发条件
                    触发器示警度 大于等于 信息      \\ 看情况即可
            操作
                默认操作步骤持续时间 1m
                默认标题 故障!:告警节点:{TRIGGER.NAME}   \\ 下面 \n为echo换行符 否则zabbix换行符^M在mail中会以附件形式发送
                问题详情:  {ITEM.NAME}:{ITEM.VALUE}\n告警主机:  {HOST.NAME}\n告警时间:  {EVENT.DATE} {EVENT.TIME}\n告警等级:  {TRIGGER.SEVERITY}\n告警信息:  {TRIGGER.NAME}\n告警项目:  {TRIGGER.KEY1}\n当前状态:  {TRIGGER.STATUS}.{ITEM.VALUE}\n事件ID:  {EVENT.ID}zbxtg:graphs\nzbxtg:graphs_period=10800\nzbxtq:itemid:{ITEM.ID1}\nzbxtg:title:{HOST.HOST} - {TRIGGER.NAME}\n
                操作 --> 新的 --> 操作细节
                    发送到用户 --> 添加 --> Admin
                    仅送到 --> mail_script
                    更新
            恢复操作
                默认标题 恢复!:恢复节点:{TRIGGER.NAME}
                问题详情:  {ITEM.NAME}:{ITEM.VALUE}\n恢复主机:  {HOST.NAME}\n恢复时间:  {EVENT.DATE} {EVENT.TIME}\n事件等级:  {TRIGGER.SEVERITY}\n恢复项目:  {TRIGGER.KEY1}\n当前状态:  {TRIGGER.STATUS}.{ITEM.VALUE}\n事件ID:  {EVENT.ID}    zbxtg:graphs\nzbxtg:graphs_period=10800\nzbxtq:itemid:{ITEM.ID1}\nzbxtg:title:{HOST.HOST} - {TRIGGER.NAME}\n
                操作 --> 新的 --> 操作细节
                    发送到用户 --> 添加 --> Admin
                    仅送到 --> mail_script
                    更新


........................................................................................................................


zabbix server端及agent端 yum安装

    # mysql -uroot -p       \\  首先安装LNMP   此为数据库与zabbix同一主机上
         create database zabbix character set utf8;                                                \\ 创建zabbix 表
         grant all privileges on zabbix.* to zabbix@'%' identified by '123456';                     \\ 创建用户 及授权
    # rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-2.el7.noarch.rpm  \\ 最新版本 yum 源
    # yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-get
    # vim /usr/share/doc/zabbix-server-mysql-4.2.6/create.sql.gz
        USE zabbix;                                                         \\ 如果导入不成功需要在首行加入
    # zcat create.sql.gz | mysql -uzabbix -p123456                           \\ zabbix数据文件导入到数据库
    # vim /etc/zabbix/zabbix_server.conf     \\ 主 配置文件
        DBUser=zbbbix                         \\ 需要改   数据库用户名
        DBPassword=123456                      \\ 需要改  数据库密码
        DBSocket=/var/lib/mysql/mysql.sock      \\ 连接mysql时基于本地数据需要改 可以到mysql配置文件中查看 
                                                 \\ socket文件位置 数据库不在本地不需要修改 最好使用此目录避免出现更多报错 
    # setenforce 0
    # systemctl restart zabbix-server.service      \\ 启动 注意要先启动数据库 3306 和httpd或nginx 80 
    # ss -tnl                                       \\ 10051被监听
    # vim /etc/php.ini                               \\ 需要修改php里面的时区
        max_execution_time = 300
        max_input_time = 300
        post_max_size = 16M
        date.timezone = Asia/Shanghai
        always_populate_raw_post_data = -1      \\ 解决 php PHP option "always_populate_raw_post_data"
    /var/log/zabbix/zabbix_server.log            \\ 日志文件保存位置
    注 1 启动不起来 注意日志文件 如果提示找不到mysql.sock 首先关闭selinux lsof -c mysqld | grep sock$ 使用此命令可以查看
       2 安装完zabbix后 会安装mariadb-lib 会和编译安装的mariadb冲突 把/etc/my.cnf 删除或者替换就可以
       3 把mysql.sock目录设在/var/lib/mysql/mysql.sock可在my.cnf修改。要给此目777权限和mysql的属组权限,否则mysql启动不了
         使用 ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock 建立软连接 否则安全初始化会提示找不到/tmp/mysql.sock文件,权限
       4 网页配置的时候出现报错mysql.sock报错 上面没设置正确 可以吧localhost修改成127.0.0.1 临时解决
       5 # vim /etc/httpd/conf.d/zabbix.conf         \\ 会在此目录 生成 zabbix.conf
            php_value date.timezone Asia/Shanghai     \\ 可以在此设置时区
       6 修改中文后 图片乱码问题
            # rpm -ql zabbix-web | grep fonts
            # cd /usr/share/zabbix/fonts                     \\ 复制Windows 上的字体 到 此目录下面
            # vim /usr/share/zabbix/include/defines.inc.php   \\ 修改文件中的字体配置 指明字体名字
                define('ZBX_GRAPH_FONT_NAME',   'msyhbd'); // font file name \\ graphfont替换成msyhbd(复制过去的字体名字) 
       7 解决zabbix 识别成其他数据库 之后重启httpd和zabbix
            # yum install php-mysql
            /etc/zabbix/web/zabbix.conf.php      \\ 可修改数据库密码等
                admin
                zabbix   \\ 默认用户名密码
       8 以上安装是基于httpd yum安装即可
            # zabbix_server -V                   \\ 查看 Zabbix 服务器版本
            # zabbix_agentd -V                    \\ 查看 Zabbix 客户端版本


zabbix 本机agent端
    # vim /etc/zabbix/zabbix_agentd.conf    \\ 主配置文件  上面已有安装 agent端的源及文件
        Server=127.0.0.1,192.168.10.13       \\ 允许哪些ip来获取信息 server端可以有多个  授权ip地址
        ServerActive=127.0.0.1,192.168.10.13  \\ 主动发起请求同时个服务器
        Hostname=teo5.com                      \\ 最好dns解析后的主机名
        EnableRemoteCommands=1                  \\ 允许远程命令
        LogRemoteCommands=1                      \\ 远程命令的日志
    # systemctl restart zabbix-agent.service
    # ss -tnl                                      \\ 10051端口被监控


纯agent端
    # rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-2.el7.noarch.rpm
    # yum install zabbix-agent
    # vim /etc/zabbix/zabbix_agentd.conf
        Server=192.168.10.10
        ServerActive=192.168.10.10
        Hostname=192.168.10.15
        ListemIP=192.168.10.15               \\ 自动agent注册功能 需要添加到监听本机ip
    # systemctl restart zabbix-agent.service
    # systemctl status zabbix-agent.service
    # ss -tnl                                  \\ 10050端口被监控

    # tail /var/log/zabbix/zabbix_agentd.log     \\ 错误日志文件
    # iptables -A IN_public -d 192.168.10.15 -p tcp --dport 10050 -j ACCEPT   \\ 要在防火墙放行10050端口
    对于本地有rpm包的可以直接安装                    \\ --nogpgcheck 不做秘钥检查
        # yum --nogpgcheck localinstall zabbix-2.4.8-1.el7.x86_64.rpm zabbix-agent-2.4.8-1.el7.x86_64.rpm


zabbix-proxy    代理端 
    首先安装mariadb                      \\ 数据库与zabbix-proxy同一主机上
         mysql
         create database zabbix_proxy character set utf8;                          \\ 创建zabbix_proxy 表
         grant all privileges on zabbix.* to zabbix@'%' identified by '123456';     \\ 创建用户 及授权
    # rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-2.el7.noarch.rpm  \\ 最新版本 yum 源
    # yum install zabbix-agent zabbix-proxy-mysql
    # rpm -ql zabbix-proxy-mysql                  \\ 会显示文件目录 
    # cd /usr/share/doc/zabbix-proxy-mysql-4.2.7/
    # vim schema.sql.gz
        USE zabbix_proxy;                           \\ zabbix_proxy 是自己创建的数据库
    # zcat schema.sql.gz | mysql -uzabbix -p123456
    # vim /etc/zabbix/zabbix_proxy.conf
        Server=192.168.10.11                           \\ 要填写 服务器的ip
        Hostname=Zabbix proxy                           \\ 主机名
        LogFile=/var/log/zabbix/zabbix_proxy.log         \\ 日志目录
        DBHost=192.168.10.12                              \\ 数据库ip  一般为本机 不使用socket连接 适用
        DBName=zabbix_proxy                                \\ 数据库 的表名字
        DBUser=zabbix                                       \\ 数据库用户名
        DBPassword=123456                                    \\ 数据库密码
        HeartbeatFrequency=60                                 \\ 每隔多长时间 去探测一下服务器端的活动状态 默认为60秒
        ConfigFrequency=3600                                   \\ 每隔多长时间 去服务器拉取 和自己的相关配置 默认为3600秒
        DataSenderFrequency=1                                   \\ 每隔多少时间 向服务器送一次数据  默认为1s


zabbix 2.4 服务器端 安装需要替换的命令
    # rpm -Uvh https://repo.zabbix.com/zabbix/2.4/rhel/7/x86_64/zabbix-release-2.4-1.el7.noarch.rpm       \\ 2.4版本的源
    # yum install zabbix-server-mysql zabbix-get zabbix-web zabbix-web-mysql zabbix-agent zabbix-sender zabbix-server zabbix
    # yum clean all
    # cd /usr/share/doc/zabbix-server-mysql-2.4.8/create  \\ 此目录下会有三个表 需要导入到数据库 有顺序
    # mysql -uroot -p zabbix < schema.sql                  \\ 导入数据库
    # mysql -uroot -p zabbix < images.sql    
    # mysql -uroot -p zabbix < data.sql
        # mysql                                              \\ 会看到刚 导入的三个表
            show databases;
            use zabbix;
            show tables;








L2tp/ipsec vpn


L2tp/Ipsec 配置


L2tp/Ipsec vpn
     # modprobe ppp-compress-18 && echo yes         \\ 查看主机否支持pptp,返回结果为yes就表示通过
     # cat /dev/net/tun            \\ 返回结果为cat: /dev/net/tun: File descriptor in bad state。就表示通过。
     # yum install epel-release     \\ epel源
     # yum install xl2tpd libreswan  \\ libreswan 提供ipsec  xl2tpd提供l2tp
     # vim /etc/xl2tpd/xl2tpd.conf    \\ l2tp 主配置文件  替换即可
        [global]
        port = 1701
        [lns default]
        ip range = 172.16.10.201-172.16.10.250
        local ip = 172.16.10.254
        require chap = yes
        refuse pap = yes
        require authentication = yes
        name = l2tpd
        pppoptfile = /etc/ppp/options.xl2tpd
        length bit = yes
     # vim /etc/ppp/options.xl2tpd      \\ 替换即可
        +mschap-v2
        ipcp-accept-local
        ipcp-accept-remote
        noccp
        auth
        mtu 1280
        mru 1280
        proxyarp
        lcp-echo-failure 4
        lcp-echo-interval 30
        connect-delay 5000
        ms-dns 8.8.8.8
        ms-dns 8.8.4.4
     # vim /etc/ipsec.conf  \\ ipsec主配置文件 此文件前面不能有空格 必须有缩进 注意格式 leftid是外网ip 替换即可
        version 2.0
        config setup
          virtual-private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!172.16.10.0/24,%v4:!172.16.10.0/24
          protostack=netkey
          interfaces=%defaultroute
          uniqueids=no
        conn shared
          left=%defaultroute
          leftid=47.91.219.64
          right=%any
          encapsulation=yes
          authby=secret
          pfs=no
          rekey=no
          keyingtries=5
          dpddelay=30
          dpdtimeout=120
          dpdaction=clear
          ikev2=never
          ike=aes256-sha2,aes128-sha2,aes256-sha1,aes128-sha1,aes256-sha2;modp1024,aes128-sha1;modp1024
          phase2alg=aes_gcm-null,aes128-sha1,aes256-sha1,aes256-sha2_512,aes128-sha2,aes256-sha2
          sha2-truncbug=no
        conn l2tp-psk
          auto=add
          leftprotoport=17/1701
          rightprotoport=17/%any
          type=transport
          phase2=esp
          also=shared
        conn xauth-psk
          auto=add
          leftsubnet=0.0.0.0/0
          rightaddresspool=172.16.10.201-172.16.10.250
          modecfgdns="8.8.8.8 8.8.4.4"
          leftxauthserver=yes
          rightxauthclient=yes
          leftmodecfgserver=yes
          rightmodecfgclient=yes
          modecfgpull=yes
          xauthby=file
          ike-frag=yes
          cisco-unity=yes
          also=shared
     # vim /etc/ppp/chap-secrets          \\ 密码文件
         admin * Teo@123 *
     # vim /etc/ipsec.secrets              \\ 秘钥文件
         %any  %any  : PSK "Teo@1234"
     # vim /etc/sysctl.conf            \\ 追加 注意网卡名字
         kernel.msgmnb = 65536
         kernel.msgmax = 65536
         kernel.shmmax = 68719476736
         kernel.shmall = 4294967296
         net.ipv4.ip_forward = 1
         net.ipv4.conf.all.accept_source_route = 0
         net.ipv4.conf.all.accept_redirects = 0
         net.ipv4.conf.all.send_redirects = 0
         net.ipv4.conf.all.rp_filter = 0
         net.ipv4.conf.default.accept_source_route = 0
         net.ipv4.conf.default.accept_redirects = 0
         net.ipv4.conf.default.send_redirects = 0
         net.ipv4.conf.default.rp_filter = 0
         net.ipv4.conf.ens33.send_redirects = 0
         net.ipv4.conf.ens33.rp_filter = 0
         net.ipv4.conf.virbr0.accept_redirects = 0
         net.ipv4.conf.virbr0.rp_filter = 0
         net.ipv4.conf.virbr0.send_redirects = 0
         net.ipv4.conf.virbr0-nic.accept_redirects = 0
         net.ipv4.conf.virbr0-nic.rp_filter = 0
         net.ipv4.conf.virbr0-nic.send_redirects = 0
         net.ipv4.conf.ip_vti0.accept_redirects = 0
         net.ipv4.conf.ip_vti0.rp_filter = 0
         net.ipv4.conf.ip_vti0.send_redirects = 0
         net.core.wmem_max = 12582912
         net.core.rmem_max = 12582912
         net.ipv4.tcp_rmem = 10240 87380 12582912
         net.ipv4.tcp_wmem = 10240 87380 12582912
     # sysctl -p
     # systemctl restart ipsec                   \\ 500 4500 udp端口被监控 需要放行 否则手机端连接不上
     # systemctl restart xl2tpd                   \\ 1701 udp端口被监控
     # systemctl enable ipsec
     # systemctl enable xl2tpd
     # ipsec verify
     # iptables -I INPUT 4 -m state --state NEW -p udp --dport 1701 -j ACCEPT
     # iptables -I FORWARD -s 172.16.10.0/24 -j ACCEPT
     # iptables -I FORWARD -d 172.16.10.0/24 -j ACCEPT
     # iptables -t nat -I POSTROUTING -s 172.16.10.0/24 -o ens33 -j MASQUERADE   \\ 注意 网卡名字


注:
     1 Windows 连接 l2tp/ipsec 需要修改注册表 保存.reg导入即可 需重启电脑
         Windows Registry Editor Version 5.00

         [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\RasMan\Parameters]
         "ProhibitIpSec"=dword:00000001
         [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent]
         "AssumeUDPEncapsulationContextOnSendRule"=dword:00000002


     2 如使用firewalld防火墙 可关闭 换成iptables 命令如下
         # systemctl disable firewalld.service      \\ 关闭firewalld 开机启动
         # systemctl stop firewalld.service          \\ 停止服务  停止后iptables会被清空
         # yum install iptables-services              \\ 安装iptables防火墙
         # systemctl restart iptables
         # iptables-restore < /data/iptables.bak        \\ 导入已保存的 iptables规则文件
         # systemctl enable iptables                     \\ 开机启动


     3 日志文件位置
           # tail /var/log/message