在我去年的文章 CentOS LNMP 服务器安装配置详解中,讲解了如何利用 CentOS 6 和 LNMP 一键安装包快速搭建一个 Web 服务器。但是用这个流程建好的服务器,默认还没有远程更新代码的服务,比如 FTP 等等。不过,就更新网站程序而言,FTP 不是个好选择,尤其是有多位人员在更新服务器上的程序代码时。在这种情况下,Subversion (SVN) 是更好的选择。
在网站服务器上搭建好 Subversion 后,就可以通过 SVN 客户端来部署和管理程序代码了。每次对线上的程序代码进行修改时,都会产生一个新的版本号,并且随时可以回到以前的版本或下载以前版本的程序代码。此外,当多个人同时修改后,SVN 能够自动合并修改,并提示可能的冲突让你手动解决。
下面来介绍服务器上的安装步骤:
1. 安装 Subversion
在 CentOS 上安装 Subversion 很容易,只要一条命令即可:
yum install subversion
在其他 Linux 发行版上,可以使用相应的包管理器来安装。例如 Ubuntu 上:
apt-get install subversion
2. 建立 SVN 仓库
LNMP 一键安装包安装完成后,网站文件默认存放在 /home/wwwroot 目录。我们可以在 /home 目录下新建一个文件夹 repo,用来放置 SVN 仓库。
mkdir -p /home/repo/wwwroot
svnadmin create /home/repo/wwwroot
SVN 仓库建立完成后,在目录下会生成一些配置文件。我们接着修改这些配置文件。
3. 设置 SVN 账户及权限
首先修改 SVN 仓库的配置文件 /home/repo/wwwroot/conf/svnserve.conf 文件,修改以下项目:
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = wwwroot
然后建立账户,修改 /home/repo/wwwroot/conf/passwd 文件,添加账户和密码:
[general]
[users]
user1 = password1
user2 = password2
user3 = password3
user4 = password4
user5 = password5
接下来是基于路径的访问控制,修改 /home/repo/wwwroot/conf/authz 文件,指定账户的权限:
[groups]
group1 = user1,user2
[/] # 根目录权限设置
user3 = rw # user3权限是:读写
user4 = r # user4权限是:只读
user5 = # user5没有任何权限
@group1 = rw # group1组权限是:读写
4. 设置自动更新网站程序目录
我们希望在通过 SVN 提交代码后,自动更新网站程序目录,方法是设置“钩子”。“钩子”是一段 Shell 脚本,在 SVN 发生某个事件后自动被执行一次。通过设置 post-commit 钩子,可以让 SVN 在接到我们新提交的代码后,自动更新网站程序目录中的文件。
添加 /home/repo/wwwroot/hooks/post-commit 文件:
#!/bin/sh
REPOS="$1"
REV="$2"
svn update /home/wwwroot --username user1 --password password1
别忘了设置为可执行:
chmod u+x /home/repo/wwwroot/hooks/post-commit
5. 启动 svnserve
SVN 可以通过 Apache 等 Web 服务器来提供服务,也可以独立提供服务,两者各有优缺点,这里我们选择独立运行。启动 svnserve 后,就可以通过网络远程访问到 SVN 仓库了。
svnserve -d -r /home/repo/wwwroot # 启动
killall svnserve # 停止
也可以设置 svnserve 随系统启动,添加 /etc/init.d/svnserve 文件:
#!/bin/bash
#chkconfig: 2345 70 40
#description: Starts the Subversion serve in daemon mode
### BEGIN INIT INFO
# Provides: svnserve
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the svnserve
# Description: starts the subversion serve in daemon mode
### END INIT INFO
svnserve -d -r /home/repo/wwwroot
然后添加到系统启动项中:
chmod +x svnserve
chkconfig --add svnserve
另外,别忘了在防火墙上开放 svnserve 使用的端口,默认是 3690 端口。
6. 签出到网站目录
SVN 仓库建立完成后,先初始签出到网站目录,以后就可以通过 svn update 来自动使网站目录中的文件和 SVN 仓库中的文件同步了。
svn checkout file:///home/repo/wwwroot /home/wwwroot --username user1 --password password1
7. 拒绝 Web 访问 .svn 目录
签出到网站目录后,网站目录下会生成一些 .svn 文件夹。这些文件夹中存放的是 SVN 系统使用的文件,我们不希望用户通过 Web 浏览到这些文件。通过修改服务器配置文件,我们可以做到:
Nginx:
在 nginx.conf 的 server 块中添加:
location ~ /\. { access_log off; log_not_found off; deny all; }
Apache:
在 httpd.conf 中添加:
<FilesMatch “.svn/.*”```
Order Allow,Deny Deny from all
</FilesMatch```
重新载入服务器配置文件,让设置生效即可。
8. 通过 SVN 客户端提交程序文件
使用刚才添加的账户和密码连接到 svn://【服务器地址】/ 就可以访问 SVN 仓库了。
Windows 上最流行的 SVN 客户端是 TurtoiseSVN。而对于 Mac 和 Linux,则通常使用 SVN 命令行客户端。关于这些客户端的使用方法,Sina App Engine 的文档中心有一个很不错的入门教程可以参考。
至此,我们完成了 SVN 服务的搭建。现在你可以通过 SVN 来更好地管理网站服务器上的程序文件了。