需求1:
共享静态文件,比如discuz需要共享的目录是 data/attachment,dedecms需要共享upload(具体目录,你可以先上传一个图片,查看图片所在目录)
实现方案:
这一步我们选择使用nfs来共享这三个站点的静态文件,其中拿出来一台服务器单独做nfs服务端,然后6台web服务器做客户端。
- 假设这七台机器IP分布如下:
web1 | 192.168.100.1 |
web2 | 192.168.100.2 |
web3 | 192.168.100.3 |
web4 | 192.168.100.4 |
web5 | 192.168.100.5 |
web6 | 192.168.100.6 |
NFS服务器 | 192.168.100.10 |
- 需要共享的目录:
discuz需要共享的目录:/data/wwwroot/discuz.com/data/attachment/
dedecms需要共享的目录:/data/wwwroot/dedecms.com/uploads/
zrlog需要共享的目录:/data/wwwroot/zrlog.com/attached/
步骤:
1.在服务端安装nfs-utils和rpcbind包,安装命令:
yum install -y nfs-utils rpcbind
2.在6台客户端上安装nfs-utils包并且启动rpcbind服务,安装命令:
yum install -y nfs-utils
ststemctl start rpcbind
systemctl enable rpcbind //设置开机启动
3.在服务端创建好三个共享目录并且修改权限为777
mkdir -p /data/wwwroot/discuz.com/data/attachment/ //创建discuz的共享目录
chmod 777 /data/wwwroot/discuz.com/data/attachment/
mkdir -p /data/wwwroot/dedecms.com/uploads/ //创建dedecms的共享目录
chmod 777 /data/wwwroot/dedecms.com/uploads/
mkdir -p /data/wwwroot/zrlog.com/attached/ //创建zrlog的共享目录
chmod 777 /data/wwwroot/zrlog.com/attached/
4.在服务端的/etc/exports文件中写入配置,内容如下:
[root@locahost ~]# vim /etc/exports
/data/wwwroot/discuz.com/data/attachment/ 192.168.100.0/24(rw,sync,no_root_squash)
/data/wwwroot/dedecms.com/uploads/ 192.168.100.0/24(rw,sync,no_root_squash)
/data/wwwroot/zrlog.com/attached/ 192.168.100.0/24(rw,sync,no_root_squash)
5.开启rpcbind和nfs服务,关闭防火墙,并设开机启动
[root@localhost ~]# systemctl start rpcbind
[root@localhost ~]# systemctl start nfs
[root@localhost ~]#systemctl enable rpcbind
[root@localhost ~]#systemctl enable nfs
[root@localhost ~]#systemctl stop firewalld
配置客户端:
1.查看一下服务端共享的哪些目录:
[root@localhost ~]$ showmount -e 192.168.100.7
Export list for 192.168.100.7:
/data/wwwroot/zrlog.com/attached 192.168.100.0/24
/data/wwwroot/dedecms.com/uploads 192.168.100.0/24
/data/wwwroot/discuz.com/data/attachment 192.168.100.0/24
可以看到客户端已经能正常获取到服务端共享的三个站点的静态文件目录了。
2.挂载共享目录:
[root@localhost ~]$ mount -t nfs 192.168.100.7:/data/wwwroot/zrlog.com/attached /data/wwwroot/zrlog.com/attached
[root@localhost ~]$ mount -t nfs 192.168.100.7:/data/wwwroot/dedecms.com/uploads /data/wwwroot/dedecms.com/uploads
[root@localhost ~]$ mount -t nfs 192.168.100.7:/data/wwwroot/discuz.com/data/attachment /data/wwwroot/discuz.com/data/attachment
## 然后在客户端的挂载目录下创建个文件看看是否同步到服务器上,服务端也需要创建一个文件看看是否能够同步到客户端上:
[root@localhost ~]$ touch /data/wwwroot/zrlog.com/attached/test153.txt
[root@localhost ~]$ touch /data/wwwroot/dedecms.com/uploads/test153.txt
[root@localhost ~]$ touch /data/wwwroot/discuz.com/data/attachment/test153.txt
## 服务端上查看:
[root@localhost ~]$ ls /data/wwwroot/zrlog.com/attached/test153.txt
/data/wwwroot/zrlog.com/attached/test153.txt
[root@localhost ~]$ ls /data/wwwroot/dedecms.com/uploads/test153.txt
/data/wwwroot/dedecms.com/uploads/test153.txt
[root@localhost ~]$ ls /data/wwwroot/discuz.com/data/attachment/test153.txt
/data/wwwroot/discuz.com/data/attachment/test153.txt
[root@localhost ~]$
## 同样的服务端也需要创建测试文件,然后到客户端上查看
确定第一台客户端可以正常共享目录后,再去另外五台客户端上也把这三个目录挂载一下。操作和第一台一致。
至此,web静态文件的目录就共享完成了,所有用户的静态文件都将写入到我们这台nfs服务器的三个共享目录中。
需求二:
用shell脚本实现文件、代码同步上线(参考分发系统)
1.使用脚本编写一个简单的文件分发系统即可。
- 首先用expect编写一个脚本文件rsync.expect,这个脚本是通过rsync实现文件同步的脚本,内容如下:
[root@localhost sbin]# vim rsync.expect //写入下面内容
#! /usr/bin/expect
set passwd "123456" //这里假设我们的web服务器的密码全部统一为123456
set host [lindex $argv 0] //这里指的是我们web服务器的ip
set file [lindex $argv 1] //指的是list.txt ,表示我们需要分发的那些文件的列表而不仅仅是一个文件
spawn rsync -avR --files-from=$file / root@$host:/ //核心命令,其中-R选项是表示如果对端机器上没有我们需要同步的文件的路径的话就会自动创建这个路径
expect {
"yes/no" { send "yes\r" }
"password:" { send "$passwd\r" }
}
export eof
- 然后编辑file.list,写入我们需要同步的所有文件的绝对路径:
[root@localhost sbin]# vim /tmp/file.list //假设我们要同步的文件列表是下面的这些
/usr/local/nginx/conf/vhost/dedecms.com.conf
/usr/local/nginx/conf/vhost/discuz.com.conf
/usr/local/nginx/conf/vhost/zrlog.com.conf
/usr/local/sbin/nginx_log_rotate.sh
/var/spool/cron/root
- 然后接着编辑ip.list,写入6台web服务器的ip地址:
[root@localhost sbin]# vim /tmp/ip.list //写入web服务器的ip
192.168.100.1
192.168.100.2
192.168.100.3
192.168.100.4
192.168.100.5
192.168.100.6
- 再编写一个shell脚本rsync.sh,这个脚本就是遍历出ip.list文件内容然后交给rsync.expect脚本去执行:
[root@localhost sbin]# vim rsync.sh //写入下面内容
#! /bin/bash
for ip in `cat /tmp/ip.list`
do
./rsync.expect $ip /tmp/file.list
done
- .最后我们只需要执行rsync.sh脚本即可实现批量同步多个文件:
[root@localhost sbin]# chmod a+x rsync.expect
[root@localhost sbin]# sh rsync.sh
后续如果还需要上线别的代码文件,只需要修改/tmp/file.list 这个文件把新的代码文件路径加上去即可。