rsync+inotify实现目录实时同步
文章分类:操作系统
最近做的项目需要把生成的静态页面同步到静态页面服务器上,采用rsync+inotify实现目录实时同步当然就成了很好的方式了。
环境:ubuntu-9.01 或者 linux 5.4
生成静态页面的机器作为客户端采用上传的方式,地址为:192.168.18.12
静态页面服务器作为服务器端,地址为:192.168.18.14
同步目录为:/usr/ROOT
rysnc的下载地址为:目前最新的版本为:3.0.7
inotify下载地址为:最新版本为:3.13
服务器端安装:
tar -zxvf rsync-3.0.7.tar.gz
./configure --prefix=/usr/local/rsync --指定安装目录
make
make install
配置:
1、vi /etc/rsyncd.conf
motd file=/etc/rsyncd.conf
read only=no ----因为是上传所以这里一定要可写
list=yes
uid=root
gid=root
hosts allow=192.168.18.12 ---允许连接ip
host deny=19.168.18.100
max connections=2 ----允许最大连接
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsync.lock
模块
[web]
comment=from 192.168.18.12
path=/usr/ROOT
auth users=allen
secrets file=/etc/rsync.pass ----密码文件
2、vi /etc/rsyncd.motd
welcome to use rsync server!
3、vi /etc/rsync.pass
allen:123456
给密码文件赋权:chmod 400 /etc/rsync.pass
4、vi /etc/services
在最后加入:
rsync 873/tcp
rsync 873/udp
5、vi /etc/xinetd.d/rsync
service{
disable=no
socket_type=staream
wait=no
user=root
server=/usr/local/rsync/bin/rsync
server_args=--daemon
log_on_failure+=USERID
}
6、到这里配置完成,启动:/usr/local/rsync/bin/rsync --daemon
ps -aux | grep rsync 查看是否启动成功!
使用IPTABLES开启873端口的步骤,貌似有点问题。
Rsync是用到UDP数据包的,所以还要打开UDP的包,另外我使用-A参数的时候配置无效,客户端连接服务器没有响应,使用-I参数后就好了。
下面是我使用的命令:
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
iptables -I INPUT -p udp -m state --state NEW -m udp --dport 873 -j ACCEPT
客户端安装:
tar -zxvf rsync-3.0.7.tar.gz
cd rsync-3.0.7
./configure --prefix=/usr/local/rsync --指定安装目录
make
make install
客户端只需安装,无需配置,建个密码文件
vi /etc/rsync-client.pass
123456
赋权:chmod 600 /etc/rsync-client.pass
rsync的上传和下载命令:
cd /usr/local/rsync/bin
下载命令:
./rsync -vzrtopg --progress --delete allen@192.168.18.14::web /usr/ROOT
上传命令:
./rsync -vzrtopg --progress --delete /usr/ROOT allen@192.168.18.14::web
在加上定时执行,就可以定时同步文件了。若需要实时同步则需要用inotify,安装之前需查看系统内核:uname -a
只能在高于2.6.13版本的系统上安装,以下的需要安装补丁。
inotify安装:inotify-tool-3.13
tar -zxvf inotify-tool-3.13
cd inotify-tool-3.13
./configure
make
make install
建个执行文件:rsync.sh
#!/bin/sh
src=/usr/ROOT
/usr/local/bin/inotifywait -mrq --timefmt '%d%m%y %H:%M' --format '%T%w%f' \
-e modify,delete,move,create,attrib \
${src}\
|while read file
do
rsync -vartopg --progress –delete –password-file=/etc/rsync-client.pass /usr/ROOT/ allen@192.168.18.14::web
echo "success!"
done
这样就能检测到是否有静态页面的生成或修改、删除而进行自动同步,实现实时同步。
其实服务端不用配置的,如果你不是定时运行的,rsync.conf 者不用配置,
可以如下
rsync -vzrtopg --delete -e ssh root@192.168.1.7:/home/test/ /home/backupl/
或者
rsync -vzrtopg --delete -e ftp ftpuser@192.168.1.7:/home/test/ /home/backupl/
--------------------可能出现的错误解惑
1、@ERROR: Unknown module 'web'
rsync error: error starting client-server protocol (code 5) at main.c(1383) [receiver=2.6.9]
这是因为服务器端hosts allow 没有允许该主机访问
2、@ERROR: auth failed on module web
rsync error: error starting client-server protocol (code 5) at main.c(1383) [receiver=2.6.9]
检查一下用户名是否正确,
服务器端rysnc.pass(用户:密码)<用户必须是系统用户,密码尽量不要为系统用户密码>
客户端rsync-client.pass(密码)<服务器端密码>
注意:auth users=allen 这里不能有空格,上次这个问题把我找惨了。
3、@ERROR: secrets file must not be other-accessible
这是客户端的密码文件需要设置成600权限
chmod 600 rsync-client.pass
Rsync同步常见问题
今天碰到这样一个问题,在rsync同步的时候一直报错,报错内容如下:
@ERROR: access denied to www from unknown (192.168.1.123)
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(359)
最后原因终于找到了。因为有两个网段都需要同步该文件夹内容,所以有人更改了配置文件,并没有在
hosts allow 后面添加另一个IP段,而是另外添加一个配置如下:
[www]
path = /data/cms/webapp
hosts allow = 192.168.1.0/24
auth users = webapp
secrets file = /etc/app.pass
#[www]
#path = /data/cms/webapp
#hosts allow = 192.168.2.0/24
#auth users = webapp
#secrets file = /etc/app.pass
这样更改后导致前一段配置(也就是没有#号的一段)没有生效,服务器就只允许192.168.2.0网段同步。
解决方法如下:
将后一段注释或者直接删掉,在上一段的 hosts allow 后添加192.168.2.0 网段,结果如下
[www]
path = /data/cms/webapp
hosts allow = 192.168.1.0/24 192.168.2.0/24
auth users = webapp
secrets file = /etc/app.pass
重新启动rsync服务,问题解决。
网上总结rsync报错信息:
Rsync同步常见问题:
错误一:
@ERROR: auth failed on module xxxxx
rsync: connection unexpectedly closed (90 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
解决:这是因为密码设置错了,无法登入成功,检查一下rsync.pwd,看客服是否匹配。还有服务器端没启动rsync 服务也会出现这种情况。
错误二:
password file must not be other-accessible
continuing without password file
Password:
解决:这是因为rsyncd.pwd rsyncd.sec的权限不对,应该设置为600。如:chmod 600 rsyncd.pwd
错误三:
@ERROR: chroot failed
rsync: connection unexpectedly closed (75 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
解决:这是因为你在 rsync.conf 中设置的 path 路径不存在,要新建目录才能开启同步。
错误四:
rsync: failed to connect to 218.107.243.2: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9]
解决:对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。关闭防火墙,其实就是把tcp udp 的873端口打开。
|
还可以参考:
https://www.deleak.com/blog/tag/rsync/
阅读(1331) | 评论(1) | 转发(0) |