业务需求:
用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、架构图
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具有增删改查的权限
<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中间件。
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
# 配置内容如下:
<?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" />
<dataNode name="dn1" dataHost="localhost1" database="ultrax" />
<dataNode name="dn2" dataHost="localhost1" database="DedeCMS" />
<dataNode name="dn3" dataHost="localhost1" database="zrlog" />
<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.66.139:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="192.168.66.140:3306" user="root" password="123456" />
<readHost host="hostS2" url="192.168.66.141:3306" user="root" 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.66.139:3306" user="mycat" password="123456">
<readHost host="hostS1" url="192.168.66.140:3306" user="mycat" password="123456" />
<readHost host="hostS2" url="192.168.66.141:3306" user="mycat" password="123456" />
</writeHost>
</dataHost> 数据主机标签;
</mycat:schema> 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的安装界面
然后就会进入目录、文件的权限检查界面,但是会发现这些目录或文件权限不足,所以都是不可写的状态:
用脚本把提示对应目录权限改成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
刷新后
点击下一步:
选择“全新安装 Discuz! X,点击“下一步”,进入安装数据库的界面,如下图所示,需要注意的是数据库填的是主的IP,一会再去配置中改成mycat的地址
这里只需要输入你数据库root用户的密码,然后再设置一个admin密码就可以了,发送告警邮件的邮箱写不写都可以,剩下的会自动进行安装:
安装完成后点击访问即可
访问:
然后回到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用户,能够成功登录代表没问题:
⑥搭建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文件,然后使用浏览器访问
因为权限不足出现以下界面的情况:
把对应目录权限设置下:
[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/
赋予权限后刷新页面就好了:
设置数据库信息和管理员密码:
安装完成:
访问http://www.dedecms.com/dede/ 输入管理的用户密码后可以登录网站后台:
登陆成功
⑦搭建zrlog博客系统:
1.配置tomcat的虚拟主机,Tomcat在server.xml文件中配置虚拟主机:
[root@localhost ~]$ vim /usr/local/tomcat/conf/server.xml
# 在文件中增加以下内容:
<Host name="www.zrlog.com" appBase=""
unpackWARs= "true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/data/wwwroot/zrlog.com/" debug="0" reloadable="true" crossContext="true"/>
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:
下一步后填写后台管理的帐号,安装成功
⑧给站点的后台访问做二次认证
首先安装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 {
aming@aminglinux.com
}
notification_email_from root@aminglinux.com
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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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 {
aming@aminglinux.com
}
notification_email_from root@aminglinux.com
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