目前项目是由多台机器在提供的,他们的代码都一致,但是我又不想写crontab去定时同步代码,因为万一服务器之间连接稍有故障,负载就会飙升。而且我的代码更新并不会太频繁,所以设计了以下方案:
1.拿一台机器当工作机
2.需要同步代码的前端机器都搭建rsync服务端
3.我同步代码到工作机,执行一个shell脚本,代码同步到前端机
rsync的服务端即前端机配置如下
建立一个/etc/rsyncd.conf文件,内容
uid = root gid = root use chroot = no max connections = 4 strict modes =yes port = 873 pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log [app] path = /data/www/xs8.cn/app.xs8.cn/ comment = app.xs8.cn ignore errors read only = no list = yes secrets file = /etc/rsync.pas hosts allow = 10.0.0.100 hosts deny = 0.0.0.0/0 [www] path = /data/www/xs8.cn/www.xs8.cn/ comment = www.xs8.cn ignore errors read only = no list = yes secrets file = /etc/rsync.pas hosts allow = 10.0.0.100 hosts deny = 0.0.0.0/0
新建一个/etc/rsync.pas文件,内容为“用户名:密码”
xs8:xs8rsync
可以看到,我的其中一台前端需要提供app和www这两个二级域名的服务
启动前端机的rsync服务/usr/bin/rsync –daemon –config=/etc/rsyncd.conf 可以把这句写进/etc/rc.local
然后在工作机上建立与前端机相同的rsync.pas文件
在来个同步脚本sync_app
find /data/www/xs8.cn/app.xs8.cn/ -name ".svn"|xargs rm -r /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.pas --exclude-from=/data/www/xs8.cn/app.xs8.cn/exclude.txt /data/www/xs8.cn/app.xs8.cn/ [email protected]::app /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.pas --exclude-from=/data/www/xs8.cn/app.xs8.cn/exclude.txt /data/www/xs8.cn/app.xs8.cn/ [email protected]::app
给予执行权限chmod +x /opt/sbin/sync_app
你可以看到我排除了一些文件不进行同步,这个exclude文件内容如下
exclude.txt application/cache application/logs
从需要同步的目录算起,下面哪些不需要同步,写上就行,一行一个文件或者目录
这样,当我更改代码以后,先上传到我的工作机,然后执行/opt/sbin/sync_app就会将代码发布到所有前端提供服务的机器上了