实战内容:
使用三台Linux服务器,一台设备安装Nginx作为反向代理,两台设备部署LAP(发布两个网站wordpress、discuz)+ 两台Mysql(主从同步、可以公用)
在此集群架构部署中,配置不再过于详细描述,有细节问题可以翻阅之前的LAMP源码部署笔记;
1、拓扑:

2、部署LAMP、Mysql主从同步、授权wordpress,discuz;
部署在两台设备上:
Lamp1:192.168.169.202 Lamp2:192.168.169.203
1)、安装各种软件包:
[root@Lamp1 ~]# yum install -y httpd mariadb mariadb-server php php-mysql php-devel mysql-devel
[root@Lamp2 ~]# yum install -y httpd mariadb mariadb-server php php-mysql php-devel mysql-devel
yum安装的Apache,默认在conf.d目录下存在php.conf,所以默认LAMP就关联起来了;
2)、配置Mysql主从同步:Lamp1作为Master Lamp2作为Slave
A: Lamp1上做如下配置:
在/etc/my.cnf中添加如下内容:
log-bin=mysql-binlog-master
server-id=1
systemctl start mariadb
[root@Lamp1 ~]# mysql
MariaDB [(none)]> grant replication slave on *.* to 'slave'@'192.168.169.203' identified by '123456';
MariaDB [(none)]> create database wordpress;
MariaDB [(none)]> create database discuz;
MariaDB [mysql]> grant all on wordpress.* to 'wordpress'@'%' identified by 'wordpress';
MariaDB [mysql]> grant all on discuz.* to 'discuz'@'%' identified by 'discuz';
查看position和二进制文件名,并作记录:
mysql-binlog-master.000003 871

B: Lamp2上做如下配置:
在/etc/my.cnf中添加如下内容
server-id=3
systemctl start mariadb
MariaDB [(none)]> change master to
-> master_host='192.168.169.202',
-> master_user='slave',
-> master_password='123456',
-> master_log_file='mysql-binlog-master.000003', #与Master上一致
-> master_log_pos=871; #与Master上一致
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G #查看同步状态
C:Lamp1上做如下配置:
[root@Lamp1 ~]# mysqldump -A --events > backup.sql
[root@Lamp1 ~]# scp backup.sql root@192.168.169.203:/etc/
D:Lamp2上做如下配置:
MariaDB [(none)]> stop slave; #先停止同步
[root@Lamp2 ~]# mysql < /etc/backup.sql #导入数据库
MariaDB [(none)]> start slave; #开启同步
MariaDB [(none)]> select user from mysql.user; #使用该命令查看之前在Master上创建的用户就有了;
需要C和D的过程是因为两个数据库在开启同步之前的数据是不会被同步的;如果先开启同步,然后再创建wordpress、discuz用户就不需要C和D的导入数据库的操作;
3、配置Lamp1上的Apache虚拟主机,然后同步给Lamp2;
1)、配置Lamp1内容如下
在配置文件中添加如下内容:
[root@Lamp1 ~]# vim /etc/httpd/conf/httpd.conf
Include /usr/local/domain
修改#ServerName www.example.com:80 为 ServerName 127.0.0.1:80
创建domain:
[root@Lamp1 ~]# mkdir -p /usr/local/domain
创建虚拟主机文件:
[root@Lamp1 ~]# cd /usr/local/domain/
[root@Lamp1 domain]# touch bbs.zhanggeng.com
[root@Lamp1 domain]# touch blog.zhanggeng.com
基于域名的虚拟主机内容如下:
bbs.zhanggeng.com内容:
<VirtualHost *:80>
ServerAdmin 1216653470@qq.com
DocumentRoot "/var/www/html/discuz"
ServerName bbs.zhanggeng.com
ErrorLog "logs/bbs-error_log"
CustomLog "logs/bbs-access_log" common
</VirtualHost>
blog.zhanggeng.com内容:
<VirtualHost *:80>
ServerAdmin 1216653470@qq.com
DocumentRoot "/var/www/html/wordpress"
ServerName blog.zhanggeng.com
ErrorLog "logs/blog-error_log"
CustomLog "logs/blog-access_log" common
</VirtualHost>
在/var/www/html/下创建wordpress以及discuz:
[root@Lamp1 domain]# mkdir -p /var/www/html/{discuz,wordpress}
检测Apache语法:
[root@Lamp1 ~]# httpd -t
Syntax OK
上传Discuz和Wordpress:

yum install -y unzip #安装解压工具
解压,并将upload目录中的东西都放到discuz目录下:
[root@Lamp1 ~]# unzip Discuz_X3.2_SC_GBK.zip -d /var/www/html/discuz/
[root@Lamp1 ~]# cd /var/www/html/discuz/
[root@Lamp1 discuz]# cp -a upload/* .
解压,并将解压出的内容都放到创建的wordpress目录下,将解压出的目录删除掉:
[root@Lamp1 ~]# unzip wordpress-4.8.zip -d /var/www/html/wordpress/
[root@Lamp1 ~]# cd /var/www/html/wordpress/
[root@Lamp1 wordpress]# cp -a wordpress/* .
[root@Lamp1 wordpress]# rm -rf wordpress/
修改属主属组:
[root@Lamp1 ~]# chown -R apache.apache /var/www/html/
由于是用基于域名做的虚拟主机,所以访问的时候不能使用IP地址,需要使用域名:
修改本地hosts,添加内容:
192.168.169.202 bbs.zhanggeng.com blog.zhanggeng.com
systemctl restart httpd
访问域名:由于还没有进行安装,所以访问时302重定向安装路径,属于正常:

在自己电脑本地修改host文件:
192.168.169.202 bbs.zhanggeng.com
192.168.169.202 blog.zhanggeng.com
由于是基于域名的虚拟主机,得用域名访问:


2)、将Lamp1 的Apache内容同步给 Lamp2
# -r 表示递归
[root@Lamp1 ~]# scp -r /var/www/html/ root@192.168.169.203:/var/www/html/
[root@Lamp1 ~]# scp -r /usr/local/domain/ root@192.168.169.203:/usr/local/domain/
[root@Lamp1 ~]# scp /etc/httpd/conf/httpd.conf root@192.168.169.203:/etc/httpd/conf/
在Lamp2上hosts添加解析,并修改属主属组:
[root@Lamp2 ~]# vim /etc/hosts
192.168.169.203 bbs.zhanggeng.com blog.zhanggeng.com
[root@Lamp2 ~]# chown -R apache.apache /var/www/html/
两个域名能够正常访问:

4、Nginx负载均衡+虚拟主机内容
LB:192.168.169.201 该主机上已经部署了Nginx,部署过程在前一篇文章中描述过了;可以参考Nginx入门与安装,将其搭建出来;
在Nginx配置文件中,如下标红部分Nginx虚拟主机配置:
配置文件路径:/usr/local/nginx/conf/nginx.conf
将标红部分删除,做include调用;

标红内容:
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
修改为:

[root@LB ~]# mkdir -p /usr/local/domain
[root@LB ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@LB ~]#
[root@LB ~]# cd /usr/local/domain/
[root@LB domain]# touch bbs.zhanggeng.com
[root@LB domain]# touch blog.zhanggeng.com
Nginx基于域名的虚拟主机内容如下:
bbs.zhanggeng.com内容:
upstream web_discuz { #类似于Service-group
server 192.168.169.202:80;
server 192.168.169.203:80;
}
server {
listen 80;
server_name bbs.zhanggeng.com; #定义访问的域名bbs
location / {
root html;
index index.html index.htm;
proxy_set_header Host $host;
proxy_pass http://web_discuz; #启动代理,当有人访问bbs调用web_discuz内容
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
注释:用户使用域名访问Nginx,然后Nginx通过判断域名将请求跳转到后端Web服务器的IP地址上,到Web服务器上之后,由于是IP地址访问的,所以Web服务器没办法辨别是访问wordpress还是discuz的,因此需要 proxy_set_header Host $host 参数,将域名也传递给后端Web服务器;在upstream参数里面,用户访问的时候,会在两个地址之间进行1:1轮询;
blog.zhanggeng.com内容:
upstream web_wordpress {
server 192.168.169.202:80;
server 192.168.169.203:80;
}
server {
listen 80;
server_name blog.zhanggeng.com;
location / {
root html;
index index.html index.htm;
proxy_set_header Host $host;
proxy_pass http://web_wordpress;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
[root@LB domain]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@LB domain]# /usr/local/nginx/sbin/nginx -s reload
修改本地windows的host:
192.168.169.201 bbs.zhanggeng.com
192.168.169.201 blog.zhanggeng.com
本地访问测试:修改host之后访问Nginx成功跳转:如下


至此,该集群架构基本完成。
5、配置Apache Web服务器两边使用inotifywait同步(选做部分)
[root@Lamp1 ~]# yum install -y rsync
[root@Lamp2 ~]# yum install -y rsync
[root@Lamp1 ~]# ssh-keygen
[root@Lamp1 ~]# ssh-copy-id 192.168.169.203
[root@Lamp2 ~]# ssh-keygen
[root@Lamp2 ~]# ssh-copy-id 192.168.169.202
[root@Lamp1 ~]# yum install -y gcc gcc-c++
[root@Lamp2 ~]# yum install -y gcc gcc-c++
rz上传inotify,并解压、编译安装:
Lamp1 和 Lamp2 都需要操作:
[root@Lamp1 ~]# tar xf inotify-tools-3.13.tar.gz
[root@Lamp1 ~]# cd inotify-tools-3.13
[root@Lamp1 inotify-tools-3.13]# ./configure
[root@Lamp2 ~]# tar xf inotify-tools-3.13.tar.gz
[root@Lamp2 ~]# cd inotify-tools-3.13
[root@Lamp2 inotify-tools-3.13]# ./configure


[root@Lamp1 inotify-tools-3.13]# make && make install
[root@Lamp2 inotify-tools-3.13]# make && make install
在Lamp1 和 Lamp2 编写脚本:
[root@Lamp1 ~]# vim rsync.sh
inotifywait -mrq -e create,move,modify,delete,attrib /var/www/html/ | while read a b c
do
rsync -azP /var/www/html/ root@192.168.169.203:/var/www/html/
done
[root@Lamp1 ~]# scp rsync.sh 192.168.169.203:/root/
[root@Lamp2 ~]# vim rsync.sh
inotifywait -mrq -e create,move,modify,delete,attrib /var/www/html/ | while read a b c
do
rsync -azP /var/www/html/ root@192.168.169.202:/var/www/html/
done
[root@Lamp1 ~]# chmod +x rsync.sh
[root@Lamp2 ~]# chmod +x rsync.sh
[root@Lamp1 ~]# ./rsync.sh & #后台运行该脚本
[root@Lamp2 ~]# ./rsync.sh & #后台运行该脚本
做到这里需要保存快照方便后面的实验,快照名称:LAMP+Nginx集群架构-1
后面相关Nginx调优以及在该架构上增加内容,都基于快照LAMP+Nginx集群架构-1 来进行部署实验。
本博客中Nginx相关博文,都是从头到尾相关联的,需要读者从头至尾阅读;