CentOS6.5使用RSYNC发布程序

背景

Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录。

rsync is an open source utility that provides fast incremental file transfer. rsync is freely available under the GNU General Public License and is currently being maintained by Wayne Davison.
If you are running (1) an xattr-enabled rsync older than 3.0.2, (2) a writable rsync daemon older than 3.0.0, or (3) a version of rsync older than 2.6.6, please see the rsync security advisory page.

本次将使用此工具与SVN配合,通过SVN进行版本控制,上传代码之后,自动同步发布到线上。

安装

查询现有版本并安装。

1
2
3
4
5
6
7
8
9
10
# 查询
rpm -qa | grep rsync
# 卸载
rpm -e rsync
# 下载
wget http://pkgs.repoforge.org/rsync/rsync-3.1.1-1.el6.rfx.x86_64.rpm
# 安装
rpm -ivh rsync-3.1.1-1.el6.rfx.x86_64.rpm
# 直接升级
rpm -Uvh rsync-3.1.1-1.el6.rfx.x86_64.rpm

自然,你可以通过yum安装,不过版本较低:

1
2
3
4
5
yum install rsync
--> Running transaction check
---> Package rsync.x86_64 0:3.0.6-9.el6_4.1 will be updated
---> Package rsync.x86_64 0:3.0.6-12.el6 will be an update
--> Finished Dependency Resolution

配置

初始配置

  • 选择rsync服务器启动方式:
    1. rsync服务器负载较高,则使用独立启动模式
    2. rsync服务器负载较低,使用xinetd运行方式
  • 创建配置文件rsyncd.conf
  • 对于非匿名方式访问的rsync服务器创建配置口令(建议配置需要口令访问)
    CentOS 默认以xinetd模式运行rsync,rsync的xinetd配置文件是/etc/xinetd.d/rsync
    如果配置rsync以xinetd模式运行,执行如下命令
    1
    2
    3
    4
    5
    chkconfig rsync on
    service xinetd restart
    # 如果执行 service xinetd restart 发现 xinetd: unrecognized service 则未安装xinetd服务
    # 执行 yum install xinetd 安装 xinetd服务
    # 安装之后启动 xinetd服务(service xinetd start)

编辑rsync的xinetd配置文件/etc/xinetd.d/rsync文件,修改参数 server_args = –daemon –config=/etc/rsyncd/rsyncd.conf 可以配置rsync服务器启动时的参数

如果使用独立运行模式,则执行如下命令

1
2
/usr/bin/rsync --daemon
#编辑 /etc/rc.local文件 加入 /usr/bin/rsync --daemon 保证每次开机启动都会自动启动rsync服务

配置设置

创建配置目录:

1
2
3
4
5
6
7
8
9
# 创建rsync服务目录
mkdir /etc/rsyncd
# 创建配置文件
touch /etc/rsyncd/rsyncd.conf
# 创建密码文件
touch /etc/rsyncd/rsyncd.passwd
#权限修改
chown root:root /etc/rsyncd/rsyncd.passwd
chmod 600 /etc/rsyncd/rsyncd.passwd

配置文件:

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
# GLOBAL OPTIONS
uid = root
gid = root

use chroot = no

read only = yes

#limit access to private LANs
hosts allow=172.16.0.0/255.255.0.0 192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
hosts deny=*
max connections = 5

pid file = /var/run/rsyncd.pid

secrets file = /etc/rsyncd/rsyncd.passwd
#lock file = /var/run/rsync.lock

#motd file = /etc/rsyncd/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

# MODULE OPTIONS
[hwangjrhome]
path = /home/hwangjr/
list=yes
ignore errors
auth users = hwangjr
comment = HwangJR home
exclude = important/

[chinatmp]
path = /tmp/china/
list=no
ignore errors
auth users = china
comment = tmp china

密码文件:

1
2
hwangjr:asdf             #格式   用户名:口令
china:jk #该用户不要求是系统用户

查看服务是否启动:

1
netstat -an | grep 873

自动同步

编辑crontab

1
crontab -e

加入同步命令:

1
2
# 每天0点10分执行后面的命令
10 0 * * * rsync -avzP --delete --password-file=/tmp/rsync.password hwangjr@172.16.1.135::hwangjrhome /tmp/hwangjr/

客户端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 安装客户端
yum -y install rsync
# 同步命令
# -a 参数,相当于-rlptgoD
# -r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限
# -t 保持文件原有时间;-g 保持文#件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件
# -z 传输时压缩;
# -P 传输进度;
# -v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档;
# 同步
rsync -avzP hwangjr@172.16.1.135::hwangjrhome /tmp/hwangjr/

# 客户端数据和服务器端数据保持一致
# –delete 选项,表示客户端上的数据要与服务器端完全一致,如果 /tmp/hwangjr/目录中有服务器上不存在的文件,则删除。最终目的是让/tmp/hwangjr/目录上的数据完全与服务器上保持一致;用的时候要小心点,最好不要把已经有重要数所据的目录,当做本地更新目录,否则会把你的数据全部删除
rsync -avzP --delete hwangjr@172.16.1.135::hwangjrhome /tmp/hwangjr/

# 指定传输时候的密码文件,密码文件权限 600
# –password-file=rsync.password ,这时当我们以hwangjr用户登录rsync服务器同步数据时,密码将读取 /tmp/rsync.password 这个文件。这个文件内容只是hwangjr用户的密码。我们要如下做;
# touch /tmp/rsync.password
# chmod 600 /tmp/rsync.password
# echo "asdf"> /tmp/rsync.password
# rsync -avzP --delete --password-file=/tmp/rsync.password hwangjr@172.16.1.135::hwangjrhome /tmp/hwangjr/
# 注: 这样就不需要密码了,服务器通过crond 计划任务自动同步
rsync -avzP --delete --password-file=/tmp/rsync.password hwangjr@172.16.1.135::hwangjrhome /tmp/hwangjr/

配置语法

  • 模块
    以[模块名称]开始
  • 参数配置行
    格式 name = value
    其中 value的值可以是string(可以不使用引号)或者boolean(0/1,true/false,yes/no)
  • 以#开始是注释行
  • 以\是续行符
  1. 全局参数([模块名称]之外的配置均为全局配置)
    address
    在独立运行时,用于指定的服务器运行的 IP 地址。由 xinetd 运行时将忽略此参数,使用命令行上的 –address 选项替代
    默认值 本地所有IP
    port
    指定 rsync 守护进程监听的端口号。 由 xinetd 运行时将忽略此参数,使用命令行上的–port 选项替代。
    默认值是 873
    motd file
    指定一个消息文件,当客户连接服务器时该文件的内容显示给客户。
    默认值无
    pid file
    rsync 的守护进程将其 PID 写入指定的文件。
    默认值 无
    log file
    指定 rsync 守护进程的日志文件,而不将日志发送给 syslog。
    默认值 无
    syslog facility
    指定 rsync 发送日志消息给 syslog 时的消息级别
    默认值 daemon
    socket options
    指定自定义 TCP 选项。
    默认值无

  2. 模块参数
    模块参数主要用于定义 rsync 服务器哪个目录要被同步。模块声明的格式必须为 [module] 形式,这个名字就是在 rsync 客户端看到的名字,类似于 Samba 服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。可以根据自己的需要,来指定多个模块,模块中可以定义以下参数:

  • 基本模块参数
    path
    指定当前模块在 rsync 服务器上的同步路径,该参数是必须指定的
    comment
    给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户
    模块控制参数
    use chroot
    若为 true,则 rsync 在传输文件之前首先 chroot 到 path 参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要 root 权限,并且不能备份指向 path 外部的符号连接所指向的目录文件。
    默认值true
    uid
    指定该模块以指定的 UID 传输文件。
    默认值 nobody
    gid
    指定该模块以指定的 GID 传输文件。
    默认值 nobody
    max connections
    定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。
    默认值 0 不限制
    read only
    指定是否允许客户上传文件。若为 true 则不允许上传;若为 false 并且服务器目录也具有读写权限则允许上传。
    默认值 true
    write only
    指定是否允许客户下载文件。若为 true 则不允许下载;若为 false 并且服务器目录也具有读权限则允许下载。
    默认值 false
    模块认证参数
    hosts allow
    用一个主机列表指定哪些主机客户允许连接该模块。不匹配主机列表的主机将被拒绝
    默认值
    hosts deny
    用一个主机列表指定哪些主机客户不允许连接该模块。
    默认值 空
    auth users
    指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。用户名和口令以明文方式存放在 secrets file 参数指定的文件中
    默认匿名
    secrets file
    指定一个 rsync 认证口令文件。只有在 auth users 被定义时,该文件才起作用。
    默认值 空
    *strict modes

    指定是否监测口令文件的权限。若为 true 则口令文件只能被 rsync 服务器运行身份的用户访问,其他任何用户不可以访问该文件。
    默认值 true

其中客户主机列表定义可以是以下形式:

单个IP地址 例如:192.168.0.1
整个网段 例如:192.168.0.0/24,192.168.0.0/255.255.255.0
可解析的单个主机名 例如:centos,centos.bsmart.cn
域内的所有主机 例如:.bsmart.cn
“”则表示所有。
多个列表项要用空格间隔。

而认证口令则:

rsync 认证口令文件的权限一定是 600,否则客户端将不能连接服务器。
rsync 认证口令文件中每一行指定一个 用户名:口令 对,格式为:username:passwd
一般来说口令最好不要超过8个字符。若您只配置匿名访问的 rsync 服务器,则无需设置上述参数。

SVN同步实例

基本思路就是,当发生commit时,触发服务端svn数据目录update,也触发rsync去同步网站目录。

服务器配置文件

编辑配置文件:

1
vim /etc/rsyncd/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
# GLOBAL OPTIONS
uid = root
gid = root

use chroot = no

read only = yes

#limit access to private LANs
hosts allow=127.0.0.1
hosts deny=*
max connections = 5

pid file = /var/run/rsyncd.pid
secrets file = /etc/rsyncd/rsyncd.passwd
lock file = /var/run/rsync.lock
#motd file = /etc/rsyncd/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

# MODULE OPTIONS
[kksvn]
path = /home/svn/rsyncd/kk
list=yes
ignore errors
auth users = kksvn
comment = KK SVN

use chroot=no 时,同步后DES的文件主或组如果有,则显示名,即使ID不一样;
use chroot=yes时,如果两台机器同名的ID不同,则服务端只会显示SRC的ID,造成权限问题。

编辑rsync的用户认证配置文件

1
2
3
# vim /etc/rsyncd/rsyncd.passwd
kksvn:kksvn
#chmod 600 /etc/rsyncd/rsyncd.passwd

启动服务:

1
2
/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
echo "/usr/bin/rsync --daemon" >>/etc/rc.local

注:修改配置文件和用户密码不需要重启服务

客户端测试

客户端测试:

1
2
3
4
# vim /home/svn/rsyncd/conf/rsyncd.passwd
kksvn
# chmod 600 /home/svn/rsyncd/conf/rsyncd.passwd
# rsync -avzp --progress --delete --exclude=.svn --password-file=/home/svn/rsyncd/conf/rsyncd.passwd kksvn@127.0.0.1::kksvn /tmp/kk

SVN配置

配置钩子:

1
2
vim /home/svn/repos/kk/hooks/post-commit
chmod +x /home/svn/repos/kk/hooks/post-commit

post-commit内容:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh

REPOS="$1"
REV="$2"

export LANG=zh_CN.UTF-8
/usr/bin/svn update /home/svn/rsyncd/kke
if [ $? -eq 0 ]
then
/bin/bash /home/svn/rsyncd/scripts/kke_rsync.sh > /dev/null 2>&1
fi

kke_rsync.sh内容:

1
2
3
4
5
6
7
8
9
#/bin/bash

IP="127.0.0.1"
Auth_module="kksvn"
Localdir="/tmp/kk"
Auth_user="kksvn"
Passwd_file="/home/svn/rsyncd/conf/rsyncd.passwd"
Exc=" --exclude=.svn"
/usr/bin/rsync -vrtopgl --progress --delete ${Exc} --password-file=${Passwd_file} $Auth_user@${IP}::${Auth_module} ${Localdir}

拓展

通过exclude排除多个文件/目录

使用rsync -av –exclude=.svn /home/hwangjr/t1 /home/hwangjr/t2 只能排除.svn文件/目录。但如果要排除多个文件/目录,就需要新建个exclude.list,然后rsync -av –exclude-from=”exclude.list”指定不需要同步的文件/目录。

1
2
# 将/home/hwangjr/t1目录拷贝到/home/hwangjr/t2目录下,/home/hwangjr/exclude.list中指定文件不拷贝
rsync -av --exclude-from=/home/hwangjr/exclude.list /home/hwangjr/t1 /home/hwangjr/t2

exclude.list里面填写要排除的文件/目录,一行一个,直接写文件名即可。如果要排除a,b.1,b.2,tmp/g,那么exclude.list里就应该写:

1
2
3
a
b.*
tmp/g

不应该写成:

1
2
3
/home/hwangjr/t1/a
/home/hwangjr/t1/b.*
/home/hwangjr/t1/tmp/g

也不应该写成:

1
2
3
./home/hwangjr/t1/a
./home/hwangjr/t1/b.*
./home/hwangjr/t1/tmp/g

SO:

1
2
3
4
–exclude=PATTERN exclude files matching PATTERN
–exclude-from=FILE read exclude patterns from FILE
–include=PATTERN don’t exclude files matching PATTERN
–include-from=FILE read include patterns from FILE

REF

Index of /pub/rsync/src
rsync
Index of /rsync
CentOS 6.5下rsync服务器安装配置 - SegmentFault
CentOS 6.3下rsync服务器的安装与配置 - longjian的个人页面 - 开源中国社区
Rsync常见错误及命令详细参数 - 彼岸 - 51CTO技术博客
svn+rsync实时发布程序 - notepad - 51CTO技术博客
linux下svn+rsync+inotify实现代码自动同步 - 运维生存时间