前两阶段大作业

用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用户)

一、搭建mysql,因为搭建web服务器、zabbix监控都需要用到数据库mysql,所以先搭建第三部分:mysql

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 在最后的</mycat:server> 标签之前添加以下内容

[root@mycat src]# vim /usr/local/mycat/conf/server.xml

 # mycat用户对逻辑数据库ultrax,DedeCMS,zrlog具有增删改查的权限
        <user name="mycat">
                <property name="password">123456</property>
                <property name="schemas">ultrax,DedeCMS,zrlog</property>
        </user>

        # discuz用户对逻辑数据库ultrax具有增删改查的权限
        <user name="discuz">
                <property name="password">123456</property>
                <property name="schemas">ultrax</property>
        </user>

        # dedecms用户对逻辑数据库DedeCMS具有增删改查的权限
        <user name="dedecms">
                <property name="password">123456</property>
                <property name="schemas">DedeCMS</property>
        </user>

        # zrlog用户对逻辑数据库zrlog具有增删改查的权限
        <user name="zrlog">
                <property name="password">123456</property>
                <property name="schemas">zrlog</property>
        </user>

        # 该用户对逻辑数据库ultrax,DedeCMS,zrlog仅有只读的权限
        <user name="user">
                <property name="password">123456</property>
                <property name="schemas">ultrax,DedeCMS,zrlog</property>
                <property name="readOnly">true</property>
        </user>

# 创建以上这些用户是用于连接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

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="ultrax" checkSQLschema="false" sqlMaxLimit="1000" dataNode="dn1" />
        <schema name="dedecms" checkSQLschema="false" sqlMaxLimit="1000" dataNode="dn2" />
        <schema name="zrlog" checkSQLschema="false" sqlMaxLimit="1000" dataNode="dn3" />
        <schema name="zabbix" checkSQLschema="false" sqlMaxLimit="1000" dataNode="dn4" />

        <dataNode name="dn1" dataHost="localhost1" database="ultrax" />
        <dataNode name="dn2" dataHost="localhost1" database="dedecms" />
        <dataNode name="dn3" dataHost="localhost1" database="zrlog" />
        <dataNode name="dn4" dataHost="localhost1" database="zabbix" />
        <dataHost name="localhost1" maxCon="2000" minCon="1" balance="3"
                          writeType="1" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>

            <writeHost host="hostM1" url="192.168.239.109:3306" user="mycat" password="123456">
                  <!-- can have multi read hosts -->
                  <readHost host="hostS1" url="192.168.239.110:3306" user="mycat" password="123456" />
                  <readHost host="hostS2" url="192.168.239.111:3306" user="mycat" password="123456" />
            </writeHost>
        </dataHost>
</mycat:schema>

schema.xml配置文件详解

<?xml version="1.0"?>   xml文件格式;
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 文件标签属性;
<mycat:schema xmlns:mycat="http://io.mycat/">  Mycat起始标签

配置逻辑库,与server.xml指定库名保持一致,绑定数据节点dn1;
<schema name="testdb" checkSQLschema="false" sqlMaxLimit="1000" dataNode="dn1"></schema> 

 添加数据节点dn1,设置数据节点host名称,同时设置数据节点真实database为discuz;
 <dataNode name="dn1" dataHost="localhost1" database="discuz" />

 数据节点主机,绑定数据节点,设置连接数及均衡方式、切换方法、驱动程序、连接方法; 
 <dataHost name="localhost1" maxCon="2000" minCon="1" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

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语句;
<heartbeat>select  user()</heartbeat>

指定读写请求,同时转发至后端MYSQL真实服务器,配置连接后端MYSQL用户名和密码(该用户名和密码为MYSQL数据库用户名和密码);
<writeHost host="hostM1" url="192.168.239.109:3306" user="mycat"  password="123456">
     <readHost host="hostS1" url="192.168.239.110:3306" user="mycat" password="123456" />
     <readHost host="hostS2" url="192.168.239.111:3306" user="mycat" password="123456" />
</writeHost>

</dataHost>    数据主机标签;
</mycat:schema>  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服务器,然后进行对接即可。

第二部分: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 环境的服务

1. LNMP 环境

-- 本文档将搭建基于 LNMP 环境的 discuz 论坛, dedecms 企业网站

1.1 基础环境

  • 配置环境:
  • 角色:         主机名         操作系统        IP
    LNMP      web1       CentOS7            192.168.239.103

1.2 Nginx 软件

  • 安装

    • yum -y install epel-release
    • yum -y install nginx
  • 配置nginx

1.3 MySQL 安装

  • 准备安装目录

    • 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
# 创建 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 
  • 启动MySQL
    /opt/app/mysql57/bin/mysqld_safe --defaults-file=/etc/my.cnf

1.4 安装 PHP

  • 下载

    • 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 
  • 准备 php-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 

1.5 安装 Jdk 和 tomcat

  • 下载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 

2. 安装 安装discuz

2.1 准备discuz

  • 下载discuz
    • 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 创建数据库及用户
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/

2.2 编辑 nginx

  • 编辑配置文件
    • 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
  • 初始化站点

    • windows 修改host 文件
    • 192.168.239.103       discuz.top
      192.168.239.103       dedecms.top
  • 访问 http://discuz.top/install
  • 初始化

3. 安装 dedecms

3.1 下载并安装

  • 下载 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/

3.2 配置服务

  • 配置nginx
...
# 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;

3.3 启动与初始化

  • 重启服务

    • systemctl restart nginx
    • init.d.php-fpm restart
  • 初始化站点

    • 访问 http://dedecms.top/install

4. 安装zrlog

4.1 下载与安装

  • 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

4.2 配置 zrlog

  • 拷贝文件
mkdir /opt/app/tomcat/myapps
cp /opt/src/ROOT.war /opt/app/tomcat/myapps/
  • 修改配置文件
    • vim /opt/app/tomcat/conf/server.xml
    • 修改<Host> </Host> 段的配置
...
<Host name="localhost" appBase="myapps" unpackWARs="true" autoDeploy="true">
...
  • 配置数据库信息
MySQL [(none)] > CREATE DATABASE zrlog;
MySQL [(none)] > GRANT ALL ON zrlog.* to 'zrlogUser'@127.0.0.1 IDENTIFIED BY 'zrlogPassword';
MySQL [(none)] > FLUSH PRIVILEGES;

4.3 启动 初始化zrlog

  • 启动 tomcat
    • catalina.sh stop ; catalina.sh start
  • 访问
    • http://192.168.239.103:8080/

5. 自动切割日志

5.1 nginx 的日志切割

  • 日志每日切割, 保留30天
  • 使用 logrotate 工具
    • 编辑配置文件 /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
}

5.2 php 日志切割

  • 前面配置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
}

5.3 写入crontab

  • 写入 crontab 中 定时运行
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

5.6 站点后台二次认证

  1. 安装 httpd-tools 工具组(需要 htpasswd 工具)
  • yum -y install httpd-tools
  1. 生成认证用户
[root@node10013 nginx]# htpasswd -c /etc/nginx/passwd.db fangfc
New password: 
Re-type new password: 
Adding password for user fangfc
[root@node10013 nginx]# 
  1. 配置nginx 配置文件
  • 配置 admin.php 页面的用户认证,
    • 需要注意的是 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共享目录

1. 概述

  • 现在需要搭建一个NFS 服务器, 为负载均衡集群搭建一个共享的 上传目录,

1.1 系统环境

角色:         IP                   主机名         操作系统        软件版本
NFS    192.168.239.113    nfs       CentOS7         nfs1.3 + rpcbind-0.2.0

2.2 NFS 服务搭建

  1. 安装服务
  • yum -y install nfs-utils rpcbind
  1. 配置服务
  2. # 创建共享目录
    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

  1. 启动服务
  • systemctl restart rpcbind
  • systemctl enable rpcbind
  • systemctl restart nfs
  • systemctl enable nfs

2.3 客户端设置

  • 这里的客户端(即 LNMP 服务器, 这里客户端是 web1, IP:192.168.239.103), 需要安装 nfs-utils 用于连接 nfs服务端, 并且需要将共享目录设置为 nfs 的目录.
  1. 安装服务
  • yum -y install nfs-utils
  1. 配置服务
  2. # 查看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
     

2.4 Discuz 共享目录设置

  1. 设置共享目录
  • 设置共享目录时, 需要暂停服务
# 再挂载的 目录中创建文件夹
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/
  1. 开机自动挂载
# 挂载目录
cat <<-EOF >> /etc/rc.d/rc.local 
mount --bind /data/discuz/data/attachment/ /opt/www/discuz/data/attachment/
EOF
  1. 测试上传

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]# 

2.5 dedecms 共享目录设置

  1. 设置共享目录
# 挂载目录
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/
  1. 开机自动挂载目录
cat <<-EOF >> /etc/rc.d/rc.local
mount --bind /data/dedecms/uploads/ /opt/www/dedecms/uploads/
EOF


第四部分   监控

安装zabbix

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

  • 监控各个主机基础指标,CPU,内存,硬盘,网卡流量成图,web站点的可用性
创建方式:链接 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 

  • 定制自定义监控脚本,监控web服务器的并发连接数,接入zabbix,成图,设置触发器,超过100告警
     
#客户端

$ 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

  • 定制自定义监控脚本,监控mysql的慢查询日志,接入zabbix,成图,设置触发器,每分钟超过60条日志需要告警
修改/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

  • 利用jmx,在zabbix上监控tomcat

编译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记录的主机中。

猜你喜欢

转载自blog.csdn.net/dwy2018/article/details/86580312