Subversion概述

    概述

    Subversion,简称SVN,是一个开放源代码的版本控制系统,相对于的RCS、CVS,采用了分支管理系统。

    网站更新拓扑结构

    wKiom1W7QoyzIba0AAIwaNrmWpo028.jpg

    安装WEB服务器(Nginx)

    略

安装svn独立服务器----->本地测试服

    安装subversion Server

yuminstall subversion –y


    创建版本库

    

mkdir -pv/work/svndata
svnadmin  create /work/svndata/web


    将网站目录导入版本库

export LANG="zh_CN.UTF-8"
svn import/data/wwwroot/htdocs/ file:///work/svndata/web -m "import"


    创建用户密码

cat >/work/svndata/web/conf/passwd << EOF
> [users]
> admin =Leerw2015
> EOF
cat >/work/svndata/web/conf/authz <<EOF
> [/]
> admin = rw
> EOF
cat >/work/svndata/web/conf/svnserve.conf <<EOF
> [general]
> anon-access =none
> auth-access =write
> password-db =/work/svndata/web/conf/passwd
> authz-db =/work/svndata/web/conf/authz
> EOF


    启动svn服务器

svnserve  -d -r /work/svndata/


    添加开启启动

echo"svnserve  -d -r/work/svndata/" >> /etc/rc.local


    配置钩子脚本,实现自动同步

vim/work/svndata/web/hooks/post-commit
#!/bin/bash
# Author by:Tommy.Gandolf
#
exportLANG="zh_CN.UTF-8"
SVN_PATH=/usr/bin/svn
WEB_PATH=/data/wwwroot/htdocs
USER_NAME=admin
USER_PASSWD=Leerw2015
 
$SVN_PATH checkout--username  $USER_NAME --password$USER_PASSWD svn://127.0.0.1/web $WEB_PATH


    添加执行权限

chmod  +x /work/svndata/web/hooks/post-commit


设置SVN客户端自动更细Nginx网站目录

    Windows下svn客户端使用

    下载地址:

    http://tortoisesvn.net/downloads.html

wKiom1W7RHagmTRJAAIgtIFzGLM689.jpg

wKioL1W7RmeghHdcAAB0mC7UnKE980.jpg

wKiom1W7RHbiExszAAB_GVAyHIQ423.jpg

wKioL1W7RmihzxyYAAEwKzZqRTg715.jpg

    Linux下svn客户端的使用

yuminstall subversion –y
svn checkout  svn://172.16.100.106/website

wKiom1W7ReSizhQBAAZMLEEyF0A313.jpg

本地测试服务器---->外网测试服务器

    配置本地到外网测试服务器无密码登录

ssh-keygen  -t rsa
ssh-copy-id  -i ~/.ssh/id_rsa.pub  root@172.16.100.105
ssh172.16.100.105 'date'

    能正常显示日志就,就证明配置OK

    Rsync同步目录

    假设本地测试已经OK,由于本地是内网环境无固定IP,因此目前需要同步到外网服务器,使用rsync远程同步目录

    

# rsync  -avz /data/wwwroot/htdocs/ root@172.16.100.105:/data/wwwroot/htdocs_test/--exclude='.svn/' --exclude='.settings/' --exclude='.project'

wKiom1W7SECDZN9iAAZMLEEyF0A654.jpg

# vim push.sh

    脚本内容如下:

#!/bin/bash
# Author by:Tommy.Gandolf
# This script willpush local file to remote Server
 
LOCAL_FILE=/data/wwwroot/htdocs/
REMOTE_FILE=/data/wwwroot/htdocs_test/
USER=root
REMOTE_IP=172.16.100.105
rsync  -avz $LOCAL_FILE$USER@$REMOTE_IP:$REMOTE_FILE --exclude='.svn/' --exclude='.settings/' --exclude='.project'

每次更新OK,只需要执行:sh push.sh 即可更新代码到外网测试服

实现外网测试服务器---->正式服务器的更新

    WEB1

            外网正式服务器(Rsync服务器端)

            安装rsync

            

wget http://rsync.samba.org/ftp/rsync/src/rsync-3.1.0.tar.gz
tar zxvfrsync-3.1.0.tar.gz
cd rsync-3.1.0
./configure--prefix=/usr/
make &&make install


            创建配置文件

mkdir -p/etc/rsyncd
cd /etc/rsyncd/
touch  rsyncd.conf
touch  rsyncd.secrets
touch  rsyncd.motd
chmod  600 rsyncd.secrets
vim rsyncd.conf
uid=nobody
gid=nobody
use chroot=no
max connections=10
strict modes=yes
pid file=/var/run/rsyncd.pid
lockfile=/var/run/rsyncd.lock
logfile=/var/log/rsyncd.log
[data1]
path=/data/wwwroot/htdocs
ignore errors
read only=no
write only=no
hostsallow=172.16.100.0/24
host deny=*
list=no
uid=root
gid=root
auth users=root
secrets file=/etc/rsyncd/rsyncd.secrets
echo"root:1q2w3e4r5t6y" > rsyncd.secrets
chown  root:root rsyncd.secrets
chmod  600 rsyncd.secrets
cat rsyncd.motd 
+++++++++++++++++++++++++++++++++++++++++++++++++++
########  WelCome To The Leerw.com SerVice! #######
+++++++++++++++++++++++++++++++++++++++++++++++++++


            启动rsync服务

/usr/bin/rsync--daemon --config=/etc/rsyncd/rsyncd.conf


    WEB2

            安装通过WEB1,唯一不同的内容如下:

            

uid=nobody
gid=nobody
use chroot=no
max connections=10
strict modes=yes
pidfile=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
logfile=/var/log/rsyncd.log
[data2]
path=/data/wwwroot/htdocs/
ignore errors
read only=no
write only=no
hostsallow=172.16.100.0/24
host deny=*
list=no
uid=root
gid=root
auth users=root
secretsfile=/etc/rsyncd/rsyncd.secrets


            外网测试服(rsync + inotify 客户端)

            安装rsync

wget http://rsync.samba.org/ftp/rsync/src/rsync-3.1.0.tar.gz
tar zxvfrsync-3.1.0.tar.gz
cd rsync-3.1.0
./configure--prefix=/usr/
make &&make install
mkdir -p/etc/rsyncd
cd /etc/rsyncd/
touch  rsyncd.password
echo"1q2w3e4r5t6y" > rsyncd.password
chmod  600 rsyncd.password
mkdir -pv/data/wwwroot/htdocs


            安装inotify-tools

rpm -ivh http://mirrors.hustunique.com/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum makecache
yum installinotify-tools inotify-tools-devel –y


            自动同步脚本后台运行【保证更新到测试服上的代码正确性】

vim /root/rsync_auto.sh
#!/bin/bash
# Author by:Tommy.Gandolf
#
HOST1=172.16.100.100
HOST2=172.16.100.105
SRC=/data/wwwroot/htdocs/
DST1=data1
DST2=data2
USER=root
/usr/bin/inotifywait-mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -emodify,delete,create,attrib  $SRC | whileread read date time dir files; do
        /usr/bin/rsync   -vzrtopg --delete --progress--password-file=/etc/rsyncd/rsyncd.secrets $SRC $USER@$HOST1::$DST1 --exclude='.svn/' --exclude='.settings/'--exclude='.project'
        /usr/bin/rsync   -vzrtopg --delete --progress--password-file=/etc/rsyncd/rsyncd.secrets $SRC $USER@$HOST2::$DST2 --exclude='.svn/' --exclude='.settings/'--exclude='.project'
        echo "${files} was rsynced">>/tmp/rsync.log 2>&1
done
# chmod  +x rsync_auto.sh
# nohup  sh rsync_auto.sh &   > /dev/null

备注:如果同步的目录有内同,不能触发同步,请先在同步目录创建一个文件,尝试触发同步文件。

            手动同步脚本【推荐此方案】

            说明:测试OK,手动推送到正式服务器

# vim  rsync.sh
#!/bin/bash
# Author by:Tommy.Gandolf
#
HOST1=172.16.100.100
HOST2=172.16.100.105
SRC=/data/wwwroot/htdocs/
DST1=data1
DST2=data2
USER=root
        /usr/bin/rsync   -vzrtopg --delete --progress--password-file=/etc/rsyncd/rsyncd.secrets $SRC $USER@$HOST1::$DST1 --exclude='.svn/' --exclude='.settings/'--exclude='.project'
        /usr/bin/rsync   -vzrtopg --delete --progress--password-file=/etc/rsyncd/rsyncd.secrets $SRC $USER@$HOST2::$DST2 --exclude='.svn/' --exclude='.settings/'--exclude='.project'
        echo "${files} was rsynced">>/tmp/rsync.log 2>&1

配置内核参数

Inotify默认内核参数值太小

默认参数:

# sysctl  -a | grep max_queued_events
fs.inotify.max_queued_events = 16384
# sysctl -a |  grep max_user_watches
fs.inotify.max_user_watches = 8192
fs.epoll.max_user_watches= 148131
# sysctl  -a | grep max_user_instances
fs.inotify.max_user_instances = 128
修改:vim /etc/sysctl.conf
fs.inotify.max_queued_events = 99999999
fs.inotify.max_user_watches = 99999999
fs.inotify.max_user_instances = 65535
# sysctl  -p

FAQ

Rsync 常用用法

1.在本地机器上对两个目录进行同步

rsync -zvr /data/wwwroot/htdocs/ /tmp/

参数:-z 开启压缩,-v 详细输出 –r 表示递归 –a 保留时间标记


2.仅同步一个文件

rsync  -azvr /data/wwwroot/htdocs/test.txt /tmp/

3.从本地同步到远程

rsync -avz /data/wwwroot/htdocs/ root@172.16.100.105:/data/wwwroot/htdocs_test/

4.同步远程到本地

 rsync -avz root@172.16.100.105:/root/cpu.sh/root/

5.同步是指定远程shell

rsync  -avz -e ssh root@172.16.100.105:/tmp/root/push.sh

6.不要覆盖被修改过的目的文件

rsync -avzu -e  sshroot@172.16.100.105:/root/cpu.sh  /tmp/

7.仅仅同步目录(不同步文件)

rsync  -v -d /tmp/ root@172.16.100.105:/tmp/

8.查看文件的传输进程

 rsync -v --progress  -d /tmp/  root@172.16.100.105:/tmp/

9.删除在目的文件夹中创建文件

rsync  -avz --delete /tmp/ root@172.16.100.105:/tmp/

10.查看源和目的文件之间的改变情况

-参数:-i

rsync -avzi  /tmp/ root@172.16.100.105:/tmp/

11.查看源和目的之间的变化

rsync -avzi  /tmp/ root@172.16.100.105:/tmp/

f 表示这是一个文件

d 表示这是一个目录

s 表示尺寸被更改

t 时间标记有变化

o 用户被更改

g 用户组被更改

12.在传输时启用包包含和排除模式

rsync -avz --exclude='.svn/'/tmp/  root@172.16.100.105:/tmp/

13.不要传输大文件

rsync -avz --max-size='100K' /tmp/  root@172.16.100.105:/tmp/

14.传输所有文件 

不管文件是否有变化,再次把所有文件都传输一遍 –W参数

rsync -avzW--max-size='100K' /tmp/ root@172.16.100.105:/tmp/


END