服务端:
系统 :Centos 7.4 (刚安装完的系统)
项目名称:www.ITM.com www.CML.com
yum源下载地址:http://mirrors.163.com/.help/centos.html
安装epel源:yum -y install epel-release
IPv4: 192.168.100.125/24
客户端:
系统:windows 7
Svn工具:TotoiseSvn
IPv4:192.168.100.114/24
[root@Redis ~]# yum -y install subversion-1.7.14-14.el7.x86_64
[root@Redis ~]# systemctl enable svnserve.service && systemctl start svnserve.service
[root@Redis ~]# mkdir -p /webdept/svnconf #创建SVN配置文件目录,后期可能会有很多项目所以配置文件最好在统一位置
[root@Redis ~]# svnadmin create /webdept/www.ITM.com
[root@Redis ~]# svnadmin create /webdept/www.CML.com #www.CML.com 是SVN项目名称跟web项目要一致相同
[root@Redis ~]# ll /webdept/www.ITM.com/
文件描述:
db目录:就是所有版本控制的数据存放文件
hooks目录:放置hook脚本文件的目录
locks目录:用来放置subversion监控锁定数据的目录,用来追踪存取文件库的客户端
format文件:是一个文本文件,里面只放了一个整数。表示当前文件库配置的版本号
conf目录:是这个仓库的配置文件(仓库的用户访问账号、权限等),也是我们要关注的配置文件
[root@Redis ~]# ls /webdept/www.ITM.com/conf/
authz passwd svnserve.conf
文件描述:
authz #认证权限相关
passwd #用户名和密码
svnserve.conf #服务器配置文件
[root@Redis ~]# cp /webdept/www.ITM.com/conf/passwd /webdept/svnconf/passwd
[root@Redis ~]# cp /webdept/www.ITM.com/conf/authz /webdept/svnconf/authz
注:因为svn服务器上存在多个项目,为方便管理账户信息、授权,使用统一的用户配置文件
[root@Redis ~]# vim /webdept/svnconf/passwd
注:创建一个test用户 密码 123456
[root@Redis ~]# vim /webdept/svnconf/authz
注:对www.ITM.com这个项目授权 r:读 w:写
[root@Redis ~]# vim /webdept/www.ITM.com/conf/svnserve.conf
注:
anon-access = read #原先注释掉了,匿名用户可以读,使用none的话就是匿名用户不可以访问
auth-access = write #这几行都要取消注释,认证用户可以写,可以是read,write,none
password-db = passwd #密码库文件,默认使用的是同一目录下的passwd文件作为用户密码库
authz-db = authz #认证权限文件
realm = Welcome to the ITM project #登陆提示信息
注意:此配置文件的所有内容必须顶格,否则会报错
[root@Redis ~]# vim /webdept/www.CML.com/conf/svnserve.conf
注:这个项目的 passwd authz 文件均使用绝对路径指定
[root@Redis ~]# vim /etc/sysconfig/svnserve
注:把原/var/svn 改为自己创建的svn根目录
[root@Redis ~]# systemctl restart svnserve.service
如出现一直连接不上,可能是因为firewall的缘故,解决方案:
第一种
关闭防火墙:
临时关闭:systemctl stop firewalld
永久关闭:systemctl disable firewalld
或者:iptables -F
第二种
防火墙放行规则:
[root@Redis ~]# firewall-cmd --permanent --add-port=3690/tcp
[root@Redis ~]# firewall-cmd --reload
本次使用关闭防火墙
连接成功
经过排错1后连接正常,但发现每次重启系统后无法连接,服务也是启动状态,报错图:
查看服务进程:
[root@Redis ~]# ps -aux| grep svn
解决方案:
临时解决:手动执行: kill -9 1014(PID) 结束进程
启动服务:[root@Redis ~]# svnserve -d -r /webdept/
永久解决:
[root@Redis ~]# vim /etc/selinux/config
将Enforcing 改为 Disabled 永久关闭掉Selinux
[root@Redis ~]# reboot
通过永久解决方法测试后发现能正常开机自启并连接成功
实验环境:
apache 和 SVN都属于同一台服务器
IPv4:192.168.100.125/24
svn钩子是啥?
钩子就是由版本库的事件(代码提交,属性修改等)触发的程序(Shell 脚本等)。
每一个 SVN 仓库下都有一个目录hooks,在这里面放所有的钩子程序。其中以.tmpl结尾的代表是模板,可以用来参考。
[root@Redis hooks]# yum -y install httpd
[root@Redis ~]# vim /etc/httpd/conf.d/vhosts-httpd.conf
ServerName www.ITM.com
DocumentRoot /var/www/www.ITM.com
ServerName www.CML.com
DocumentRoot /var/www/www.CML.com
注:配置好虚拟目录
[root@Redis ~]# systemctl start httpd
[root@Redis ~]# systemctl enable httpd
[root@Redis ~]# cd /webdept/www.ITM.com/hooks/
[root@Redis hooks]# vim post-commit
#!/bin/sh export LANG=en_US.utf8 SVN_PATH=/usr/bin/svn WEB_PATH=/var/www/www.ITM.com sudo -u apache $SVN_PATH update $WEB_PATH --username 'test' --password '123456' --no-auth-cache |
命令解析: sudo -u apache #指定以 apache 这个用户去执行svn 更新命令,本次测试用root |
[root@Redis hooks]# chown apache:apache post-commit
[root@Redis hooks]# chmod 755 post-commit
[root@Redis hooks]# cd /var/www
[root@Redis www]# svn co svn://192.168.100.125/www.ITM.com
#输入root 用户认证密码: XXXXX
#输入svn连接用户:test
#输入svn连接密码:123456
#是否保存秘钥:yes
[root@Redis ~]# cd /webdept/www.CML.com/hooks/
[root@Redis hooks]# vim post-commit
#!/bin/sh export LANG=en_US.utf8 SVN_PATH=/usr/bin/svn WEB_PATH=/var/www/www.CML.com sudo -u apache $SVN_PATH update $WEB_PATH --username 'test' --password '123456' --no-auth-cache |
[root@Redis hooks]# chown apache:apache post-commit
[root@Redis hooks]# chmod 755 post-commit
[root@Redis hooks]# cd /var/www
[root@Redis www]# svn co svn://192.168.100.125/www.ITM.com
#输入root 用户认证密码: XXXXX
#输入svn连接用户:test
#输入svn连接密码:123456
#是否保存秘钥:yes
windows客户端先检出Svn上的项目
上传index.html 测试页面
内容分别为:
My www.CML.com V1
My www.ITM.com V1
上传好之后提交
修改Windows客户端的host文件,否则会无法连接。
第一次通过浏览器去访问
修改index.html内容后提交更新再次去访问
My www.CML.com V2
My www.ITM.com V2
那么问题又来了,要知道生产环境千变万化,各种要求层出不穷防不胜防。以上针对的环境是SVN和WEB服务器属于同一台,如果你的SVN在内网,服务器在外网怎么办?难道手工去上传更新吗?
下面来个进阶版的,使用sersync+rsync做到从内网发布到外网的服务器上!
服务器信息:
主机名 |
IP |
所属区域 |
系统 |
担任角色 |
Source |
192.168.100.125/24 |
内网 |
Centos 7.4 |
源代码存放 |
Destination |
47.91.235.X/32 |
外网 |
Centos 7.4 |
线上服务器 |
工作原理:
[root@destination ~]# yum -y install rsync #安装rsync工具
[root@destination ~]# vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = yes
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/run/rsyncd.log
[html]
#定义模块名称
path= /var/www/html/xsweb_server
#数据存放目录,这里为我网站的根目录
comment= analyse
read only = no
hosts allow = *
[root@destination ~]# /usr/bin/rsync --daemon /etc/rsyncd.conf #启动服务
[root@destination ~]# netstat -antup | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 25260/rsync
tcp6 0 0 :::873 :::* LISTEN 25260/rsync
[root@destination ~]# ps -aux | grep rsync
root 20864 0.0 0.0 112704 972 pts/1 S+ 15:13 0:00 grep --color=auto rsync
root 25260 0.0 0.0 114740 580 ? Ss Nov27 0:09 /usr/bin/rsync --daemon /etc/rsyncd.conf
外网服务器就这样配置完了,记住你的rsyncd.conf 里面的模块名称 html
########################################################################
#又带你们回顾一遍svn的创建,注意这里先不要写“钩子”
[root@Redis ~]# svnadmin create /webdept/source_web
[root@Redis ~]# cp /webdept/www.ITM.com/conf/svnserve.conf /webdept/source_web/conf/
[root@Redis ~]# cd /var/www/html/
[root@Redis html]# svn co svn://127.0.0.1/source_web
[root@Redis ~]# yum -y install rsync
[root@Redis ~]# ssh-keygen #使用root用户免交互登陆
Generating public/private rsa key pair. #回车
Enter file in which to save the key (/root/.ssh/id_rsa): #回车
Enter passphrase (empty for no passphrase): #回车
Enter same passphrase again: #回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:l7pPzaWl4vs1urARAJMBcBa7pGmTnpD62l/sBBIzs9U root@source
The key's randomart image is:
+---[RSA 2048]----+
| ..=o+o |
| o o.o |
| = + E . |
| . % . . . |
|o O o S + o |
|.+ + o o + = |
|. o + . = = o |
| o + + = o . |
|..o.. . ..=o+. |
+----[SHA256]-----+
[root@Redis ~]# ssh-copy-id [email protected] #将公钥给目标服务器
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '47.91.235.62 (47.91.235.62)' can't be established.
ECDSA key fingerprint is SHA256:1MqJ2HF1oUToNzdCzoRfRpXJA71/hW4X2sLCJeFbXa0.
ECDSA key fingerprint is MD5:e2:de:46:35:ca:a6:f8:d1:f3:6a:b0:92:52:19:5b:f7.
Are you sure you want to continue connecting (yes/no)? yes
[email protected]'s password: #输入目标服务器root密码
[root@Redis ~]# ssh [email protected] #测试登陆
安装sersync :
链接: https://pan.baidu.com/s/1gioP_p8pyNh0KtKKkuyYvw 提取码: 5a8q
[root@Redis ~]#tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@Redis ~]#mv GNU-Linux-x86/ /usr/local/sersync
[root@Redis ~]#cd !$
cd /usr/local/sersync
[root@Redis sersync]# vim confxml.xml #编辑配置文件
原:
24
25
31
32
修改后:
24
25
31
32
#在源服务器上创建测试数据,用来看sersync+rsync是否成功同步数据
[root@Redis ~]# cd /var/www/html/source_web/
[root@Redis source_web]# touch aaa
root@Redis source_web]# ls
aaa
[root@Redis ~]# /usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/confxml.xml
#启动服务
#返回线上服务器查看文件是否同步成功
[root@destination ~]# cd /var/www/html/xsweb_server/
[root@destination xsweb_server]# ls
aaa
#删除源服务器上的文件,为了后面的自动同步实验
[root@Redis hooks]# cd /var/www/html/source_web/
[root@Redis source_web]# rm -rf aaa bbb ccc
[root@Redis source_web]# killall sersync2
#没有killall 这个命令就 yum -y install psmisc 安装一下
#只所以要Killall sersync2 这个进程,是因为如果不杀掉进程后面svn提交完成后无法退出。可以自行尝试一下
重点来了,如何通过Post-commit 使它自己同步呢?
编辑post-commit 配置文件
[root@Redis ~]# vim /webdept/source_web/hooks/post-commit #复制下面脚本内容
#!/bin/sh
export LANG=en_US.utf8
SVN_PATH=/usr/bin/svn
WEB_PATH=/var/www/html/source_web
SERSYNC=/usr/local/sersync/sersync2
SERCONF=/usr/local/sersync/confxml.xml
$SVN_PATH update $WEB_PATH --username 'test' --password '123456' --no-auth-cache
if [ $? == 0 ];then
echo "" >>/tmp/sersync.log
echo `date` >>/tmp/sersync.log
echo "-----------------------------------------">>/tmp/sersync.log
$SERSYNC -d -r -o $SERCONF >>/tmp/sersync.log
if [ $? == 0 ];then
killall sersync2
else
echo "Error:Process not killed"
fi
else
echo "Error:Update to 47.91.235.62 server failed" >>/tmp/sersync.error
fi
[root@Redis ~]# chmod +x /webdept/source_web/hooks/post-commit
#打开Windows上的svn客户端,在里面创建一些文件测试