目录[-]
公司网站 有两台服务器 A、B,做了动静分离,A上为静态服务器安装有nginx,B为Tomcat容器。访问时,通过A的nginx 做反向代理,静态文件http请求,目录statics直接访问A服务器上的静态文件。
但我们由于开发的时候 项目 java代码和静态文件都在一起,只发布到 B上,然后将静态文件目录statics直接同步到A上,这样减少了发布的复杂度,如果服务器多的话效果更佳。
其实最初做动静分离,用的是nginx 的缓存功能,直接将静态文件缓存到A服务器上,但这个时候对文件更新不友好。rsync能很好的解决这个问题。
1. rsync 同步的大致思路
服务器A和B上都安装rsync,其中B服务器上是以服务器模式运行rsync,而A上则以客户端方式运行rsync。这样在web服务器B上运行rsync守护进程,在A上定时运行客户程序来同步web服务器B上需要同步的内容。
rsync 同步有下面几个优点:
可以镜像 保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩 操作,因此可以使用更少的带宽。
安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
支持匿名传输,以方便进行网站镜象。
2. rsync的安装
一般的linux系统上都默认安装得了rsync 。也可以手动安装,这里采用的是rsync原生的传输协议,如果采用 ssh传输协议的话,就需要安装ssh。
下载:http://www.samba.org/rsync/
1
2
3
|
shell>
tar
zxvf
rsync
-x.x.x.
tar
.gz
shell>
cd
rsync
-x.x.x
shell> .
/configure
&&
make
&&
make
install
|
或者:
1
2
|
sudo
apt-get
install
rsync
yum
install
rsync
|
3. rsync的配置
rsync的主要有以下三个配置文件rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)、rsyncd.motd(rysnc服务器信息)
服务器配置文件(/etc/rsyncd.conf),该文件默认不存在,请创建它。
具体步骤如下:
1
2
3
4
|
#touch /etc/rsyncd.conf #创建rsyncd.conf,这是rsync服务器的配置文件。
#touch /etc/rsyncd.secrets #创建rsyncd.secrets ,这是用户密码文件。
#chmod 600 /etc/rsyncd/rsyncd.secrets #将rsyncd.secrets这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功!
#touch /etc/rsyncd.motd
|
rsyncd.conf 服务器的主要配置文件,可以参考如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# This line is required by the /etc/init.d/rsyncd script
pid
file
=
/var/run/rsyncd
.pid
port = 873
address = 192.168.1.171
#uid = nobody
#gid = nobody
uid = root
gid = root
use chroot =
yes
read
only =
yes
#limit access to private LANs
hosts allow=192.168.1.0
/255
.255.255.0 10.0.1.0
/255
.255.255.0
hosts deny=*
max connections = 5
motd
file
=
/etc/rsyncd
.motd
#This will give you a separate log file
#log file = /var/log/rsync.log
#This will log every file transferred - up to 85,000+ per user, per sync
#transfer logging = yes
log
format
= %t %a %m %f %b
syslog facility = local3
timeout = 300
[home]
path =
/usr/local/tomcat/webapp/home/statitcs
list=
yes
ignore errors
auth
users
= root
secrets
file
=
/etc/rsyncd
.secrets
comment = This is RHEL 4 data
exclude = dir1/ dir2/
|
auth users是必须在服务器上存在的真实的系统用户,如果你想用多个用户以,号隔开,比如auth users = nobody,root
rsyncd.secrets的内容格式为: 用户名:密码
1
2
|
chown
root.root rsyncd.secrets
#修改属主
chmod
600 rsyncd.secrets
#修改权限
|
注:1、将rsyncd.secrets这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功! 出于安全目的,文件的属性必需是只有属主可读。
2、这里的密码值得注意,为了安全你不能把系统用户的密码写在这里。
设定rsyncd.motd 文件;
它是定义rysnc服务器信息的,也就是用户登录信息。比如让用户知道这个服务器是谁提供的等;
类似ftp服务器登录时,我们所看到的 linuxsir.org ftp ……。 当然这在全局定义变量时,并不是必须的,你可以用#号注掉,或删除;
rsync.conf 的详细说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#在rsync 服务器中,全局定义有几个比较关健的,根据我们前面所给的配置文件 rsyncd.conf 文件;
pid
file
=
/var/run/rsyncd
.pid 注:告诉进程写到
/var/run/rsyncd
.pid 文件中;
port = 873 注:指定运行端口,默认是873,您可以自己指定;
address = 192.168.1.171 注:指定服务器IP地址
uid = nobody
gid = nobdoy
注:服务器端传输文件时,要发哪个用户和用户组来执行,默认是nobody。 如果用nobody 用户和用户组,可能遇到权限问题,有些文件从服务器上拉不下来。所以我就偷懒,为了方便,用了root 。不过您可以在定义要同步的目录时定义的模块中指定用户来解决权限的问题。
use chroot =
yes
注:用chroot,在传输文件之前,服务器守护程序在将chroot 到文件系统中的目录中,这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。也就是说,你在
rsync
服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容;这个需要自己来尝试
read
only =
yes
注:
read
only 是只读选择,也就是说,不让客户端上传文件到服务器上。还有一个 write only选项,自己尝试是做什么用的吧;
#limit access to private LANs
hosts allow=192.168.1.0
/255
.255.255.0 10.0.1.0
/255
.255.255.0
注:在您可以指定单个IP,也可以指定整个网段,能提高安全性。格式是ip 与ip 之间、ip和网段之间、网段和网段之间要用空格隔开;
max connections = 5
注:客户端最多连接数
motd
file
=
/etc/rsyncd/rsyncd
.motd
注:motd
file
是定义服务器信息的,要自己写 rsyncd.motd 文件内容。当用户登录时会看到这个信息。
log
file
=
/var/log/rsync
.log
注:
rsync
服务器的日志;
transfer logging =
yes
注:这是传输文件的日志
log
format
= %t %a %m %f %b
syslog facility = local3
timeout = 300
模块定义
模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在
rsync
客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过path 指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的
下面是前面配置文件模块的例子:
[home]
#模块它为我们提供了一个链接的名字,在本模块中链接到了/home目录;要用[name] 形式
path =
/usr/local/tomcat/webapp/home/statics
#指定文件目录所在位置,这是必须指定的
auth
users
= root
#认证用户是root ,是必须在服务器上存在的用户
list=
yes
#list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes 。如果你不想列出来,就no ;如果是no是比较安全的,至少别人不知道你的服务器上提供了哪些目录。你自己知道就行了;
ignore errors
#忽略IO错误
secrets
file
=
/etc/rsyncd
.secrets
#密码存在哪个文件
comment = linuxsir home data
#注释可以自己定义
exclude = dir1/ dir2/
注:exclude是排除的意思,也就是说,要把
/usr/local/tomcat/webapp/home/statics
目录下的easylife和samba排除在外; dir1/和dir2/目录之间有空格分开
|
4. rsync的基本操作
服务器端启动
1
|
usr
/bin/rsync
--daemon --config=
/etc/rsyncd/rsyncd
.conf
|
可能需要 root 运行. 也可以在/etc/rc.d/rc.local里加入让系统自动启动等.
查看rsync服务器上提供了哪些可用的数据源
1
|
# rsync --list-only root@192.168.0.102::home
|
客户端同步
#rsync -avzP root@192.168.0.100::home /var/www/statics
Password: 这里要输入root的密码,是服务器端rsyncd.secrets提供的。
注:这个命令的意思就是说,用root用户登录到服务器上,把/var/www/statics数据,同步到本地当前目录/var/www/statics上。当然本地的目录是可以你自己定义的。 如果当你在客户端上当前操作的目录下没有/var/www/statics这个目录时,系统会自动为你创建一个;当存在/var/www/statics这个目录中,你要注意它的写权限。
#rsync -avzP --delete root@linuxsir.org::home /var/www/statics
引入一个--delete 选项,表示客户端上的数据要与服务器端完全一致,如果 linuxsirhome目录中有服务器上不存在的文件,则删除。 最终目的是让linuxsirhome目录上的数据完全与服务器上保持一致;用的时候要小心点,最好不要把已经有重要数所据的目录,当做本地更新目录, 否则会把你的数据全部删除;
客户端配置
设定密码文件
#rsync -avzP --delete --password-file=rsyncd.secrets root@192.168.0.100::home /var/www/statics
加了一个选项 --password-file=rsyncd.secrets,这是当我们以root用户登录rsync服务器同步数据时,密码将读取rsyncd.secrets这个文件。
这个文件内容只是root用户的密码。我们要如下做;
1
2
3
4
5
|
# touch rsyncd.secrets
# chmod 600 rsyncd.secrets
# echo "123456"> rsyncd.secrets
# rsync -avzP --delete --password-file=rsyncd.secrets root@192.168.0.100::home /var/www/statics
|
rsync中的参数
-r 是递归
-l 是链接文件,意思是拷贝链接文件; -p 表示保持文件原有权限; -t 保持文件原有时间; -g 保持文件原有用户组;-o 保持文件原有属主; -D 相当于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息,和 -P有点关系,自己试试。可以看文档;
-e ssh的参数建立起加密的连接。
-u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
--progress是指显示出详细的进度情况
--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致
--password-file=/password/path/file来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读。
让rsync客户端自动与服务器同步数据
1.创建同步脚本和密码文件
1
2
3
4
5
6
7
8
|
#mkdir /etc/cron.daily.rsync
#cd /etc/cron.daily.rsync
#touch /var/www/statics.sh
#chmod 755 /etc/cron.daily.rsync/*.sh
#mkdir /etc/rsyncd/
#touch /etc/rsyncd/homeroot.secrets
# echo "123456"> /etc/rsyncd/homeroot.secrets
#chmod 600 /etc/rsyncd/rsync.*
|
注: 我们在 /etc/cron.daily/中创建了文件 /var/www/statics.sh,并且是权限是 755的。创建了密码文件 root用户用的是 homeroot.secrets,权限是 600;
我们编辑 /var/www/statics.sh,内容是如下的:
1
2
|
#!/bin/sh
/usr/bin/rsync
-avzP --password-
file
=
/etc/rsyncd/homeroot
.secrets root@192.168.0.100::home
/var/www/statics/
|
2.修改crond服务器的配置文件 加入到计划任务
#crontab -e
加入下面的内容:
*/10 * * * * /etc/cron.daily.rsync/statics.sh 1> /dev/null
配置好后,要重启crond 服务器;
# killall crond 注:杀死crond 服务器的进程;
# ps aux |grep crond 注:查看一下是否被杀死;
# /usr/sbin/crond 注:启动 crond 服务器;
# ps aux |grep crond 注:查看一下是否启动了
注1. 如果 rsync 在ssh协议上传输,可以不输入密码登录。
1. 通过ssh-keygen在server A上建立SSH keys,不要指定密码,你会在~/.ssh下看到identity和identity.pub文件
2. 在server B上的home目录建立子目录.ssh
3. 将A的identity.pub拷贝到server B上
4. 将identity.pub加到~[user b]/.ssh/authorized_keys
5. 于是server A上的A用户,可通过下面命令以用户B ssh到server B上了。e.g. ssh -l userB serverB。
这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。
Rsync + ssh 的命令格式为:
1
|
#rsync -avz --delete root@192.168.0.100:/usr/local/tomcat/webapp/home/statics /var/home/statics
|
注2. 实时同步
这里同步的思路是服务器A 主动的同步B,B作为rsync服务端,A作为客户端定时去同步B,拉取同步数据。
如果要做到实时同步就可以采用sersync工具或者rsync+inotify组合,这里就需要反过来,将B作为rsync客户端,A作为服务器。B主动推送同步文件,这里就要做到实时监控文件系统,当B上指定目录有更新时,主动同步到A。就需要inotify 监控 B上的文件系统。
注3. rsync通过linux防火墙
在服务器端要让你所定义的rsync 服务器端口通过,客户端上也应该让通过。
1
|
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
|
查看一下防火墙是不是打开了 873端口;
1
|
iptables -L
|