用13台虚拟机搭建一个高可用负载均衡集群架构出来,并运行三个站点,具体需求如下:
1 设计你认为合理的架构,用visio把架构图画出来
2 搭建lnmp、tomcat+jdk环境
3 三个站点分别为:discuz论坛、dedecms企业网站以及zrlog博客
4 由于机器有限,尽可能地把三个站点放到同一台服务器上,然后做负载均衡集群,要求所有站点域名解析到一个ip上,也就是说只有一个出口ip
5 需要共享静态文件,比如discuz需要共享的目录是 data/attachment,dedecms需要共享upload(具体目录,你可以先上传一个图片,查看图片所在目录)
6 设计合理的目录、文件权限,比如discuz的data目录需要给php-fpm进程用户可写权限,其他目录不用写的就不要给写权限(目录755,文件644,属主属组root)
7 所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo
8 给所有服务器做一个简单的命令审计功能
9 php-fpm服务要求设置慢执行日志,超时时间为2s,并做日志切割,日志保留一月
10 所有站点都需要配置访问日志,并做日志切割,要求静态文件日志不做记录,日志保留一月
11 制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器
12 制定代码、静态文件的备份方案,并写备份脚本,要求把备份数据传输到备份服务器
13 编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据
14 搭建zabbix监控告警系统,要求监控各个基础指标(cpu、内存、硬盘),网卡流量需要成图,还需要监控web站点的可用性,
15 定制自定义监控脚本,监控web服务器的并发连接数,接入zabbix,成图,设置触发器,超过100告警
16 定制自定义监控脚本,监控mysql的队列,接入zabbix,成图,设置触发器,队列超过300告警
17 定制自定义监控脚本,监控mysql的慢查询日志,接入zabbix,成图,设置触发器,每分钟超过60条日志需要告警,需要仔细分析慢查询日志的规律,确定日志条数
18 利用jmx,在zabbix上监控tomcat
19 给三个站点的后台访问做二次认证,增加安全性
20 用shell脚本实现文件、代码同步上线(参考分发系统)
注意:阿里云不支持自己搭建Keepalived和LVS ,因为无法绑定vip
可以简单把需求分为以下几部分:
第一部分 架构绘图+基础
1 设计你认为合理的架构,用visio把架构图画出来
7 所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo
8 给所有服务器做一个简单的命令审计功能
第二部分 web
2 搭建lnmp、tomcat+jdk环境
3 三个站点分别为:discuz论坛、dedecms企业网站以及zrlog博客
4 由于机器有限,尽可能地把三个站点放到同一台服务器上,然后做负载均衡集群,要求所有站点域名解析到一个ip上,也就是说只有一个出口ip
5 需要共享静态文件,比如discuz需要共享的目录是 data/attachment,dedecms需要共享upload(具体目录,你可以先上传一个图片,查看图片所在目录)
6 设计合理的目录、文件权限,比如discuz的data目录需要给php-fpm进程用户可写权限,其他目录不用写的就不要给写权限(目录755,文件644,属主属组root)
9 php-fpm服务要求设置慢执行日志,超时时间为2s,并做日志切割,日志保留一月
10 所有站点都需要配置访问日志,并做日志切割,要求静态文件日志不做记录,日志保留一月
19 给三个站点的后台访问做二次认证,增加安全性
第三部分 数据同步、备份与恢复
11 制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器
12 制定代码、静态文件的备份方案,并写备份脚本,要求把备份数据传输到备份服务器
13 编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据
20 用shell脚本实现文件、代码同步上线(参考分发系统)
第四部分 监控
14 搭建zabbix监控告警系统,要求监控各个基础指标(cpu、内存、硬盘),网卡流量需要成图,还需要监控web站点的可用性,
15 定制自定义监控脚本,监控web服务器的并发连接数,接入zabbix,成图,设置触发器,超过100告警
16 定制自定义监控脚本,监控mysql的队列,接入zabbix,成图,设置触发器,队列超过300告警
17 定制自定义监控脚本,监控mysql的慢查询日志,接入zabbix,成图,设置触发器,每分钟超过60条日志需要告警,需要仔细分析慢查询日志的规律,确定日志条数
18 利用jmx,在zabbix上监控tomcat
前期准备:
1. 架构图
2. 角色分配及主机名、IP配置
192.168.239.100 VIP
nginx1: 192.168.239.101 keepalived+Nginx主机1(主)
nginx2: 192.168.239.102 keepalived+Nginx主机2(备)
web1: 192.168.239.103 web服务器1(lnmp+tomcat,jdk)
web2: 192.168.239.104 web服务器2(lnmp+tomcat,jdk)
web3: 192.168.239.105 web服务器3(lnmp+tomcat,jdk)
web4: 192.168.239.106 web服务器4(lnmp+tomcat,jdk)
web5: 192.168.239.107 web服务器5(lnmp+tomcat,jdk)
mycat: 192.168.239.108 Mycat读写分离调度器+备份服务器
dir: 192.168.239.109 mysql主从配置 主服务器
rs1: 192.168.239.110 mysql主从配置 从服务器1
rs2: 192.168.239.111 mysql主从配置 从服务器2
zabbix: 192.168.239.112 Zabbix服务器
NFS: 192.168.239.113 NFS服务器
所有服务器用户:root
密码:110120119
实验过程:(使用root用户)
1. 批量安装mysql(批量远程执行命令),一定要关闭防火墙和selinux
① 在nginx1主机上安装expect
[root@nginx1 ~]# yum install -y expect
② 新建ip.txt文件,存放服务器IP
[root@nginx1 sbin]#cd /usr/local/sbin
[root@nginx1 sbin]# vim ip.txt
192.168.239.101
192.168.239.102
192.168.239.103
192.168.239.104
192.168.239.105
192.168.239.106
192.168.239.107
192.168.239.108
192.168.239.109
192.168.239.110
192.168.239.111
192.168.239.112
192.168.239.113
③写一个通用的可以批量远程执行命令的expect脚本
[root@nginx1 sbin]# vim mysql.expect
#!/usr/bin/expect
set host [lindex $argv 0]
set passwd "110120119"
set cm [lindex $argv 1] #需要执行的命令
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"
interact
[root@nginx1 sbin]# chmod +x mysql.expect #增加执行权限
④ 创建 mysql.sh调用脚本文件
[root@nginx1 sbin]# vim mysql.sh
#!/bin/bash
for ip in `cat ip.txt`
do
./mysql.expect "$ip" "yum -y install expect vim-enhanced epel-release libmcrypt-devel libmcrypt wget perl-Module-Install.noarch libaio*; cd /usr/local/src/; wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz; tar -zxvf mysql-5.6.41-linux-glibc2.12-x86_64.tar.gz; mv mysql-5.6.41-linux-glibc2.12-x86_64 /usr/local/mysql; cd /usr/local/mysql; mkdir /data/; useradd mysql; ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql; echo $? > /root/downloadMySQL.log"
done
[root@nginx1 sbin]# chmod +x mysql.sh
⑤ 执行脚本
[root@nginx1 sbin]#./mysql.sh
2. 配置主从
2.1 配置主
① 拷贝、编辑配置文件
[root@dir ~]# cd /data/mysql
[root@dir mysql]# pwd
/data/mysql
[root@dir mysql]# cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"? y
[root@dir mysql]# vim /etc/my.cnf
[mysqld] 模块下增加以下内容:
datadir = /data/mysql
server_id = 109 #由Ip设置
log_bin = aming01
socket = /tmp/mysql.sock
② 拷贝、配置启动脚本文件
[root@dir mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@dir mysql]# vim /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/data/mysql
③ 重启mysqld服务
[root@dir mysql]# /etc/init.d/mysqld restart
④ 为了方便操作mysql,可以将mysql命令所在的路径加入环境变量(不加入需要使用绝对路径)
export PATH=$PATH:/usr/local/mysql/bin/mysql //将mysql命令所在的路径加入环境变量
想要永久生效,把命令放到配置文件/etc/profile中:
[root@dir mysql]# vim /etc/profile
[root@dir mysql]# source /etc/profile
问题:但是加入环境变量后还是显示未找到命令:
[root@dir mysql]# mysql -uroot
-bash: mysql: 未找到命令
解决方法:
原因:这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,当然会找不到命令,我们需要做的就是映射一个链接到/usr/bin目录下,相当于建立一个链接文件。
首先得知道mysql命令或mysqladmin命令的完整路径,比如mysql的路径是:/usr/local/mysql/bin/mysql,我们则可以这样执行命令:
# ln -s /usr/local/mysql/bin/mysql /usr/bin
再运行mysql就正常了。
为后续操作方便,把mysqladmin、mysqldump也添加到配置文件/etc/profile中,并设置软链接:
export PATH=$PATH:/usr/local/mysql/bin/mysqladmin
export PATH=$PATH:/usr/local/mysql/bin/mysqldump
[root@dir mysql]# ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
[root@dir mysql]# ln -s /usr/local/mysql/bin/mysqldump /usr/bin
⑤ 登录mysql,设置密码
[root@dir mysql]# mysqladmin -uroot password '123456'
2.2 配置两台主从服务器的从服务器
①拷贝、编辑配置文件和启动脚本文件
[root@rs1 ~]# cd /data/mysql
[root@rs1 mysql]# pwd
/data/mysql
[root@rs1 mysql]# cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
[root@rs1 mysql]# vim /etc/my.cnf
[mysqld] 模块下增加以下内容:
datadir = /data/mysql
server_id = 110 #由Ip设置
socket = /tmp/mysql.sock
[root@rs1 mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@rs1 mysql]# vim /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/data/mysql
②为了方便操作mysql,可以将mysql命令所在的路径加入环境变量(不加入需要使用绝对路径)
[root@rs1 mysql]# vim /etc/profile
export PATH=$PATH:/usr/local/mysql/bin/mysql
export PATH=$PATH:/usr/local/mysql/bin/mysqladmin
export PATH=$PATH:/usr/local/mysql/bin/mysqldump
[root@rs1 mysql]# ln -s /usr/local/mysql/bin/mysql /usr/bin
[root@rs1 mysql]# ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
[root@rs1 mysql]# ln -s /usr/local/mysql/bin/mysqldump /usr/bin
[root@rs1 mysql]# source /etc/profile
③ 启动mysqld服务
[root@rs1 mysql]# /etc/init.d/mysqld restart
④ 登录mysql,设置密码
[root@rs1 mysql]# mysqladmin -uroot password '123456'
真机rs1和rs2配置相同,注意server_id是根据IP设置的,可以自定义,但不能一样。
2.3 主从测试
① 登录master上的mysql,为两台slave添加一个同步账号:
[root@dir mysql]# mysql -uroot -p'123456'
mysql> grant replication slave on *.* to 'repl'@'192.168.239.110' identified by '123456';
mysql> grant replication slave on *.* to 'repl'@'192.168.239.111' identified by '123456';
② 锁表,并查看状态
mysql> flush tables with read lock;
mysql> show master status;
③ 登录两台slave的mysql的root用户,分别执行以下命令
[root@rs1 mysql]# mysql -uroot -p'123456'
mysql> stop slave;
mysql> change master to master_host='192.168.239.109', master_user='repl', master_password='123456', master_log_file='aming01.000002', master_log_pos=686;
mysql> start slave;
④ 查看两台slave的主从状态是否正常,Slave_IO_Running和 Slave_SQL_Running要为yes:
mysql> show slave status\G
#下面两行要为yes,说明主从同步成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
⑤ 回到master 192.168.239.109机器上解锁表,并创建库test007,看能不能同步
mysql> unlock tables;
mysql> create database test007;
mysql> show databases;
到两台从服务器上mysql> show databases;看是否同步了新建的库。
3. 在192.168.239.108上搭建Mycat服务器
3.1 因为Mycat是Java开发的,所以在安装Mycat之前得先安装好jdk环境。
① 下载并安装jdk
官网下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下载jdk到windows下,然后再使用 rz 或者FPT等工具上传到Linux服务器上(下载版本8)
解压jdk包:
[root@mycat src]# tar zxvf jdk-8u191-linux-x64.tar.gz
移动jdk包到/usr/local/下,改名为jdk1.8
[root@mycat src]# mv jdk1.8.0_191 /usr/local/jdk1.8
② 配置JDK环境变量
[root@mycat src]# vim /etc/profile
文件内容末尾添加:
JAVA_HOME=/usr/local/jdk1.8/
JAVA_BIN=$JAVA_HOME/bin
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/jre/lib/charsets.jar
[root@mycat src]# source /etc/profile //使配置生效
③ 测试jdk环境是否生效
[root@mycat src]# java -version //使用java -version命令查看jdk版本,验证jdk是否安装成功
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
3.2 下载安装、配置Mycat
参考:http://note.youdao.com/noteshare?id=6986c10859a2fd11e6d992f07b48fe15&sub=C8261B934F234E6C856B5943BFC71BC8
① 官网下载地址:http://dl.mycat.io/1.6-RELEASE/
[root@mycat src]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
解压mycat包:
[root@mycat src]# tar zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
把mycat包移动到/usr/local/mycat下:
[root@mycat src]# mv ./mycat /usr/local/mycat
[root@mycat src]# cp -r /usr/local/jdk1.8 /usr/local/mycat/
[root@mycat mycat]# useradd mycat
[root@mycat mycat]# chown -R mycat.mycat /usr/local/mycat
[root@mycat mycat]# passwd mycat #设置密码123456
vi /etc/profile ##在系统环境变量文件中增加 MYCAT_HOME=/usr/local/mycat
source /etc/profile
vim /usr/local/mycat/conf/wrapper.conf
修改wrapper.Java.command=java为
wrapper.java.command=/usr/local/mycat/jdk1.8/bin/java
[root@mycat src]# ls /usr/local/mycat/
② 编辑配置文件 /usr/local/mycat/conf/server.xml 在最后的 标签之前添加以下内容
[root@mycat src]# vim /usr/local/mycat/conf/server.xml
# mycat用户对逻辑数据库ultrax,DedeCMS,zrlog具有增删改查的权限
# discuz用户对逻辑数据库ultrax具有增删改查的权限
# dedecms用户对逻辑数据库DedeCMS具有增删改查的权限
# zrlog用户对逻辑数据库zrlog具有增删改查的权限
# 该用户对逻辑数据库ultrax,DedeCMS,zrlog仅有只读的权限
# 创建以上这些用户是用于连接mycat中间件
③ 修改mycat逻辑库定义和表及分片定义的配置文件schema.xml
[root@mycat src]# cp /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak
# 备份/usr/local/mycat/conf/schema.xml配置文件
编辑配置文件/usr/local/mycat/conf/schema.xml,清空全部内容后添加以下内容 :
[root@mycat src]# vim /usr/local/mycat/conf/schema.xml
schema.xml配置文件详解:
xml文件格式;
文件标签属性;
配置逻辑库,与server.xml指定库名保持一致,绑定数据节点dn1;
添加数据节点dn1,设置数据节点host名称,同时设置数据节点真实database为discuz;
数据节点主机,绑定数据节点,设置连接数及均衡方式、切换方法、驱动程序、连接方法;
Balance均衡策略设置:
1) balance=0 不开启读写分离机制,所有读操作都发送到当前可用writehost;
2) balance=1 全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡
3) balance=2 所有读操作都随机的在readhost和writehost上分发;
4) balance=3 所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力。
writeType 写入策略设置
1) writeType=0, 所有写操作发送到配置的第一个writeHost;
2) writeType=1,所有写操作都随机的发送到配置的writeHost;
3) writeType=2,不执行写操作。
switchType 策略设置
1) switchType=-1,表示不自动切换;
2) switchType=1,默认值,自动切换;
3) switchType=2,基于MySQL 主从同步的状态决定是否切换;
4) switchType=3,基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。
检测后端MYSQL实例,SQL语句;
指定读写请求,同时转发至后端MYSQL真实服务器,配置连接后端MYSQL用户名和密码(该用户名和密码为MYSQL数据库用户名和密码);
数据主机标签;
mycat结束标签;
④ 在192.168.236.109主从服务器主服务器的主机上使用mysql命令行创建库,授权对应的用户
[root@dir mysql]# mysql -uroot -p'123456'
mysql> create database ultrax;
mysql> create database dedecms;
mysql> create database zrlog;
mysql> create database zabbix;
mysql> grant all on *.* to 'mycat'@'192.168.239.108' identified by '123456';
mysql> grant all on ultrax.* to 'discuz'@'192.168.239.%' identified by '123456';
mysql> grant all on dedecms.* to 'dedecms'@'192.168.239.%' identified by '123456';
mysql> grant all on zrlog.* to 'zrlog'@'192.168.239.%' identified by '123456';
mysql> grant all on zabbix.* to 'zabbix'@'192.168.239.%' identified by '123456';
⑤ mycat配置完毕。在mycat主机上启动mycat并查看端口8066和9066端口是否起来
[root@mycat mysql]# /usr/local/mycat/bin/mycat start
[root@mycat mysql]# netstat -lntp
注意:如果没有这两个端口没有启动,查看java环境是否生效。
# 8066是用于web连接mycat.
# 9066是用于SA|DBA管理端口.
⑥ 回到master上,通过mycat机器的IP和8066端口连接mysql:
[root@dir mysql]# mysql -h'192.168.239.108' -udiscuz -p'123456' -P'8066'
mysql> show databases;
+----------+
| DATABASE |
+----------+
| ultrax |
+----------+
1 row in set (0.01 sec)
使用root用户登录看看是否能查看到所有的数据库:
[root@dir mysql]# mysql -h'192.168.239.108' -uroot -p'123456' -P'8066'
mysql> show databases;
+----------+
| DATABASE |
+----------+
| DedeCMS |
| ultrax |
| zrlog |
+----------+
3 rows in set (0.00 sec)
然后以9066端口登陆查看数据源:
[root@dir mysql]# mysql -h'192.168.239.108' -uroot -p'123456' -P'9066'
mysql> show @@datasource;
4. MySQL 备份恢复策略
4.1 备份策略
Mysql备份使用xtrabackup工具
每周日执行一次全量备份。
每周一到周六执行增量备份。
4.2 备份脚本:
#!/bin/bash
#获取当天是周几
week=`date +%w`
#全量备份目录
full_dir=/data/backup/mysql/xfull/
#增量备份目录
inc_dir=/data/backup/mysql/inc/
if [ $week -eq 0 ] || ! `ls $full_dir | grep -q '.'`
then
#如果是周日,或者全量备份目录为空,执行全量备份
innobackupex --default-file=/etc/my.cnf --user=root --password=123456 /data/backup/mysql/xfull
exit
elif [ $week -eq 1 ] || ! `ls $inc_dir | grep -q '.'`
then
#如果是周一,或者增量备份目录为空,获取前一次全量备份的目录,进行增量备份
last_dir=`ls -ltr $full_dir|tail -1`
innobackupex --default-file=/etc/my.cnf --user=root --password=123456 --incemental $inc_dir --incremental-basedir=$full_dir
exit
else
#周二到周六,获取最后一次增量备份目录,然后基于上一次增量备份再次增量备份
last_dir=`ls -ltr $inc_dir|tail -1`
innobackupex --default-file=/etc/my.cnf --user=root --password=123456 --incemental $inc_dir --incremental-basedir=$last_dir
fi
4.3 恢复方案:
# 恢复前需要执行apply-log 应用未提交的事物,确保数据的一致性
# 第一步:应用全量备份 , 最后面是全量备份的路径
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log --redo-only /data/backup/mysql/xfull/2019-01-19_15-00-42/
# 第二步,应用所有增量备份,-,一次只能指定一个增量备份,并且必须按照先后顺序执行
# -incremental-dir指定增量备份的路径
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log --redo-only /data/backup/mysql/xfull/2019-01-19_15-00-42/ --incremental-dir=/data/backup/mysql/inc/2018-08-16_15-38-45
# 第三步,执行完整数据恢复
innobackupex --defaluts-file=/etc/my.cnf --user=root --password=123456 --copy-back /data/backup/mysql/xfull/2019-01-19_15-00-42/
# 第四步,恢复后修改datadir的属主和属组
chown mysql.mysql /data/mysql -R
# 第五步,将最后应用了增量备份的全量备份同步到mysql从服务器上,恢复后配置主从关系
完成以上操作后主从复制和读写分离就弄好了,接下来就是搭建web服务器,然后进行对接即可。
一、 高可用负载均衡配置 nginx+keepalived
1. 说明
1.1 概述
本文档用于搭建 高可用的负载均衡
使用 Nginx 实现负载均衡
使用 Keepalived 实现高可用
1.2 系统说明
配置环境:
角色: IP 主机名 操作系统 软件版本
VIP 192.168.239.100
Master 192.168.239.101 nginx1 CentOS7 Nginx-1.12 + Keepalived
Backup 192.168.239.102 nginx2 CentOS7 Nginx-1.12 + Keepalived
1.3 关闭防火墙、selinux
2. 配置nginx+keepalived
2.1 master和backup上都安装nginx
① 下载安装、配置
[root@nginx1 ~]# cd /usr/local/src
[root@nginx1 src]# wget http://nginx.org/download/nginx-1.14.2.tar.gz
[root@nginx1 src]# tar zxvf nginx-1.14.2.tar.gz
新建nginx服务用户:
[root@nginx1 src]# useradd nginx -r -s /sbin/nologin
安装可能需要的依赖包:
[root@nginx1 src]# yum -y install pcre.x86_64 pcre-devel.x86_64 openssl openssl-devel
进入包目录、配置、编译、安装:
[root@nginx1 src]# cd ./nginx-1.14.2
[root@nginx1 nginx-1.14.2]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module;make && make install
② 编辑配置文件:
[root@nginx1 nginx-1.14.2]# cd /usr/local/nginx/conf
[root@nginx1 conf]# mv nginx.conf nginx.conf.1
[root@nginx1 conf]# vim nginx.conf #不使用自带配置模板,把原模板修改名称后,新建一个
添加内容(参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/nginx.conf)
测试:
[root@nginx1 conf]# /usr/local/nginx/sbin/nginx -t
③ 编辑启动脚本
[root@nginx1 conf]# cd /usr/local/src/nginx-1.14.2
[root@nginx1 nginx-1.14.2]# vim /etc/init.d/nginx
添加内容(参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/etc_init.d_nginx )
修改启动脚本权限为755;设为开机启动;
[root@nginx1 nginx-1.14.2]# chmod 755 /etc/init.d/nginx
[root@nginx1 nginx-1.14.2]# chkconfig --add nginx
[root@nginx1 nginx-1.14.2]# chkconfig nginx on
[root@nginx1 nginx-1.14.2]# chkconfig --list
④ 启动nginx,查看监听端口
[root@nginx1 nginx-1.14.2]# /etc/init.d/nginx start
[root@nginx1 nginx-1.14.2]# netstat -lntp
⑤ 测试
[root@nginx2 nginx-1.14.2]# curl 127.0.0.1
浏览器:
2.2 安装keepalived
# yum install -y keepalived
① 编辑keepalived配置文件 vim /etc/keepalived/keepalived.conf
内容参考:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/lvs_keepalived.conf
#vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass wenyang>com
}
virtual_ipaddress {
192.168.239.100 #VIP
}
track_script {
chk_nginx
}
}
② 新建监控脚本
[root@nginx1 ~]# vim /usr/local/sbin/check_ng.sh
内容参考:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_check_ng.sh
给脚本赋予755权限,执行脚本
[root@nginx1 ~]# chmod 755 /usr/local/sbin/check_ng.sh
③ 启动keepalived
[root@nginx1 conf]# systemctl start keepalived
[root@nginx1 conf]# ps -ef | grep keep
④ 安装好之后新增一个nginx虚拟主机配置文件(两台都要配置)
[root@nginx1 conf]# vim /usr/local/nginx/conf/vhost/proxy.conf
upstream lb
{
ip_hash;
server 192.168.239.103:80;
server 192.168.239.104:80;
server 192.168.239.105:80;
server 192.168.239.106:80;
server 192.168.239.107:80;
}
server
{
listen 80;
server_name ww.discuz.com www.dedecms.com www.zrlog.com;
location /
{
proxy_pass http://lb;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
二、搭建基于 LNMP 和 JAVA 环境的服务
-- 本文档将搭建基于 LNMP 环境的 discuz 论坛, dedecms 企业网站
安装
yum -y install epel-release
yum -y install nginx
配置nginx
准备安装目录
mkdir /opt/{app,src}
下载
wget -O /opt/src/mysql-5.7.tar.gz https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.7/mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
tar -zxf /opt/src/mysql-5.7.tar.gz -C /opt/app
mv /opt/app/mysql-5.7.23-linux-glibc2.12-x86_64/ /opt/app/mysql57
准备配置文件
vim /etc/my.cnf
[mysqld]
user = mysql
bind_address = 127.0.0.1
port = 3306
basedir = /opt/app/mysql57/
datadir = /opt/app/mysql57/data/data
tmpdir = /opt/app/mysql57/data/tmp
socket = /opt/app/mysql57/data/logs/mysql.sock
pid-file = /opt/app/mysql57/data/logs/mysqld.pid
log_error = /opt/app/mysql57/data/logs/error_mysqld.log
character_set_server = utf8
## InnoDB
innodb_file_per_table = ON
innodb_file_format_check = ON
innodb_data_file_path = ibdata1:100M:autoextend
innodb_temp_file_path = ../tmp/ibtmp1:12M:autoextend
innodb_log_group_home_dir = /opt/app/mysql57/data/redolog/
innodb_undo_directory = /opt/app/mysql57/data/undolog/
log_bin = /opt/app/mysql57/data/binlog/mysql_bin
relay_log = /opt/app/mysql57/data/relaylog/relay_log
[client]
socket = /opt/app/mysql57/data/logs/mysql.sock
# 创建 MySQL 用户和用户组
groupadd -r mysql
useradd -M -g mysql -r -d /dev/null -s /sbin/nologin mysql
# 创建mysql 的 data 目录, 并赋权限
mkdir -p /opt/app/mysql57/data/{binlog,data,logs,redolog,tmp,undolog}
chown -R mysql:mysql /opt/app/mysql57/data/
ln -s /opt/app/mysql57/data/logs/mysql.sock /tmp/mysql.sock
# 初始化 mysql
./bin/mysqld --initialize
/opt/app/mysql57/bin/mysqld_safe --defaults-file=/etc/my.cnf
下载
wget -O /opt/src/php-5.6.tar.gz http://101.96.10.63/cn2.php.net/distributions/php-5.6.40.tar.gz
安装依赖程序
yum -y install libxml2-devel openssl-devel curl-devel libjpeg-devel freetype-devel gmp-devel libmcrypt-devel
源码编译安装 PHP
./configure --prefix=/opt/app/php56 --with-config-file-path=/opt/app/php56/etc --disable-ipv6 --enable-bcmath --enable-dba --enable-ftp --enable-mbstring --enable-sockets --enable-exif --enable-pcntl --enable-soap --enable-zip --with-curl --with-iconv --with-gettext --with-gd --with-gmp --with-freetype-dir --with-jpeg-dir --with-png-dir --with-mcrypt --with-mhash --with-openssl --with-tidy --with-zlib --with-mysqli=mysqlnd --with-mysql=/opt/app/mysql57/ --with-pdo-mysql=mysqlnd --enable-fpm
cp sapi/fpm/init.d.php-fpm /opt/app/php56/sbin/
chmod +x /opt/app/php56/sbin/init.d.php-fpm
php.ini
...
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /opt/app/php56/var/log/php_errors.log
...
+ `php-fpm.conf`
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;
;; the global prefix /opt/app/php56/
include=etc/php-fpm.d/*.conf
[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.error.log
log_level = notice
emergency_restart_threshold = 60
emergency_restart_interval = 60s
process_control_timeout = 10s
;process.max = 0
;daemonize = yes
rlimit_files = 65000
;rlimit_core = 0
events.mechanism = poll
[web]
user = nginx
group = nginx
;listen = 127.0.0.1:9000
listen = var/run/php_$pool.socket
listen.backlog = 4096
listen.mode = 0666
pm = dynamic
pm.max_children = 300
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 4000
pm.status_path = /phpstatus
access.format = %t %l - "%m %r%Q%q" - %s %f %{mili}d %{kilo}M %C%%
slowlog = var/log/php.slow.$pool.log
request_slowlog_timeout = 2
request_terminate_timeout = 60
rlimit_files = 10240
catch_workers_output = yes
下载jdk
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
wget -O /opt/src/jdk-8u201-linux-x64.tar.gz https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-linux-x64.tar.gz?AuthParam=1548039137_19e70267ff71b8421fa06c56911e8639
如果程序需要JDBC, 可以下载
https://dev.mysql.com/downloads/file/?id=480287
下载 tomcat
wget -O /opt/src/apache-tomcat-9.0.14.tar.gz http://mirrors.shu.edu.cn/apache/tomcat/tomcat-9/v9.0.14/bin/apache-tomcat-9.0.14.tar.gz
解压缩并安装配置
tar zxf jdk-8u131-linux-x64.tar.gz
cp -r jdk1.8.0_131/ /opt/app/jdk1.8
echo <<-EOF >> /etc/profile
export JAVA_HOME=/opt/app/jdk1.8
export CLASSPATH=${JAVA_HOME}/lib
export JRE_HOME=${JAVA_HOME}/jre
export PATH=${JAVALHOME}/bin:$PATH
EOF
source /etc/profile
tar zxf /opt/src/apache-tomcat-9.0.14.tar.gz
cp -r /opt/src/apache-tomcat-9.0.14 /opt/app/tomcat
ln -s /opt/app/tomcat/*.sh /opt/bin
catalina.sh start
wget -O /opt/src/Discuz_X2.5_PHP7.0_SC_UTF8.zip http://download.comsenz.com/DiscuzX/2.5/Discuz_X2.5_PHP7.0_SC_UTF8.zip
unzip -d /opt/src/discuz /opt/src/Discuz_X2.5_PHP7.0_SC_UTF8.zip
cp /opt/src/discuz/upload /opt/www/
mkdir -p /opt/log/nginx
MySQL [(none)] > CREATE DATABASE ultrax;
MySQL [(none)] > GRANT ALL ON `ultrax`.* TO 'ultraxUser'@'localhost' IDENTIFIED BY 'ultraxPassword';
MySQL [(none)] > FLUSH PRIVILEGES;
编辑 discuz 配置文件
cp /opt/www/discuz/config/config_global_default.php /opt/www/discuz/config/config_global.php
cp /opt/www/discuz/config/config_ucenter_default.php /opt/www/discuz/config/config_ucenter.php
设置权限
chown nginx:nginx /opt/www/discuz/data/ /opt/www/discuz/config/ /opt/www/discuz/uc_client/data/ /opt/www/discuz/uc_server/data/
vim /etc/nginx/conf.d/server.conf
server {
listen 80;
server_name discuz.top;
root /opt/www/discuz;
index index.php;
# 配置静态文件不记录日志, 以及过期时间
location ~ .*\.(gif|jpeg|png|bmp|swf)$ {
expires 3d;
access_log off;
## 配置防盗链
valid_referers none blocked discuz.top www.discuz.top;
if ($invalid_referer) {
return 403;
}
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /opt/www/discuz/$fastcgi_script_name;
fastcgi_pass unix:/opt/app/php56/var/run/php_discuz.socket;
fastcgi_index index.php;
}
access_log /opt/log/nginx/discuz_access.log;
error_log /opt/log/nginx/discuz_error.log;
}
启动
systemctl start nginx
初始化站点
http://discuz.top/install
下载 dedecms
wget -O /opt/src/DedeCMS-V5.7-UTF8-SP2.tar.gz http://updatenew.dedecms.com/base-v57/package/DedeCMS-V5.7-UTF8-SP2.tar.gz
解压缩并安装
tar zxf /opt/src/DedeCMS-V5.7-UTF8-SP2.tar.gz
cp -r /opt/src/DedeCMS-V5.7-UTF8-SP2/uploads/ /opt/www/dedecms
chown -R nginx:nginx /opt/www/dedecms/
...
# dedecms
server {
listen 80;
server_name dedecms.top;
root /opt/www/dedecms;
index index.php;
# 配置静态文件不记录日志, 以及过期时间
location ~ .*\.(gif|jpeg|png|bmp|swf)$ {
expires 3d;
access_log off;
# 配置防盗链
valid_referers none blocked dedecms.top www.dedecms.top;
if ($invalid_referer) {
return 403;
}
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /opt/www/dedecms/$fastcgi_script_name;
fastcgi_pass unix:/opt/app/php56/var/run/php_web.socket;
fastcgi_index index.php;
}
access_log /opt/log/nginx/dedecms_access.log;
error_log /opt/log/nginx/dedecms_error.log;
}
...
MySQL [(none)] > GRANT ALL ON `dedecms`.* to 'dedecmsUser'@'localhost' IDENTIFIED BY 'dedecmsPassword';
MySQL [(none)] > FLUSH PRIVILEGES;
重启服务
systemctl restart nginx
init.d.php-fpm restart
初始化站点
http://dedecms.top/install
wget -O /opt/src/zrlog-2.1.0-3617b2e-release.war http://dl.zrlog.com/release/zrlog-2.1.0-3617b2e-release.war?attname=ROOT.war&ref=index
mkdir /opt/app/tomcat/myapps
cp /opt/src/ROOT.war /opt/app/tomcat/myapps/
vim /opt/app/tomcat/conf/server.xml
段的配置...
...
MySQL [(none)] > CREATE DATABASE zrlog;
MySQL [(none)] > GRANT ALL ON zrlog.* to 'zrlogUser'@127.0.0.1 IDENTIFIED BY 'zrlogPassword';
MySQL [(none)] > FLUSH PRIVILEGES;
catalina.sh stop ; catalina.sh start
http://192.168.239.103:8080/
/etc/logrotate.d/nginx
/opt/log/nginx/*log {
create 0644 nginx nginx
daily
rotate 30
missingok
notifempty
compress
sharedscripts
postrotate
/bin/kill -USR1 `cat /var/run/nginx.pid 2>/dev/null` 2> /dev/null || true
endscript
}
前面配置php 时, 已设置了 php的 error log, 以及 php-fpm errorlog 和 slow log 记录在 /opt/app/php56/var/log/
中.
编辑 logrotate 配置文件
/opt/app/php56/var/log/*log {
daily
rotate 30
missingok
notifempty
compress
sharedscripts
postrotate
kill -USR1 `cat /opt/app/php56/var/run/php-fpm.pid 2> /dev/null` 2> /dev/null || true
endscript
}
echo <<-EOF >> /var/spool/cron/root
01 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx
01 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/php
EOF
yum -y install httpd-tools
[root@node10013 nginx]# htpasswd -c /etc/nginx/passwd.db fangfc
New password:
Re-type new password:
Adding password for user fangfc
[root@node10013 nginx]#
location ~ admin\.php${}
需要在 location ~ \.php$ {}
段落其那面,location ~ admin\.php${}
段落内需要设置 php代理地址## discuz
server {
listen 80;
server_name discuz.top;
root /opt/www/discuz;
index index.php;
...
location ~ admin\.php$ {
auth_basic "User Authorize";
auth_basic_user_file /etc/nginx/passwd.db;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /opt/www/discuz/$fastcgi_script_name;
fastcgi_pass unix:/opt/app/php56/var/run/php_discuz.socket;
fastcgi_index index.php;
}
location ~ \.php$ {....}
....
}
# dedecms
server {
listen 80;
server_name dedecms.top;
root /opt/www/dedecms;
...
location /dede {
auth_basic "User Authorize";
auth_basic_user_file /etc/nginx/passwd.db;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /opt/www/dedecms/$fastcgi_script_name;
fastcgi_pass unix:/opt/app/php56/var/run/php_web.socket;
fastcgi_index index.php;
}
location ~ \.php$ { ... }
...
}
三、NFS_搭建LNMP共享目录
角色: IP 主机名 操作系统 软件版本
NFS 192.168.239.113 nfs CentOS7 nfs1.3 + rpcbind-0.2.0
yum -y install nfs-utils rpcbind
# 创建共享目录
mkdir -p /data/share/
# 赋权
chmod 777 /data/share/
# 设置nfs 配置文件
cat <<-EOF >> /etc/exports
/data/share 192.168.239.*(rw,no_root_squash,no_all_squash,sync)
EOF
systemctl restart rpcbind
systemctl enable rpcbind
systemctl restart nfs
systemctl enable nfs
yum -y install nfs-utils
# 查看nfs 服务
showmount 192.168.239.113
# 挂载
mount -t nfs 192.168.239.113:data/share /data/ -o proto=tcp -o nolock
# 查看
df -h
# 开机自动挂载
cat <<-EOF >> /etc/fstab
192.168.239.113:/data/share /data nfs default 0 0
EOF
# 再挂载的 目录中创建文件夹
mkdir -p /data/discuz/data
# 拷贝源目录到本地挂载的 nfs中.
cp -r /opt/www/discuz/data/attachment/ /data/discuz/data/
# 修改目录权限
chown -R nginx:nginx /data/discuz/data/
# 本地挂载 共享目录 覆盖源目录
mount --bind /data/discuz/data/attachment/ /opt/www/discuz/data/attachment/
# 挂载目录
cat <<-EOF >> /etc/rc.d/rc.local
mount --bind /data/discuz/data/attachment/ /opt/www/discuz/data/attachment/
EOF
001.png
[root@node10013 data]# ll /data/discuz/data/attachment/forum/201901/22/
total 20
-rw-r--r-- 1 nginx nginx 19327 Jan 22 11:21 112149ns4c8c7a7i35j431.png
-rw-r--r-- 1 nginx nginx 0 Jan 22 11:21 index.html
[root@node10013 data]#
# 挂载目录
mkdir /data/dedecms
# 拷贝源目录
cp -r /opt/www/dedecms/uploads/ /data/dedecms/
# 设置权限
chown -R nginx:nginx /data/dedecms/uploads/
# 挂载 共享目录到源目录
mount --bind /data/dedecms/uploads/ /opt/www/dedecms/uploads/
cat <<-EOF >> /etc/rc.d/rc.local
mount --bind /data/dedecms/uploads/ /opt/www/dedecms/uploads/
EOF
第四部分 监控
wget http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
下载完之后,安装rpm包(实际上就是安装了一个yum源仓库)
[root@harry-01 ~]# rpm -ivh zabbix-release-3.2-1.el7.noarch.rpm
警告:zabbix-release-3.2-1.el7.noarch.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID a14fe591: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zabbix-release-3.2-1.el7 ################################# [100%]
[root@harry-01 ~]# rpm -ivh zabbix-release-3.2-1.el7.noarch.rpm
再有了这个zabbix.repo源之后,就可以yum安装zabbix了,并安装下面的包
# yum install -y zabbix-agent zabbix-get zabbix-server-mysql zabbix-web zabbix-web-mysql
修改mysql的配置文件,修改/etc/my.cnf文件,设定默认的字符集
[root@harry-01 ~]# vim /etc/my.cnf
在[mysqld]下添加字符集
character_set_server = utf8
保存退出
修改完mysql的配置文件后,重启mysql服务,进入mysql命令行,创建zabbix库,并指定编码为utf8
[root@harry-01 ~]# mysql -uroot -p
Enter password:
mysql> create database zabbix character set utf8;
Query OK, 1 row affected (0.00 sec)
mysql>
创建用户
mysql> grant all on zabbix.* to 'zabbix'@'127.0.0.1' identified by 'zabbix';
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
[root@harry-01 ~]#
退出mysql的命令行后,导入原始的数据
[root@harry-01 ~]# cd /usr/share/doc/zabbix-server-mysql-3.2.11/
[root@harry-01 zabbix-server-mysql-3.2.11]# ls
AUTHORS ChangeLog COPYING create.sql.gz NEWS README
[root@harry-01 zabbix-server-mysql-3.2.11]# gzip -d create.sql.gz
[root@harry-01 zabbix-server-mysql-3.2.11]# ls
AUTHORS ChangeLog COPYING create.sql NEWS README
[root@harry-01 zabbix-server-mysql-3.2.11]#
#然后拿到create.sql文件,将它导入到zabbix库里面去
[root@harry-01 zabbix-server-mysql-3.2.11]#mysql -uroot -p123123zabbix < create.sql
启动zabbix服务
[root@harry-01 zabbix-server-mysql-3.2.11]# systemctl start zabbix-server
更改zabbix的配置文件,配置文件为/etc/zabbix/zabbix_server.conf
[root@harry-01 ~]# vim /etc/zabbix/zabbix_server.conf
搜索/DBHost
DBName=
DBHost=
DBPassword=
MySQL装在其他机器上,这是的DBHost,就需要写上mysql的ip
重启
[root@harry-01 zabbix-server-mysql-3.2.11]# systemctl restart zabbix-server
[root@harry-01 zabbix-server-mysql-3.2.11]#
1.访问zabbix页面
2.设置php的timezone时区,在php的配置文件中设置,默认php的配置文件在/etc/php.ini 里面
服务端
[root@harry-01 ~]# vim /etc/php.ini
搜索 /timezone
将 ;date.timezone 改为如下
date.timezone = Asia/Shanghai
保存退出
3.在定义完php的配置文件,还需要重启apache
[root@harry-01 zabbix-server-mysql-3.2.11]# systemctl restart httpd
4.根据提示一直next step
登录管理页,默认的账号是Admin,密码为zabbix
5.更改密码,先选择 Administration ,然后选择 Users
6.然后找到Admin,并点进去,选择 Change password 修改密码和选择语言(支持中文),然后保存退出
7.这时在退出zabbix,再重新进入下,使用新的密码,会看到重新进入了,这就是zabbix的web界面了
8.图形界面中文乱码解决:修改zabbix网页文件的 fonts目录下的字体文件
9.创建自动发现规则,发出网络上的主机并监控
点击配置-自动发现-创建发现规则
10.所有监控主机都需要安装zabbix-agent,编辑zabbix_agent.conf文件,修改如下内容
Server=192.168.1.103定义被动模式的server端
ServerActive=192.168.1.103定义主动模式的server端
11.添加监控项目
>需求1
创建方式:链接 OS Linux模板 然后取消链接,删除多余的监控项
模板名 Template_Base 模板应用到的所有主机
监控项保留下面这几个CPU内存相关的监控项,其余的都可以删除掉,没有监控项的应用集也可以删除
Agent ping CPU user time Number of processes Number of running processes Processor load (1 min average per core) Total memory
自动发现网卡和硬盘
将两个自动发现的更新时间修改为 30s 当图形中有了自动发现的图形后可以改回30m 或者1h
这两个自动发现会自动创建 网卡流量 和 硬盘状态 的图形
检测web站点的可用性
在server端中写入一条 hosts:
echo '192.168.1.103 www.apelearn.com' >> /etc/hosts
在zabbix的web页面选择 配置 -- 主机 -- zbx-server -- web监测 -- 右上角创建web场景
场景选项卡中填写
名称:web可用性检测
新的应用集: web_check
客户端:随意选择一个,就是模拟什么浏览器访问监测的站点
步骤选项卡填写:
点击步骤框中的添加添加一个步骤, 填写一个自定义的步骤名称 填写要检测的站点的URL:
填写最下面的状态码 200 点击最下边的添加按钮完成步骤的添加
点击添加按钮完成web场景的添加
再按照前面的步骤将其他两个web站点也添加上
添加完成过几十秒就可以在 监测中 -- web检测 中查看状态了
>需求2
#客户端
$ sudo vim /usr/local/sbin/estab.sh
//内容如下
#!/bin/bash
##获取80端口并发连接数
netstat -ant |grep ':80 ' |grep -c ESTABLISHED
给脚本授权:
$ sudo chmod 755 /usr/local/sbin/estab.sh
修改配置文件
$ sudo vim /etc/zabbix/zabbix_agentd.conf
//增加
UnsafeUserParameters=1 //表示使用自定义脚本
UserParameter=my.estab.count[*],/usr/local/sbin/estab.sh
#自定义监控项的key为my.estab.count(也就是在监控项中需要填写的键值),后面的[*]里面写脚本的参数,如果没有参数则可以省略,如果有需要用逗号分隔,脚本为/usr/local/sbin/estab.sh
重启客户端的zabbix服务:
$ sudo systemctl restart zabbix-agent
服务端验证,执行命令:
zabbix_get -s 192.168.14.103 -p 10050 -k 'my.estab.count'
0
-s:源地址
-p: 端口
-k: 键值
如上显示0即为没有任何连接
进入zabbix服务器的web页面,给每一台web主机创建监控项和图形并创建触发器:
名称:web1:并发连接数
严重性:警告
表达式:{web1:my.estab.count.last(,30)}>100
点击最下边的添加按钮完成触发器的添加
再将这个触发器复制到其他web主机,修改一下名称
自定义监控项:检测Mysql队列,超过300报警(mysql主机)
在客户端开启自定义监控脚本。修改客户端的配置文件zabbix_agent.conf,加入过修改以下内容:
UnsafeUserParameters=1
UserParameter=process.count[*],/usr/local/sbin/process_count.sh
脚本:
#!/bin/bash
# script name: process_count.sh
export MYSQL_PWD=123456 #这里可以先定义密码,下面的命令就可以省略-p
process_count=`mysql -uroot -e "SHOW FULL PROCESSLIST;" |wc -l`
echo $process_count
修改脚本权限,并重启zabbix-agent
[root@harry-01 sbin]# systemctl restart zabbix-agent
[root@harry-01 sbin]#
进入zabbix网页,配置-主机-监控项-创建监控项
键值填process.count[*],就是上面自定义的键值,然后再为该项目创建触发项
>需求3
修改/etc/my.cn 配置文件 加入以下内容
slow_query_log = ON #开启慢查询日志
slow_query_log_file = /data/mysql/slow.log
long_query_time = 2 # 查询超过2秒就记录慢查询日志
service mysqld restart
修改zabbix-agent.conf,添加以下字段
UnsafeUserParameters=1 #表示使用自定义脚本
UserParameter=slow.query.count[*],/usr/local/sbin/slow_query_count.sh #定义键值和脚本存放路径
创建慢查询统计脚本sudo vim /usr/local/sbin/slow_query_count.sh
#!/bin/bash
# script name: slow_query_count.sh
slow_log=/data/mysql/dbm-slow.log
grep 'timestamp' $slow_log | awk -F '=' '{print $2}' |awk -F ';' '{print $1}'|sort -r > /tmp/timestamp.log
now=`sed -n '1'p /tmp/timestamp.log`
alert_num=60
one_min_ago=$[$now-60]
num=0
##### 判断两个时间戳之前的差值
slow_query_sum() {
if [ $1 -ge $2 ]
then
num=$[$num+1]
else
break
fi
}
##### 获取在一分钟内的慢查询数
for n in `cat /tmp/timestamp.log`
do
slow_query_sum $n $one_min_ago
done
##### 删除临时文件
rm -f /tmp/timestamp.log
# There are $num slow query in a minute.
echo $num
修改脚本权限,并重启zabbix-agent
sudo chmod 755 /usr/local/sbin/slow_query_count.sh
systemctl restart zabbix-agent
>需求4
编译zabbix server时需要提供java支持,即添加--enable-java该选项
zabbix server段配置java支持。此处编译安装zabbix的目录为/usr/local/zabbix-3.4.2
[root@localhost ]# vi /usr/local/zabbix3.4.2/sbin/zabbix_java/settings.sh #修改如下字段的值
LISTEN_IP="0.0.0.0" //监听的服务器地址
LISTEN_PORT=10052 //监听的端口
PID_FILE="/tmp/zabbix_java.pid" //指定zabbix_java的pid文件地址
START_POLLERS=5
TIMEOUT=3
编辑/usr/local/zabbix/etc/zabbix_server.conf,修改完成之后,内容如下:
LogFile=/tmp/zabbix_server.log //指明zabbix_server的日志文件地址
DBHost=localhost //连接的数据库地址
DBName=zabbix //连接的数据库名称
DBUser=zabbix //连接数据库的用户名
DBPassword=zabbix //连接数据库密码
JavaGateway=192.168.1.103 //java网关地址,即server端ip地址
JavaGatewayPort=10052 //java网关监听端口
Timeout=20 //超时时间
FpingLocation=/usr/sbin/fping //fping命令绝对地址
LogSlowQueries=3000
AllowRoot=1 //允许root启动
User=root //zabbix服务的启动用户
StartPollers=50
StartPingers=100
StartJavaPollers=5
AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts //zabbix额外的脚本地址
重启zabbix server服务,以及启动zabbix java支持服务
/etc/init.d/zabbix_server restart
cd /usr/local/zabbix-3.4.2/sbin/zabbix_java && sh startup.sh
在zabbix agent部署的服务器上更改配置文件,修改tomcat配置文件。
vi /usr/local/tomcat/bin/catalina.sh #在开头添加如下内容,注意要加在第二行
CATALINA_OPTS="-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=12345 -Djava.rmi.server.hostname=192.168.118.110"
其中,hostname=192.168.118.110需要修改为agent部署的服务器地址。更改完成需要重启tomcat应用服务器,同时查看端口12345是否处于监听状态。
[root@localhost]# netstat -lnp|grep 12345
tcp6 0 0 :::12345 :::* LISTEN 13453/java
在zabbix agent部署的tomcat服务器上,下载对应的java jmx监控的相关jar包并复制到tomcat对应的目录下
wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.32/bin/extras/catalina-jmx-remote.jar
cp catalina-jmx-remote.jar /usr/local/tomcat/lib/
第一部分 架构绘图+基础
1. 通过expect脚本批量创建普通用户linux,并授予sudo权限
需要在13台机器上创建linux用户,创建密码并授予sudo权限,IP为192.168.239.101--113
① 先登录192.168.239.101,编辑脚本
[root@nginx1 sbin]#cd /usr/local/sbin
[root@nginx1 sbin]# vim ip.txt
192.168.239.101
192.168.239.102
192.168.239.103
192.168.239.104
192.168.239.105
192.168.239.106
192.168.239.107
192.168.239.108
192.168.239.109
192.168.239.110
192.168.239.111
192.168.239.112
192.168.239.113
[root@nginx1 sbin]# vim useradd.expect
#内容如下#!/usr/bin/expect
set host [lindex $argv 0]
set passwd "110120119"
set cm [lindex $argv 1] #需要执行的命令
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"
interact
[root@nginx1 sbin]#chmod +x useradd.expect #赋予执行权限
创建useradd.sh脚本调用useradd.expect:
[root@nginx1 sbin]#vim useradd.sh #创建用户,密码并授予sudo权限,并创建.ssh目录为密钥准备
#!/bin/bash
for ip in `cat ip.txt`
do
./useradd.expect "$ip" "useradd linux && echo "linux123"|passwd --stdin linux && echo 'linux ALL=(ALL) NOPASSWD:ALL' >>/etc/sudoers &&mkdir /home/linux/.ssh&&chmod 700 /home/linux/.ssh"
done
[root@nginx1 sbin]# chmod +x useradd.sh
② 执行useradd.sh,创建普通用户
[root@nginx1 sbin]# ./useradd.sh
2. 所有服务器要求只能普通用户登录,而且只能密钥登录
首先生成密钥对,这里xshell生成
工具-新建用户密钥生成向导-设置密钥长度-生成密钥对-生成公钥-设置私钥-复制公钥内容
在Linux上配置公钥,先用linux用户登陆192.168.239.101机器,之前创建用户的时候已经创建.ssh目录和设定了权限
① 创建公钥文件
vim /home/linux/.ssh/authorized_keys
#粘贴刚才复制的公钥内容,保存退出
chmod 644 /home/linux/.ssh/authorized_keys
② 同步authorized_keys到所有机器,用expect脚本实现
cd /usr/local/sbin
sudo vim rsync-pub.expect
#!/usr/bin/expect
#同步公钥文件到其他服务器,配合rsync-pub.sh使用
set user "linux"
set passwd "linux123"
set host [ lindex $argv 0 ]
spawn rsync -av /home/linux/.ssh/authorized_keys $user@$host:/home/linux/.ssh/
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}
expect eof
•保存后记得赋予执行权限
新建rsync-pub.sh,调用rsync-pub.expect
sudo vim rsync-pub.sh
#!/bin/bash
#同步公钥文件到其他机器,配合rsync-pub.expect
for ip in `cat ip.txt`
do
if [ $ip == "192.168.239.101" ]
then
continue
else
./rsync-pub.expect "$ip"
fi
done
添加执行权限,执行rsync-pub.sh即可把文件同步到所有机器
③ 使root无法远程登录的方法,用户只能使用密钥登录
修改/etc/ssh/sshd_config的内容,将"#PermitRootLogin yes"修改为"PermitRootLogin no"
将"#PasswordAuthentication yes"修改为"PasswordAuthentication no"
将"#PubkeyAuthentication yes"修改为"PubkeyAuthentication yes"
重启sshd服务
④ 批量修改所有机器
cd /usr/local/sbin
vim nologin.expect
#!/usr/bin/expect
set user "linux"
set passwd "linux123"
set host [ lindex $argv 0 ]
spawn ssh $user@$host
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$passwd\r" }
}
expect "]*"
send "sudo sed -i 's/#PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config \r"
expect "]*"
send "sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config \r"
expect "]*"
send "sudo sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config \r"
expect "]*"
send "sudo systemctl restart sshd \r"
expect "]*"
send "exit \r"
•保存后需要赋予执行权限
⑦创建nologin.sh
vim nologin.sh
#!/bin/bash
for ip in `cat ip.txt`
do
./nologin.expect $ip &>>nologin.log
if [ $? -eq "0" ]
then
echo $ip.....[ ok ]
else
echo $ip.....[ faild ]
fi
done
执行nologin.sh即可实现root用户不能远程登陆,普通用户只能密钥登陆
3. 添加简单的命令审计功能
① # 创建目录存放历史命令的目录
mkdir /usr/local/command_history
chown 777 /usr/local/command_history
chattr +a /usr/local/commadn_history
# 在/etc/profile 文件中最后添加以下内容
if [ ! -d /usr/local/command_history/${LOGNAME} ]
then
mkdir -p /usr/local/command_history/${LOGNAME}
chmod 300 /usr/local/command_history/${LOGNAME}
fi
export HISTORY_FILE="/usr/local/command_history/${LOGNAME}/bash_history"
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i | awk "{print \$1\" \"\$2\" \"\$6}") ##### $(history 1 | { read x cmd; echo "$cmd"; })"; } >> $HISTORY_FILE'
② 同步设置到所有主机
# 创建文件 /usr/local/sbin/file.list 存放需要同步的文件路径,内容如下
/usr/local/command_history
/home/linux/.ssh/authorized_keys
/home/linux/.ssh/id_rsa
/etc/sudoers
/etc/profile
# 创建用于同步的expect脚本 /usr/local/sbin/rsync.expect 内容如下
#!/usr/bin/expect
set host [lindex $argv 0]
set file [lindex $argv 1]
set user "root"
set password "110120119"
spawn rsync -avR --files-from=$file / $user@$host:/
expect {
"yes/no" { send "yes\r"; exp_countinue }
"assword" { send "$password\r" }
}
interact
# 创建用于同步的shell脚本 /usr/local/sbin/rsync.sh 内容如下
#!/bin/bash
for i in `cat ip.list`
do
./rsync.expect $i
done
### 给两个脚本添执行权限
chmod 755 rsync.expect rsync.sh
### 执行 rsync.sh 就会将file.list 中记录的所有文件同步到所有ip.list记录的主机中。