2018-08-07大作业

业务需求:

用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 制定代码、静态文件的备份方案,并写备份脚本,要求把备份数据传输到备份服务器
12 编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据
13 搭建zabbix监控告警系统,要求监控各个基础指标(cpu、内存、硬盘),网卡流量需要成图,还需要监控web站点的可用性
14 定制自定义监控脚本,监控web服务器的并发连接数,接入zabbix,成图,设置触发器,超过100告警
15 定制自定义监控脚本,监控mysql的队列,接入zabbix,成图,设置触发器,队列超过300告警
16 定制自定义监控脚本,监控mysql的慢查询日志,接入zabbix,成图,设置触发器,每分钟超过60条日志需要告警,需要仔细分析慢查询日志的规律,确定日志条数
17 利用jmx,在zabbix上监控tomcat
18 给三个站点的后台访问做二次认证,增加安全性
19 用shell脚本实现文件、代码同步上线(参考分发系统)

可以简单把需求分为以下几部分:
•第一部分:基础

1 、设计你认为合理的架构,用visio把架构图画出来
7、所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo
8 、给所有服务器做一个简单的命令审计功能
18、用shell脚本实现文件、代码同步上线(参考分发系统)

•第二部分: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 所有站点都需要配置访问日志,并做日志切割,要求静态文件日志不做记录,日志保留一月
17 给三个站点的后台访问做二次认证,增加安全性

•第三部分:

11 制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器
12 制定代码、静态文件的备份方案,并写备份脚本,要求把备份
12 编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据

•第四部分:zabbix监控

13 搭建zabbix监控告警系统,要求监控各个基础指标(cpu、内存、硬盘),网卡流量需要成图,还需要监控web站点的可用性,
14 定制自定义监控脚本,监控web服务器的并发连接数,超过100告警
15 定制自定义监控脚本,监控mysql的队列,队列超过300告警
16 定制自定义监控脚本,监控mysql的慢查询日志,每分钟超过60条日志需要告警,需要仔细分析慢查询日志的规律,确定日志条数

第一部分需求设置
1、架构图
2018-08-07大作业_第1张图片
2、根据架构图分配机器角色:

192.168.66.100       VIP
192.168.66.130       前端nginx负载主机+keepalived
192.168.66.131       前端nginx负载备机+keepalived
192.168.66.132       web服务器(lnmp+tomcat)
192.168.66.133       web服务器(lnmp+tomcat)
192.168.66.134       web服务器(lnmp+tomcat)
192.168.66.135       web服务器(lnmp+tomcat)
192.168.66.136       web服务器(lnmp+tomcat)
192.168.66.137       web服务器(lnmp+tomcat)
192.168.66.138       mysql读写分离调度器(mycat)+备份服务器
192.168.66.139       mysql主服务器
192.168.66.140       mysql从服务器
192.168.66.141       mysql从服务器
192.168.66.142       zabbix服务器

3、通过expect脚本批量创建普通用户linux,并授予sudo权限
需要在13台机器上创建linux用户,创建密码并授予sudo权限,IP为192.168.66.130-142
•先登录192.168.66.130,安装expect

[root@localhost ~]# yum  install -y expect vim
[root@localhost ~]# cd  /usr/local/sbin
[root@localhost sbin]# vim  useradd.expect   #内容如下
#!/usr/bin/expect
set user [ lindex $argv 0 ]
set passwd "123456"
set host [ lindex $argv 1 ]
set cm [ lindex $argv 2 ]
spawn ssh $user@$host

expect {
"yes/no" { send "yes\r"; exp_continue}
"assword:" { send "$passwd\r" }
}

expect  "]*"
send  "$cm\r"
expect  "]*"
send  "exit\r"

interact

[root@localhost sbin]# chmod +x useradd.expect               #赋予执行权限

•创建useradd.sh脚本调用useradd.expect

[root@localhost sbin]# vim ip.txt    #增加ip列表,内容如下
192.168.66.130
192.168.66.131
192.168.66.132
192.168.66.133
192.168.66.134
192.168.66.135
192.168.66.136
192.168.66.137
192.168.66.138
192.168.66.139
192.168.66.140
192.168.66.141
192.168.66.142

[root@localhost sbin]# vim useradd.sh  #创建用户,密码并授予sudo权限,并创建.ssh目录为密钥准备
#!/bin/bash
for i in `cat ip.txt`
do
./useradd.expect "root" "$i" " 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@localhost sbin]# sh useradd.sh

注意:第4步,请放到所有服务都搭建完成后再执行,因为搭建web服务器和mysql等启动服务需要用到root用户

4、所有服务器要求只能普通用户登录,而且只能密钥登录
首先生成密钥对,这里xshell生成
工具-新建用户密钥生成向导-设置密钥长度-生成密钥对-生成公钥-设置私钥-复制公钥内容
在Linux上配置公钥,先用linux用户登陆130机器,之前创建用户的时候已经创建.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

sudo vim rsync-pub.sh

#!/bin/bash
#同步公钥文件到其他机器,配合rsync-pub.expect

for ip in `cat ip.txt`
do
        if [ $ip == "192.168.66.130" ]
        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用户不能远程登陆,普通用户只能密钥登陆,至此,第一部分需求完成

二、搭建mysql,因为搭建web服务器需要用到数据库mysql,所以先搭建第三部分

192.168.66.138       mysql读写分离调度器(mycat)+备份服务器
192.168.66.139       mysql主服务器
192.168.66.140       mysql从服务器
192.168.66.141       mysql从服务器

用root用户登陆,写一个通用的可以批量远程执行命令的expect脚本

[root@localhost ~]# vim cmd.expect
#!/usr/bin/expect
set user [lindex $argv 0]  # 系统用户
set host [lindex $argv 1]  # 服务器地址
set passwd [lindex $argv 2]  # 密码
set cm [lindex $argv 3]  # 需要执行的命令
spawn ssh $user@$host
set timeout -1
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}

expect "]#"
send "$cm\r"
expect "]#"
send "exit\r"
interact

[root@localhost ~]# chmod a+x cmd.expect
[root@localhost ~]# vim cmd.sh  # 调用脚本
#!/bin/bash
user=$2
password=$3
cm=$4
for ip in `cat $1`
do
  ./cmd.expect "$user" "$ip" "$password" "$cm"
done

## 参数1是存储ip列表的文件路径
## 参数2是用户名
## 参数3是密码
## 参数4需要执行的命令

# 使用这个脚本批量安装一些基础通用的工具
[root@localhost ~]# sh ./cmd.sh "/root/ip.txt" "root" "123456" "yum -y install expect vim-enhanced epel-release libmcrypt-devel libmcrypt"

ip.txt内容为

192.168.66.130
192.168.66.131
192.168.66.132
192.168.66.133
192.168.66.134
192.168.66.135
192.168.66.136
192.168.66.137
192.168.66.138
192.168.66.139
192.168.66.140
192.168.66.141
192.168.66.142

通过之前写的批量执行命令脚本安装mysql:

[root@localhost ~]# sh ./cmd.sh "/root/dbip.txt" "root" "123456" "cd /usr/local/src/; yum install -y epel-release wget perl-Module-Install.noarch libaio*; wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz; tar -zxvf mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz; mv mysql-5.6.39-linux-glibc2.12-x86_64 ../mysql; cd /usr/local/mysql; mkdir /data/; useradd mysql; ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql; echo $? > /root/downloadMySQL.log"

dbip.txt内容为

192.168.66.139
192.168.66.140
192.168.66.141

先配置主139的配置文件,然后使用rsync同步到从上:

# 拷贝配置文件
[root@localhost ~]# cp /usr/local/mysql/support-files/my-default.cnf  /etc/my.cnf
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock

# 拷贝启动脚本
[root@localhost ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

# 然后定义basedir和datadir的路径
[root@localhost ~]# vim /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/data/mysql

# 将mysql加入服务列表里面去,并设置为开机启动:
[root@localhost ~]# chkconfig --add mysqld
[root@localhost ~]# chkconfig mysqld on

编写同步文件的expect脚本:sync.expect

[root@localhost ~]# vim sync.expect   #写入如下内容
#!/usr/bin/expect

set host [lindex $argv 0]
set passwd [lindex $argv 1]
set file [lindex $argv 2]

spawn rsync -avR --files-from=$file / root@$host:/
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}

expect eof

调用脚本:sync.sh

[root@localhost ~]# vim sync.sh    #写入如下内容
#!/bin/bash
passwd=$2
file=$3
for ip in `cat $1`
do
    ./sync.expect $ip $passwd $file
done

## 使用方式:##
## sh sync.sh "ip列表文件" "密码" "文件列表路径" ##

[root@localhost ~]$ sh ./sync.sh "/root/slaveIP.txt" "123456" "/tmp/DBfile.txt"  # 同步配置文件
[root@localhost ~]$ sh ./cmd.sh "/root/slaveIP.txt" "root" "123456" "/etc/init.d/mysqld start; chkconfig --add mysqld; chkconfig mysqld on"   # 启动服务并且将服务添加到服务列表里
[root@localhost ~]$ sh ./cmd.sh "/root/slaveIP.txt" "root" "123456" "ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql"  # 制作软链接到/usr/bin/目录下

启动主从mysql服务,登陆mysql,设置密码

[root@localhost ~]$ mysql -uroot
mysql> set password=password('123456');

完成密码的修改和重启mysql服务器后,先配置主机器:

1.修改my.cnf配置文件:
[root@localhost ~]$ vim /etc/my.cnf
[mysqld]
#增加下面两行
server-id=139                   #要和从上不一致            
log_bin=master-bin          #主上要打开binlog
[root@localhost ~]$ service mysqld restart  # 修改完配置文件后,重启mysqld服务
[root@localhost ~]$ ls /data/mysql  # 看看是否多了以下两个文件
master-bin.000001  master-bin.index
2.登录master上的mysql,为两台slave添加一个同步账号:
mysql> grant replication slave on *.* to 'repl'@'192.168.66.140' identified by '123456';
mysql> grant replication slave on *.* to 'repl'@'192.168.66.141' identified by '123456';
3.master机器上进行锁表:
mysql> flush tables with read lock;
4.看一下master的状态,并记录:
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File| Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001        |      166 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

完成以上master上的操作后,开始配置slave机器:

1.修改slave的/etc/my.cnf
# slave1
[root@localhost ~]$ vim /etc/my.cnf
[mysqld]
#增加下面一行,不用打开binlog
server-id=140
[root@localhost ~]$ service mysqld restart

# slave2
[root@localhost ~]$ vim /etc/my.cnf
[mysqld]
#增加下面一行,不用打开binlog
server-id=141
[root@localhost ~]$ service mysqld restart
2.登录两台slave的mysql的root用户,分别执行以下命令:
# slave1
 [root@localhost ~]$ mysql -uroot -p'123456'
 mysql> stop slave;
 mysql> change master to master_host='192.168.66.139', master_user='repl', master_password='123456', master_log_file='master-bin.000001', master_log_pos=166;
 mysql> start slave;

# slave2
[root@localhost ~]$ mysql -uroot -p'123456'
mysql> stop slave;
mysql> change master to master_host='192.168.66.139', master_user='repl', master_password='123456', masterr_log_file='master-bin.000001', master_log_pos=120;
mysql> start slave;
3.查看两台slave的主从状态是否正常,Slave_IO_Running和 Slave_SQL_Running要为yes:
mysql> show slave status\G
#下面两行要为yes,说明主从同步成功
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
4.回到master139机器上解锁表,并创建库111,看能不能同步
# master
mysql> unlock tables;
mysql> create database 111;
5.到slave上看是否同步了创建:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| 111              |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

主从配置完成
在192.168.66.138上搭建Mycat服务器
主从搭建完成之后就可以搭建Mycat服务器实现读写分离了,因为Mycat是Java开发的,所以在安装Mycat之前得先安装好jdk环境。
1.下载并安装JDK:
jdk的下载地址要去官网获取,官网下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下载完之后用xshell自带的xftp上传到服务器/usr/local/src目录下,我这里已经下载好了

[root@localhost ~]#  cd /usr/local/src/
[root@localhost src]# ls
jdk-8u181-linux-x64.tar.gz
[root@localhost src]# tar zxf jdk-8u181-linux-x64.tar.gz
[root@localhost src]$ mv jdk1.8.0_181/ /usr/local/jdk1.8

编辑/etc/profile环境变量配置文件加入以下内容:

JAVA_HOME=/usr/local/jdk1.8/    
JAVA_BIN=/usr/local/jdk1.8/bin 
JRE_HOME=/usr/local/jdk1.8/jre 
PATH=$PATH:/usr/local/jdk1.8/bin:/usr/local/jdk1.8/jre/bin  
CLASSPATH=/usr/local/jdk1.8/jre/lib:/usr/local/jdk1.8/lib:/usr/local/jdk1.8/jre/lib/charsets.jar  

[root@localhost ~]# source /etc/profile      #加载配置

查看java环境是否搭建成功,出现如下信息说明成功

[root@localhost ~]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

2.下载安装Mycat:
下载地址:http://dl.mycat.io/1.6-RELEASE/

[root@localhost ~]$ cd /usr/local/src/
[root@localhost /usr/local/src]$ wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@localhost /usr/local/src]$ tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@localhost /usr/local/src]$ mv mycat/ /usr/local/
[root@localhost /usr/local/src]$ ls /usr/local/mycat/
bin  catlet  conf  lib  logs  version.txt

3.修改Mycat服务器参数调整和用户授权的配置文件server.xml。主要修改配置段如下:

[root@localhost ~]$ vim /usr/local/mycat/conf/server.xml
        # mycat用户对逻辑数据库ultrax,DedeCMS,zrlog具有增删改查的权限
        
                123456
                ultrax,DedeCMS,zrlog
        

        # discuz用户对逻辑数据库ultrax具有增删改查的权限
        
                123456
                ultrax
        

        # dedecms用户对逻辑数据库DedeCMS具有增删改查的权限
        
                123456
                DedeCMS
        

        # zrlog用户对逻辑数据库zrlog具有增删改查的权限
        
                123456
                zrlog
        

        # 该用户对逻辑数据库ultrax,DedeCMS,zrlog仅有只读的权限
        
                123456
                ultrax,DedeCMS,zrlog
                true
        

# 创建以上这些用户是用于连接mycat中间件。

4.修改mycat逻辑库定义和表及分片定义的配置文件schema.xml:

# 把自带的配置文件重命名,作为备份
[root@localhost ~]$ mv /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml_bak

# 新建配置文件
[root@localhost ~]$ vim /usr/local/mycat/conf/schema.xml

# 配置内容如下:



        
        
        

        
        
        
        
            select user()

            
                  
                  
                  
            
        

schema.xml配置文件详解

   xml文件格式;
 文件标签属性;
  Mycat起始标签

配置逻辑库,与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语句;
select  user()

指定读写请求,同时转发至后端MYSQL真实服务器,配置连接后端MYSQL用户名和密码(该用户名和密码为MYSQL数据库用户名和密码);

     
     


    数据主机标签;
  mycat结束标签;

•在主上授权mycat用户连接

mysql> grant all on *.* to 'mycat'@'192.168.66.138' identified by '123456';
mysql> grant all on ultrax.* to 'discuz'@'192.168.66.%' identified by '123456';
mysql> grant all on DedeCMS.* to 'dedecms'@'192.168.66.%' identified by '123456';
mysql> grant all on zrlog.* to 'zrlog'@'192.168.66.%' identified by '123456';

5.mycat配置完毕。启动mycat并查看端口8066和9066端口是否起来:

[root@localhost ~]$ /usr/local/mycat/bin/mycat start
[root@localhost ~]$ netstat -lntp
tcp6       0      0 :::9066                 :::*                    LISTEN      1413/java
tcp6       0      0 :::8066                 :::*                    LISTEN      1413/java

# 注意:如果没有这两个端口没有启动,查看java环境是否生效。
# 8066是用于web连接mycat.
# 9066是用于SA|DBA管理端口. 

回到master139上,通过mycat机器的IP和8066端口连接mysql:

[root@localhost ~]$ mysql -h'192.168.66.138' -udiscuz -p'123456' -P'8066'
mysql> show databases;
+----------+
| DATABASE |
+----------+
| ultrax   |
+----------+
1 row in set (0.01 sec)

使用root用户登录看看是否能查看到所有的数据库:

[root@localhost ~]$ mysql -h'192.168.66.138' -uroot -p'123456' -P'8066'
mysql> show databases;
+----------+
| DATABASE |
+----------+
| DedeCMS  |
| ultrax   |
| zrlog    |
+----------+
3 rows in set (0.00 sec)

然后以9066端口登陆查看数据源:

[root@localhost ~]$ mysql -h'192.168.66.138' -uroot -p'123456' -P'9066'
mysql> show @@datasource;
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME   | TYPE  | HOST            | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| dn1      | hostM1 | mysql | 192.168.66.139 | 3306 | W    |      0 |    0 | 2000 |       0 |         0 |          0 |
| dn1      | hostS1 | mysql | 192.168.66.140 | 3306 | R    |      0 |    0 | 2000 |       0 |         0 |          0 |
| dn1      | hostS2 | mysql | 192.168.66.141 | 3306 | R    |      0 |    0 | 2000 |       0 |         0 |          0 |
| dn3      | hostM1 | mysql | 192.168.66.139 | 3306 | W    |      0 |    0 | 2000 |       0 |         0 |          0 |
| dn3      | hostS1 | mysql | 192.168.66.140 | 3306 | R    |      0 |    0 | 2000 |       0 |         0 |          0 |
| dn3      | hostS2 | mysql | 192.168.66.141 | 3306 | R    |      0 |    0 | 2000 |       0 |         0 |          0 |
| dn2      | hostM1 | mysql | 192.168.66.139 | 3306 | W    |      0 |    0 | 2000 |       0 |         0 |          0 |
| dn2      | hostS1 | mysql | 192.168.66.140 | 3306 | R    |      0 |    0 | 2000 |       0 |         0 |          0 |
| dn2      | hostS2 | mysql | 192.168.66.141 | 3306 | R    |      0 |    0 | 2000 |       0 |         0 |          0 |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
9 rows in set (0.00 sec)

6.在master139上登录mysql,创建这三个数据库:

[root@localhost ~]$ mysql -uroot -p'123456'
mysql> create database ultrax default character set utf8;
mysql> create database DedeCMS default character set utf8;
mysql> create database zrlog default character set utf8;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| DedeCMS            |
| mysql              |
| performance_schema |
| test               |
| ultrax             |
| zrlog              |
+--------------------+
7 rows in set (0.00 sec)

至此主从复制和读写分离就弄好了,接下来就是搭建web服务器
先搭建LNMP环境,和Tomcat+Java环境,默认80端口给Nginx,Tomcat使用8080端口。
1.先在一台机器上部署好全部环境,然后通过rsync同步整个环境:
下载并安装Nginx

[root@localhost ~]$ yum -y install epel-release wget gcc gcc-c++ libmcrypt-devel libmcrypt libcurl-devel libxml2-devel openssl-devel bzip2-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel; cd /usr/local/src/; wget http://nginx.org/download/nginx-1.12.1.tar.gz; tar -zxvf nginx-1.12.1.tar.gz; cd nginx-1.12.1; ./configure --prefix=/usr/local/nginx --with-http_ssl_module; echo $? > /root/downloadNginx.log; make && make install; echo $? >> /root/downloadNginx.log

先配置其中一台机器的配置文件:
编辑启动脚本:/etc/init.d/nginx

vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings

NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"

start()
{
    echo -n $"Starting $prog: "
    mkdir -p /dev/shm/nginx_temp
    daemon $NGINX_SBIN -c $NGINX_CONF
    RETVAL=$?
    echo
    return $RETVAL
}

stop()
{
    echo -n $"Stopping $prog: "
    killproc -p $NGINX_PID $NGINX_SBIN -TERM
    rm -rf /dev/shm/nginx_temp
    RETVAL=$?
    echo
    return $RETVAL
}

reload()
{
    echo -n $"Reloading $prog: "
    killproc -p $NGINX_PID $NGINX_SBIN -HUP
    RETVAL=$?
    echo
    return $RETVAL
}

restart()
{
    stop
    start
}

configtest()
{
    $NGINX_SBIN -c $NGINX_CONF -t
    return 0
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  reload)
        reload
        ;;
  restart)
        restart
        ;;
  configtest)
        configtest
        ;;
  *)
        echo $"Usage: $0 {start|stop|reload|restart|configtest}"
        RETVAL=1
esac

exit $RETVAL

编辑完成后,给这个启动脚本文件设置755权限:

chmod 755 /etc/init.d/nginx

把nginx服务添加到服务列表,并设置开机启动:

chkconfig --add nginx
chkconfig nginx on

进入nginx的conf目录:

cd /usr/local/nginx/conf

然后重命名一下配置文件:

mv nginx.conf nginx.conf.bak

因为不使用nginx自带的配置文件,所以需要编辑一个配置文件:

vim /etc/init.d/nginx
user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

events
{
    use epoll;
    worker_connections 6000;
}

http
{
    include mime.types;
    default_type application/octet-stream;
    server_names_hash_bucket_size 3526;
    server_names_hash_max_size 4096;
    log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
    ' $host "$request_uri" $status'
    ' "$http_referer" "$http_user_agent"';
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 30;
    client_header_timeout 3m;
    client_body_timeout 3m;
    send_timeout 3m;
    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 8 4k;
    request_pool_size 4k;
    output_buffers 4 32k;
    postpone_output 1460;
    client_max_body_size 10m;
    client_body_buffer_size 256k;
    client_body_temp_path /usr/local/nginx/client_body_temp;
    proxy_temp_path /usr/local/nginx/proxy_temp;
    fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
    fastcgi_intercept_errors on;
    tcp_nodelay on;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 8k;
    gzip_comp_level 5;
    gzip_http_version 1.1;
    gzip_types text/plain application/x-javascript text/css text/htm 
    application/xml;

    server
    {
        listen 80;
        server_name localhost;
        index index.html index.htm index.php;
        root /usr/local/nginx/html;

        location ~ \.php$ 
        {
            include fastcgi_params;
            fastcgi_pass unix:/tmp/php-fcgi.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
        }    
    }
}

检查配置文件有没有错误:

/usr/local/nginx/sbin/nginx -t

没有问题就可以启动nginx 了:

service nginx start

安装mysql,这是因为php需要用到mysql的驱动库,所以只需要安装即可,不需要进行配置:

[root@localhost ~]$ cd /usr/local/src/; yum install -y epel-release wget perl-Module-Install.noarch libaio*;wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz; tar -zxvf mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz; mv mysql-5.6.39-linux-glibc2.12-x86_64 ../mysql; cd /usr/local/mysql; mkdir /data/; useradd mysql; ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql; echo $? > /root/downloadMySQL.log" 

安装PHP:
批量执行命令:

[root@localhost ~]$ cd /usr/local/src/; yum -y install epel-release wget gcc gcc-c++ libmcrypt-devel libmcrypt libcurl-devel libxml2-devel openssl-devel bzip2-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel; wget http://cn2.php.net/distributions/php-5.6.30.tar.gz; tar -zxvf php-5.6.30.tar.gz; cd php-5.6.30/; ./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl  --with-openssl; echo $? > /root/downloadPHP.log; make && make install; echo $? >> /root/downloadPHP.log

安装完之后拷贝php的配置文件:

[root@localhost php-5.6.30]$ cp php.ini-production /usr/local/php-fpm/etc/php.ini

创建一个php-fpm.conf文件:

[root@localhost ~]$ vim /usr/local/php-fpm/etc/php-fpm.conf

# 内容如下:
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

拷贝启动脚本、更改文件权限、添加到服务列表里,并设置开机启动:

[root@localhost php-5.6.30]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@localhost php-5.6.30]#chmod 755 /etc/init.d/php-fpm
[root@localhost php-5.6.30]#chkconfig --add php-fpm
[root@localhost php-5.6.30]#chkconfig php-fpm on

添加php-fpm服务用户:

useradd -s /sbin/nologin php-fpm

使用php-fpm -t检测一下配置文件有没有问题:

[root@localhost ~]$ /usr/local/php-fpm/sbin/php-fpm -t

没有问题后就启动服务,并检查进程:

[root@localhost ~]$ service php-fpm start
Starting php-fpm  done
[root@localhost ~]$ ps aux |grep php-fpm

安装tomcat
安装tomcat之前要先安装jdk,jdk安装请参考上面安装mycat的过程
这里直接安装tomcat

[root@localhost src]$ wget http://mirrors.shuosc.org/apache/tomcat/tomcat-8/v8.5.24/bin/apache-tomcat-8.5.24.tar.gz
[root@localhost src]$ tar -zxvf apache-tomcat-8.5.24.tar.gz
[root@localhost src]$ mv apache-tomcat-8.5.24 /usr/local/tomcat

启动与关闭服务的命令:

/usr/local/tomcat/bin/startup.sh # 启动服务
/usr/local/tomcat/bin/shutdown.sh # 关闭服务

查看进程与端口:

netstat -lntp                                #三个端口8080 8009 8005
ps aux |grep java

⑤搭建discuz论坛、dedecms企业网站以及zrlog博客
1.搭建discuz论坛,先给discuz配置一个虚拟主机站点,先把nginx主配置文件nginx.conf中的server段删除

vim /usr/local/nginx/conf/nginx.conf
#删除server那段
 server
    {
        listen 80;
        server_name localhost;
        index index.html index.htm index.php;
        root /usr/local/nginx/html;

        location ~ \.php$ 
        {
            include fastcgi_params;
            fastcgi_pass unix:/tmp/php-fcgi.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
        }    
    }

删除后加上这一行,这是用来引用虚拟主机配置文件的:

include vhost/*.conf;

创建vhost目录:

mkdir /usr/local/nginx/conf/vhost

进入到vhost目录下,创建一个discuz.com.conf文件:

cd /usr/local/nginx/conf/vhost
vim discuz.com.conf       #添加下面的内容
server
{
    listen 80;
    server_name www.discuz.com;
    index index.html index.htm index.php;
    root /data/wwwroot/discuz.com;

        location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/discuz.com$fastcgi_script_name;
    }
}

创建站点目录:

mkdir -p /data/wwwroot/discuz.com/

2、开始安装Discuz
下载Discuz的压缩包:
Discuz的压缩包可以在官网下载自己需要的版本:http://www.discuz.net/forum.php

[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# wget http://download.comsenz.com/DiscuzX/3.3/Discuz_X3.3_SC_UTF8.zip

解压:

[root@localhost src]# unzip Discuz_X3.3_SC_UTF8.zip

解压后会有以下几个目录:

[root@localhost src]# ls
Discuz_X3.3_SC_UTF8.zip readme upload utility

把upload目录下所有的文件拷贝到discuz.com站点目录下:

[root@localhost src]# cp -r upload/* /data/wwwroot/discuz.com/

到windows上配置hosts文件,windows的hosts文件默认在这个目录下:

C:\Windows\System32\drivers\etc

在hosts文件中加上这一句:

192.168.66.132         www.discuz.com

保存之后就可以在浏览器访问 www.discuz.com 进入discuz的安装界面
2018-08-07大作业_第2张图片
然后就会进入目录、文件的权限检查界面,但是会发现这些目录或文件权限不足,所以都是不可写的状态:
2018-08-07大作业_第3张图片
用脚本把提示对应目录权限改成777,

[root@localhost ~]# cd /data/wwwroot/discuz.com/
[root@localhost discuz.com]# vim fileList.txt  # 先把路径都放在一个文本文件中
./config
./data
./data/cache
./data/avatar
./data/plugindata
./data/download
./data/addonmd5
./data/template
./data/threadcache
./data/attachment
./data/attachment/album
./data/attachment/forum
./data/attachment/group
./data/log
./uc_client/data/cache
./uc_server/data/
./uc_server/data/cache
./uc_server/data/avatar
./uc_server/data/backup
./uc_server/data/logs
./uc_server/data/tmp uc_server/data/view
[root@localhost discuz.com]# vim filePermission.sh
#!bin/bash
for file in `cat ./fileList.txt`
do
  chmod 777 $file
done

[root@localhost discuz.com]# sh ./filePermission.sh

刷新后
2018-08-07大作业_第4张图片
点击下一步:
2018-08-07大作业_第5张图片
选择“全新安装 Discuz! X,点击“下一步”,进入安装数据库的界面,如下图所示,需要注意的是数据库填的是主的IP,一会再去配置中改成mycat的地址
2018-08-07大作业_第6张图片
这里只需要输入你数据库root用户的密码,然后再设置一个admin密码就可以了,发送告警邮件的邮箱写不写都可以,剩下的会自动进行安装:
2018-08-07大作业_第7张图片
安装完成后点击访问即可
2018-08-07大作业_第8张图片
访问:
2018-08-07大作业_第9张图片
然后回到web服务器上修改discuz的配置文件。将dbhost,dbuser,dbpw,dbname中的参数改为和mycat一一对应。实现读写分离:

[root@localhost discuz.com]$ vim /data/wwwroot/discuz.com/config/config_global.php
// ----------------------------  CONFIG DB  ----------------------------- //
$_config['db']['1']['dbhost'] = '192.168.66.138:8066';
$_config['db']['1']['dbuser'] = 'discuz';
$_config['db']['1']['dbpw'] = '123456';
$_config['db']['1']['dbcharset'] = 'utf8';
$_config['db']['1']['pconnect'] = '0';
$_config['db']['1']['dbname'] = 'ultrax';
$_config['db']['1']['tablepre'] = 'pre_';
$_config['db']['slave'] = '';
$_config['db']['common']['slave_except_table'] = '';

## 修改完成后重启nginx
[root@localhost discuz.com]$ service nginx restart
Restarting nginx (via systemctl):                          [  确定  ]

然后登录discuz论坛的admin用户,能够成功登录代表没问题:
2018-08-07大作业_第10张图片
⑥搭建dedecms企业网站,同样的也需要先配置一个虚拟主机站点:
进入到vhost目录下,创建一个dedecms.com.conf文件:

cd /usr/local/nginx/conf/vhost
vim dedecms.com.conf

添加以下内容:

server
{
    listen 80;
    server_name www.dedecms.com;
    index index.html index.htm index.php;
    root /data/wwwroot/dedecms.com;

        location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/dedecms.com$fastcgi_script_name;
    }
}

创建站点目录:

mkdir -p /data/wwwroot/dedecms.com/

官网上下载Dedecms的压缩包,官网下载地址如下:

http://www.dedecms.com/products/dedecms/downloads/
这里下载的是5.7的UTF8版本的:

[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# wget http://updatenew.dedecms.com/base-v57/package/DedeCMS-V5.7-UTF8-SP2.tar.gz

下载之后解压到对应的目录

[root@localhost src]# tar -zxvf DedeCMS-V5.7-UTF8-SP2.tar.gz
[root@localhost src]# ls
DedeCMS-V5.7-UTF8-SP2
[root@localhost src]# cd DedeCMS-V5.7-UTF8-SP2
[root@localhos DedeCMS-V5.7-UTF8-SP2]# ls
docs  uploads
[root@localhost DedeCMS-V5.7-UTF8-SP2]#cp -r ./uploads/* /data/wwwroot/dedecms.com/

完成以上操作后,同样的配置一下windows上的hosts文件,然后使用浏览器访问
2018-08-07大作业_第11张图片
因为权限不足出现以下界面的情况:
2018-08-07大作业_第12张图片
把对应目录权限设置下:

[root@localhost dedecms.com]$ chmod 777 ./plus
[root@localhost dedecms.com]$ chmod 777 ./dede
[root@localhost dedecms.com]$ chmod 777 ./data
[root@localhost dedecms.com]$ chmod 777 ./a
[root@localhost dedecms.com]$ chmod 777 ./install
[root@localhost dedecms.com]$ chmod 777 ./special
[root@localhost dedecms.com]$ chmod 777 ./uploads/

赋予权限后刷新页面就好了:
2018-08-07大作业_第13张图片

设置数据库信息和管理员密码:
2018-08-07大作业_第14张图片
安装完成:
2018-08-07大作业_第15张图片
访问http://www.dedecms.com/dede/ 输入管理的用户密码后可以登录网站后台:
2018-08-07大作业_第16张图片
登陆成功
⑦搭建zrlog博客系统:
1.配置tomcat的虚拟主机,Tomcat在server.xml文件中配置虚拟主机:

[root@localhost ~]$ vim /usr/local/tomcat/conf/server.xml

# 在文件中增加以下内容:

        

2.创建相应的站点目录:

mkdir /data/wwwroot/zrlog.com

3.下载zrlog,并解压到站点目录下:

[root@localhost ~]$ cd /usr/local/src/
[root@localhost src]$ wget http://dl.zrlog.com/release/zrlog-1.7.1-baaecb9-release.war
[root@localhost src]$ unzip zrlog-1.7.1-baaecb9-release.war -d /data/wwwroot/zrlog.com

4.为了共享80端口还需要配置nginx反向代理tomcat,编辑主机配置文件:

[root@localhost ~]$ vim /usr/local/nginx/conf/vhost/zrlog.com.conf
## 文件内容如下
upstream zrlog_com
{
    ip_hash;
    server localhost:8080;
}
server
{
    listen 80;
    server_name www.zrlog.com;
    location /
    {
        proxy_pass      http://zrlog_com;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
[root@localhost ~]$  service nginx restart  # 重启nginx

5.重启tomcat服务:

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

6.配置好Windows上的hosts文件,然后使用浏览器访问 http://www.zrlog.com:
2018-08-07大作业_第17张图片
下一步后填写后台管理的帐号,安装成功
2018-08-07大作业_第18张图片
⑧给站点的后台访问做二次认证
首先安装httpd-tools:

yum install -y httpd-tools

然后使用httpd-tools里的htpasswd 命令去生成一个用户密码文件:

[root@localhost ~]$ htpasswd -c /usr/local/nginx/conf/htpasswd admin
New password: 
Re-type new password: 
Adding password for user admin

生成完成后cat一下htpasswd 文件可以看到如下内容:

[root@localhost ~]$ cat /usr/local/nginx/conf/htpasswd
admin:$apr1$73nmrAKd$7eSGO2h58BrAnUMekFt7P0

如果还需要再次添加用户的话就不需要加上-c选项了,加上-c选项会覆盖原来的htpasswd 文件。

编辑discuz的主机配置文件:

[root@localhost ~]$ vim /usr/local/nginx/conf/vhost/discuz.com.conf

    ## 添加以下内容,要记得添加在 location ~ \.php$ 上面
    location ~ admin.php
    {
        auth_basic              "Auth";
        auth_basic_user_file    /usr/local/nginx/conf/htpasswd; 
    }

重新加载nginx的配置文件:

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload

然后使用curl访问看看是否需要认证,结果如下则没问题:

[root@localhost ~]$ curl -x127.0.0.1:80 http://www.discuz.com/admin.php -I
HTTP/1.1 401 Unauthorized
Server: nginx/1.12.1
Date: Wed, 8 Aug 2018 11:01:40 GMT
Content-Type: text/html
Content-Length: 195
Connection: keep-alive
WWW-Authenticate: Basic realm="Auth"

最后指定用户名和密码访问看看是否成功,结果如下则没问题:

[root@localhost ~]$ curl -x127.0.0.1:80 -u admin:"123456" http://www.discuz.com/admin.php -I
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Wed, 8 Aug 2018 11:02:30 GMT
Content-Type: application/octet-stream
Content-Length: 2739
Last-Modified: Wed, 8 Aug 2018 11:02:40 GMT
Connection: keep-alive
ETag: "5a334add-ab3"
Accept-Ranges: bytes

配置dedecms,同样的也是需要编辑主机配置文件:

[root@localhost ~]$ vim /usr/local/nginx/conf/vhost/dedecms.com.conf

    ## 配置内容如下:
    location /dede/
    {
        auth_basic              "Auth";
        auth_basic_user_file    /usr/local/nginx/conf/htpasswd;  # 密码文件路径
    }

然后重新加载nginx,同样的使用curl访问看看是否需要认证:

[root@localhost ~]$ curl -x127.0.0.1:80 http://www.dedecms.com/dede/ -I
HTTP/1.1 401 Unauthorized
Server: nginx/1.12.1
Date:Wed, 8 Aug 2018 11:05:35   GMT
Content-Type: text/html
Content-Length: 195
Connection: keep-alive
WWW-Authenticate: Basic realm="Auth"

最后是zrlog,编辑nginx的反向代理配置文件:

[root@localhost ~]$ vim /usr/local/nginx/conf/vhost/zrlog.com.conf
    ## 在location / 的上面添加以下这段内容:
    location /admin/
    {
        auth_basic              "Auth";
        auth_basic_user_file    /usr/local/nginx/conf/htpasswd;
        proxy_pass      http://zrlog_com/admin/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

重启nginx

[root@localhost ~]$ service nginx restart

测试是否需要验证

[root@localhost ~]$ curl -x127.0.0.1:80  http://www.zrlog.com/admin/ -I
HTTP/1.1 401 Unauthorized
Server: nginx/1.12.1
Date: Wed, 8 Aug 2018 11:10:25  GMT
Content-Type: text/html
Content-Length: 195
Connection: keep-alive
WWW-Authenticate: Basic realm="Auth"

如果出现访问首页正常但是访问管理页面nginx却报404错误的情况,首先确认好配置文件是正确,重启nginx依旧不正常的话,就试一下使用killall命令杀掉nginx进程,能让进程将内存数据都写入到磁盘中,然后再启动nginx
⑨.分配目录文件权限
discuz的目录、文件权限之前在安装的时候分配好了,现在把install目录给删除即可:

[root@localhost ~]$ cd /data/wwwroot/discuz.com
[root@localhost /data/wwwroot/discuz.com]$ rm -rf install/

然后设置dedecms的目录、文件权限,下面是dedecms官网的目录安全配置说明:

1、目录权限
我们不建议用户把栏目目录设置在根目录, 原因是这样进行安全设置会十分的麻烦, 在默认的情况下,安装完成后,目录设置如下:
(1) data、templets、uploads、a或5.3的html目录, 设置可读写,不可执行的权限;
(2) 不需要专题的,建议删除 special 目录, 需要可以在生成HTML后,删除 special/index.php 然后把这目录设置为可读写,不可执行的权限;
(3) include、member、plus、后台管理目录 设置为可执行脚本,可读,但不可写入(安装了附加模块的,book、ask、company、group 目录同样如此设置)。

2、其它需注意问题
(1) 虽然对 install 目录已经进行了严格处理, 但为了安全起见,我们依然建议把它删除;
(2) 不要对网站直接使用MySQL root用户的权限,给每个网站设置独立的MySQL用户帐号,许可权限为:

代码如下 复制代码 
SELECT, INSERT , UPDATE , DELETE
CREATE , DROP , INDEX , ALTER , CREATE TEMPORARY TABLES

我尝试按照说明去修改权限结果出现网站无法访问的问题,于是实践过后发现只需要更改以下几个目录的权限即可:

[root@localhost /data/wwwroot]$ cd dedecms.com/
[root@localhost /data/wwwroot/dedecms.com]$ chmod 766 ./uploads
[root@localhost /data/wwwroot/dedecms.com]$ chmod 766 ./a
[root@localhost /data/wwwroot/dedecms.com]$ chmod 755 ./plus
[root@localhost /data/wwwroot/dedecms.com]$ chmod 644 data/common.inc.php
[root@localhost /data/wwwroot/dedecms.com]$ rm -rf install/
[root@localhost /data/wwwroot/dedecms.com]$ mv ./special/ /tmp/

zrlog的就默认即可,因为默认都是755、644的权限。

最后将配置文件和站点目录使用之前的脚本都同步到其他web服务器上,同步/data/目录和/usr/local/目录即可。

⑩.配置机器中web服务器的静态文件共享,这一步我们使用NFS完成
1.服务端需要安装nfs-utils和rpcbind包,安装命令:

yum install -y nfs-utils rpcbind

2.客户端需要安装nfs-utils包,安装命令,使用脚本批量安装:

yum install -y nfs-utils

3.确定需要共享的目录:

discuz需要共享的目录是:/data/wwwroot/discuz.com/data/attachment/
dedecms需要共享的目录是:/data/wwwroot/dedecms.com/uploads/
zrlog需要共享的目录是:/data/wwwroot/zrlog.com/attached/
然后给这些目录777的权限

4.为了安全性需要限定共享的ip,所以需要编写一个简单的循环脚本,批量在服务端的/etc/exports文件中写入配置,脚本内容如下:

file=$1
for i in `seq 3 7`
do
   echo "$file 192.168.66.13$i/24(rw,sync,no_root_squash)" >> /etc/exports
done
# 执行脚本,参数是需要共享的目录路径
[root@localhost ~]$ sh forIP.sh "/data/wwwroot/discuz.com/data/attachment/"
[root@localhost ~]$ sh forIP.sh "/data/wwwroot/dedecms.com/uploads/"
[root@localhost ~]$ sh forIP.sh "/data/wwwroot/zrlog.com/attached/"

执行完脚本之后,/etc/exports文件内容如下:

/data/wwwroot/discuz.com/data/attachment/ 192.168.66.133/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/discuz.com/data/attachment/ 192.168.66.134/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/discuz.com/data/attachment/ 192.168.66.135/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/discuz.com/data/attachment/ 192.168.66.136/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/discuz.com/data/attachment/ 192.168.66.137/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/dedecms.com/uploads/ 192.168.66.133/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/dedecms.com/uploads/ 192.168.66.134/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/dedecms.com/uploads/ 192.168.66.135/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/dedecms.com/uploads/ 192.168.66.136/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/dedecms.com/uploads/ 192.168.66.137/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/zrlog.com/attached/ 192.168.66.133/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/zrlog.com/attached/ 192.168.66.134/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/zrlog.com/attached/ 192.168.66.135/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/zrlog.com/attached/ 192.168.66.136/24(rw,sync,anonuid=1000,anongid=1000)
/data/wwwroot/zrlog.com/attached/ 192.168.66.137/24(rw,sync,anonuid=1000,anongid=1000)

5.使用之前的批量命令脚本查看机器有没有监听111端口,一般来讲安装完nfs之后就会自动启动服务并监听端口的,如果没有启动的话,就手动启动一下,命令如下:

systemctl start rpcbind
systemctl start nfs

6.置rpcbind和nfs服务开机启动:

systemctl enable rpcbind
systemctl enable nfs

7.把共享的目录分别挂载到各个客户端上
使用Keepalived结合nginx负载均衡

192.168.66.100       VIP
192.168.66.130       前端nginx负载主机+keepalived
192.168.66.131       前端nginx负载备机+keepalived

分别在130和131的机器安装keepalived+nginx

yum install -y keepalived

nginx源码安装参考上面的过程(两台都要配置)
安装好之后新增一个nginx虚拟主机配置文件

vi /usr/local/nginx/conf/vhost/lb.conf
upstream lb
{
    ip_hash;
    server 192.168.66.132:80;
    server 192.168.66.133:80;
         server 192.168.66.134:80;
         server 192.168.66.135:80;
        server 192.168.66.136:80;
        server 192.168.66.137: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;
    }
}

更改130的keepalived配置文件
默认的配置文件路径在/etc/keepalived/keepalived.conf
清空文件内容

> /etc/keepalived/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 aminglinux>com
    }
    virtual_ipaddress {
        192.168.66.100
    }
    track_script {
        chk_nginx
    }
}

这里需要注意的是:"virtual_ipaddress"也就是所谓的vip我们设置为192.168.66.100
2.定义监控脚本
脚本路径在keepalived配置文件中有定义,路径为/usr/local/sbin/check_ng.sh
编辑配置文件:

vim /usr/local/sbin/check_ng.sh
增加以下内容:
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
        /etc/init.d/nginx start
        n2=`ps -C nginx --no-heading|wc -l`
        if [ $n2 -eq "0"  ]; then
                echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
                systemctl stop keepalived
        fi
fi

3.脚本创建完之后,还需要改变脚本的权限

chmod 755 /usr/local/sbin/check_ng.sh

4.启动keepalived服务,因为,上面定义了检测nginx服务,所有会自动把nginx带起来

systemctl start keepalived

5.查看是否加载了vip

[root@localhost ~]# ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:a4:dd:e8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.66.130/24 brd 192.168.66.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.66.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::3116:74ed:1d0a:3851/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

131机器的keepalived配置

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 BACKUP        //这里 和master不一样的名字
    interface eno33      //网卡和当前机器一致,否则无法启动keepalived服务
    virtual_router_id 51        //和主机器 保持一致
    priority 90            //权重,要比主机器小的数值
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass aminglinux>com
    }
    virtual_ipaddress {
        192.168.66.100   VIP和主上一致
    }
    track_script {
        chk_nginx
    }
}

nginx配置和脚本和130机器一样
最后测试访问VIP三个站点正常即可

转载于:https://blog.51cto.com/13736286/2156168

你可能感兴趣的:(php,开发工具,java)