nginx读写分离和notify测试

实验环境:
四台主机,一台kvm3作为客户端做测试.
另外三台组成一个小型的nginx读写分离架构,一台安装nginx做前端代理,另外两台安装apache做为后端的服务器。
kvm3:192.168.122.10
nginx:10.30.162.142
apache:kvm1(写):192.168.122.143、kvm2(读):192.168.122.140
以上主机全部做过解析
一、
配置后端两台apache服务器:
1.1、配置用作读的apache,略
1.2、配置用作写的apache服务器
后端的服务器使用的是Apache,apache想要支持上传文件,需借助于WebDAV协议,需要在apache启动时加载WebDAV的模块。

1、确保kvm1服务器开启DAV功能,确保Apache配置文件加载了DAV相关模块 
[root@kvm1 conf.modules.d]# cat 00-dav.conf
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_lock_module modules/mod_dav_lock.so

[root@kvm1 ~]# vim /etc/httpd/conf/httpd.conf
在相应网页根目录授权段中开启DAV 
<Directoy "/var/www/html">
	....
	dav on 
</Directory>
[root@kvm1 ~]# systemctl  restart httpd

2、确保运行httpd进程的apache用户对网页根目录拥有写入权限
[root@kvm1 ~]# setfacl -m u:apache:rwx /var/www/html/

3、客户端测试上传文件
[root@kvm3 ~] curl -T /etc/issue http://kvm1 
[root@kvm1 ~]# cd /var/www/html/
[root@kvm1 html]# ls
index.html  issue

二、配置前端nginx代理

#安装二进制nginx,配置上传文件(写)的后端apache是kvm1,读是kvm2
[root@proxy ~]# vim /etc/nginx/conf.d/default.conf
location / {
      proxy_pass http://kvm2;

      proxy_set_header Host $host;
      proxy_set_header x-real-ip $remote_addr;
      if ($request_method = PUT){
       proxy_pass http://kvm1;
            }
    }
#测试代理,读的测试略。
[root@kvm3 ~] curl -T /etc/hosts http://proxy
[root@kvm1 html]# ls
index.html  issue hosts

问题:一个client将一个文件上传到apache写服务器(kvm1)上,但是访问的却是apache读(kvm2)服务器,那么就看不到这个文件了!所以需要让写服务器的/var/www/html下的文件随时的同步到读服务器主机上。
两种解决办法:
1、后端两台服务器通过rsync+inotify进行数据同步,保证上传的数据可以同步到后端所有服务器上
2、做一个存储服务器,通过NFS共享在102和103分别挂载使用

三、要做写服务器的/var/www/html同步到读服务器的此目录下。
在读服务器设置如下

[root@kvm2 ~]# yum -y install rsync
[root@kvm2 ~]# vim /etc/rsyncd.conf 
uid = root   #设置rsync运行权限为root
gid = root  #设置rsync运行权限为root
use chroot = no   #默认为true,修改为no,增加对目录文件软连接的备份
port = 873     #默认端口
max connections = 2000  
pid file = /var/run/rsyncd.pid   #自定义,启动创建
log file = /var/log/rsyncd.log       #自定义,启动创建
lock file = /var/run/rsyncd.lock      #自定义,启动创建 
log format = %t %a %m %f %b
#exclude = lost+found/ 
##transfer logging = yes
#timeout = 200
  
[rsync]  #模块名
path = /var/www/html/  #rsync服务端数据目录路径
commemt = rsync  #模块名称与自定义名称相同
list = yes   #不显示rsync服务端资源列表
read only = no 
write only = no
auth users = test   #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
secrets file = /etc/rsyncd.secret  #用户认证配置文件,里面保存用户名称和密码,文件自定义
ignore errors = yes   
hosts allow = 192.168.122.0/255 #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = 0.0.0.0/32  #禁止进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开

创建用户认证配置文件的目录,修改权限为600,拥有者是root
[root@kvm2 ~]# echo "test:test123" > /etc/rsyncd.secret    #格式为  用户:密码
[root@kvm2 ~]# chmod 600 /etc/rsyncd.secret
[root@kvm2 ~]# ll /etc/rsyncd.secret
-rw------- 1 root root 13 Oct 20 11:07 /etc/rsyncd.secret
[root@kvm2 ~]# systemctl restart rsyncd.service 

写服务器端操作:安装rsync同步,通过inotify自动同步
1、安装rsync,配置如下
[root@kvm1 ~]# cat /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
port = 873
max connections = 2000
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log 
lock file = /var/run/rsyncd.lock
log format = %t %a %m %f %b
#exclude = lost+found/
#transfer logging = yes
timeout = 200
#ignore nonreadable = yes
#dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
[rsync]
path = /var/www/html/
commemt = rsync
list = yes
read only = no
write only = no
auth users = test
secrets file = /etc/rsyncd.secret
ignore errors = yes
hosts allow = *
[root@kvm1 ~]# cat /etc/rsyncd.secret 
test123  #只有密码
[root@kvm1 ~]# ll /etc/rsyncd.secret
-rw------- 1 root root 8 Oct 20 11:07 /etc/rsyncd.secret   #权限必须是600
2、测试能否同步
[root@kvm1 ~]#rsync -avH --port=873 --progress --delete  /var/www/html/  test@192.168.122.140::rsync  --password-file=/etc/rsyncd.secret
sending incremental file list
sent 150 bytes  received 12 bytes  324.00 bytes/sec
total size is 782  speedup is 4.83
或者用以下命令
[root@kvm1 ~]# cd /var/www/html && rsync -aruz -R --delete ./  --timeout=100 test@192.168.122.140::rsync --password-file=/etc/rsyncd.secret
3、安装inotify通过脚本来实现自动同步
[root@web01 html]# yum install inotify-tools   -y
[root@kvm1 ~]# cat inotify_rsync.sh 
#!/bin/bash
host=192.168.122.140  #同步的目标ip
src=/var/www/html/  #目录名
dest=rsync  #模板名
user=test  #认证用户
rsync_passfile=/etc/rsyncd.secret  #认证密码
inotify_home=/usr/   #inotify的安装目录,主要是为了下面使用inotifywait命令
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
echo "Check File and Directory"
exit 9
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
| while read file
do
rsync -avH --port=873 --progress --delete $src  --timeout=100 $user@$host::$dest --password-file=${rsync_passfile}   >/dev/null 2>&1
done
exit 0
#rsync -avH --port=873 --progress --delete  /var/www/html/  test@192.168.122.140::rsync --password-file=/etc/rsyncd.secret

4、测试自动同步效果
1、读服务器必须开启rsync服务
[root@kvm2 ~]# systemctl start rsyncd
2、写服务器必须运行脚本
[root@kvm1 ~]# sh inotify_rsync.sh &
[1] 3852
3、通过客户端测试是否代理成功和实现自动同步
[root@kvm3 ~]# curl -T example.txt http://proxy
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>201 Created</title>
</head><body>
<h1>Created</h1>
<p>Resource /example.txt has been created.</p>
</body></html>
4、查看结果
[root@kvm1 ~]# ls /var/www/html/
example.txt  fstab  hosts  test2.txt  test.txt
[root@kvm2 ~]# ls /var/www/html/
example.txt  fstab  hosts  test2.txt  test.txt

五、实验中错误
测试能否同步时报错
@ERROR: auth failed on module rsync rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]
rsync出现这个问题,说明前期的rsync服务搭建已经没问题了,客户端已经可以连接上服务器,auth失败可能是因为目录的权限不是600,密码错误,认证配置的格式错误等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值