关键词:
subversion
安装
服务器
配置
apache ssl
-----------------------------
1.
引言
2.
安装过程
2.1.
安装
Apache
2.2.
安装
Subversion
2.3.
配置
2.4.
使用
SSL
来保护你的服务器
摘要
本文是
TortoiseSVN1.3.5
帮助中关于配置服务器一节的翻译,根据行文需要做了一些调整与增减。英文原文参见
TortoiseSVN1.3.5
帮助的
3.1. Apache Based Server
。
要使用
TortoiseSVN
(或者其它的
Subversion
客户端),你要有一个存放版本库的地方。你可以将版本库存放在本机,使用
file://
协议来访问,也可以将它们放在一个服务器上,使用
http://
或
svn://
协议来访问。两种服务器协议(
http://
和
svn://
)也可以被加密成
https://
及
svn+ssh://
。下面将一步一步地为你展示如何在
windows
上配置这样一个服务器。
如果你没有服务器或者你只想单独地工作,那么将版本库存放在本机并使用
file://
协议来访问是你最好的选择,这样的话,你可以略过本文。
注意:目前
windows
下的
subversion
只能跟
Apache2.0.x
配合,不能用于
Apache2.2.x
,除非你自己编译
1.
引言
在所有的
Subversion
服务器配置方式中,基于
Apache
的是最灵活的。虽然配置起来有一点点复杂,但是它提供了其它方式所没有的好处:
QUOTE:
WebDAV
基于
Apache
配置的
Subversion
服务器使用了被许多其它程序支持的
WebDAV
协议。举个例子,你可以在
Windows
的资源管理器中将这样的一个版本库挂载成一个
“Webfolder”
,然后像文件系统中的其它文件夹一样访问它。
浏览版本库
你可以在不安装
Subversion
客户端的情况下,使用浏览器来浏览版本库中的内容。这将使得更大范围的用户可以访问你的数据。
用户验证
你可以使用任何
Apache
支持的验证机制,包括
SSPI
和
LDAP
。
安全
Apache
是非常的稳定和安全,因此你的版本库自然而然地拥有同样的安全性。包括
SSL
加密。
2.
安装过程
2.1.
安装
Apache
安装
Apache
前,你要有一台运行
Windows2000
、
Windows XP + sp1
或
Windows2003
的电脑。
警告
:请注意,没安装
Service Pack 1
的
Windows XP
将导致错误的网络数据从而破坏你的版本库!
从
http://httpd.apache.org/download.cgi
下载最新版本的
Apache Web
服务器。确保你下载的版本大于
2.0.54
。
2.0.54
版本的
Apache
将不能与
Subversion 1.3.xx
配合工作。而且,小于
2.0.54
的
Apache
也因为在
windows
上的编译存在一个
bug
而导致不能与
subversion1.2
配合使用。
一旦你已经有了
Apache2
的安装程序,你可以双击它,它将引导你完成整个安装过程。请确保你输入正确的服务器
URL
(如果你的服务器没有
DNS
名称,你可以直接输入
IP
地址)。我建议你将
Apache
安装成
for all Users,on Port 80,as a service
。注意:如果你已经有一个
IIS
或者其它的程序使用
80
端口,安装可能会失败。如果是这样,你可以到程序目录下的
Apache Group\Apache2\conf
目录中找到文件
httpd.conf
,将其中的
Listen 80
改成一个不用的端口,比如
Listen 81
。然后重新运行这个安装程序,这次应该不会再有问题了。
现在你可以在你的浏览器中键入
http://loccalhost
:81
,如果呈现了一个已经配置好的网站,那么你的
Apache
就安装成功了。
警告
:
如果你将
Apache
安装成一个服务,它将以本地
system
帐户来运行。为
Apache
创建一个单独的用户来运行它将会更安全一些。
请确保运行
Apache
的用户有版本库的完全访问权限(右键版本库目录
->
属性
->
安全)。要不然,用户将无法提交他们的更改。
就算
Apache
以本机
system
来运行,你也要设置它能完全读写版本库目录。
如果没有为
Apache
配置这个许可,用户将会得到
"
禁止访问
"
的错误信息,在
Apache
的错误日志中表现为错误
500
。
2.2.
安装
Subversion
从
http://subversion.tigris.org/ser ... entList?folderID=91
(
英文
)
或
http://www.iusesvn.com/bbs/forumdisplay.php?fid=7
(中文)下载最新版本的
Subversion
。
运行
Subversion
安装程序,如果安装程序能够识别你已经安装了
Apache
,那么你的安装基本上就
OK
了。如果它不能,那么你要做一些额外的步骤。
注:如果你先安装
Apache
,再安装
Subversion
,正常情况下下面的工作
(2.3
配置前
)Subversion
安装程序已经帮你完成了
使用资源管理器,进入
Sibversion
的安装目录(通常为
c:\program files\Subversion
),找到文件
httpd/mod_dav_svn.so
和
mod_authz_svn.so
,将它们拷贝到
Apache
的
modules
目录(通常为
c:\program files\apache group\apache2\modules
)。
从
Subversion
的安装目录拷贝文件
libdb43.dll
到
Apache
的
modules
目录。
使用如记事本之类的文本编辑器编辑
Apache
的配置文件
(
通常为
c:\program files\apache group\apache2\conf\httd.conf)
,修改以下内容:
去掉以下行的注释(将开头的
#
删除):
[Copy to clipboard]
CODE:
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_module modules/mod_dav.so
在
LoadModule
节的最后添加以下两行:
[Copy to clipboard]
CODE:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
2.3.
配置
现在,你已经安装了
Apache
和
Subversion
,但是
Apache
还不知道如果处理像
TortoiseSVN
一样的
Subversion
客户端。要让
Apache
知道哪个
URL
将被
Subversion
使用,你要像下面这样编辑
Apache
的配置文件(通常在
c:\program files\apache group\apache2\conf\httpd.conf
):
在配置文件的最后添加下面这些行:
[Copy to clipboard]
CODE:
<Location /svn>
DAV svn
SVNParentPath D:\SVN
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile D:\passwd
#AuthzSVNAccessFile D:\svnaccessfile
Require valid-user
</Location>
这样配置表示:你所有的版本库将位于
D:\SVN
目录下,要访问你的版本库可以使用这样的
URL
:
http://MyServer/svn/
,访问权限将由
passwd
文件中的用户名
/
密码来限制。
要创建
passwd
文件,可以打开命令行
(DOS
窗口
)
,将当前目录切换到
apache2
目录(通常为
c:\program files\apache group\apache2
),然后打入以下命令以创建文件:
[Copy to clipboard]
CODE:
bin\htpasswd -c passwd <username>
重启
Apache
服务。
将你的浏览器指向
http://MyServer/svn/MyNewRepository(MyNewRepository
是你之前创建的
Subversion
版本库
)
。如果一切正常,你将被提示输入用户名密码,输入正确的用户名密码后你就可以看到版本库中的内容了。
对你刚刚输入的
apache
配置作一些简短的说明:
QUOTE:
<Location /svn>
意味着可以通过像这样的
URL(http://MyServer/svn)
来访问
Subversion
版本库
DAV svn
告诉
Apache
哪个模块负责服务像那样的
URL
--在这里就是
Subversion
模块
SVNListParentPath on
在
Subversion 1.3
及更高版本中,这个指示器使得
Subversion
列出由
SVNParentPath
指定的目录下所有的版本库
SVNParentPath D:\SVN
告诉
Subversion
在目录
D:\SVN
下寻找版本库
AuthType Basic
启用基本的验证,比如用户名
/
密码对
AuthName "Subversion repositories"
当一个验证对话框弹出时,告诉用户这个验证是用来做什么的
AuthUserFile D:\passwd
指定
D:\passwd
用为密码文件用来验证用户的用户名及密码
AuthzSVNAccessFile D:\svnaccessfile
指定
D:\svnaccessfile
来限定各个用户或组在版本库中目录的访问权限
Require valid-user
限定用户只有输入正确的用户名及密码后才能访问这个路径
----------------------------------------
上面的配置仅仅是一个简单的示例。你还可以对
Apache
进行许许多多的配置。
1
如果你想让所有用户对版本库都有读的权限而只有特定的用户才有写的权限,你可以将这行
[Copy to clipboard]
CODE:
Require valid-user
改为
[Copy to clipboard]
CODE:
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
2
上面的配置使用了
passwd
文件将你所有的版本库作为一个单元来限定访问权限。如果你想获得更多的控制,如限定某个用户可以访问版本库中的哪个目录,可以把下面这行的
#
去掉:
[Copy to clipboard]
CODE:
#AuthzSVNAccessFile D:\svnaccessfile
然后用文本编辑器创建一个
Subversion
授权文件。
Apache
将确保只有有效的用户可以访问你的
/svn
位置,然后将用户名传到
AuthzSVNAccessFile
模块,这样可以依据
Subversion
授权文件得到更精细的权限控制。注意,路径将被指定为
[
库
:
路径
]
或者简单的
[
路径
]
。如果你不明确指定一个库,访问规则将应用到由
SVNParentPath
指定的目录下所有的版本库中。一个授权文件例子可能像这样:
[Copy to clipboard]
CODE:
[groups]
admin = john, kate
devteam1 = john, rachel, sally
devteam2 = kate, peter, mark
docs = bob, jane, mike
training = zak
#
为所有库指定默认访问规则
#
所有人可以读,管理员可以写,危险分子没有任何权限
[/]
* = r
@admin = rw
dangerman =
#
允许开发人员可以完全访问他们的项目版本库
[proj1:/]
@devteam1 = rw
[proj2:/]
@devteam2 = rw
[bigproj:/]
@devteam1 = rw
@devteam2 = rw
trevor = rw
#
文档编写人员对所有的
docs
目录有写权限
[/trunk/doc]
@docs = rw
#
培训人员可以完全访问培训版本库
[TrainingRepos:/]
@training = rw
2.4.
使用
SSL
来保护你的服务器
因为美国出口限制,默认安装的
Apache
服务器不支持
SSL
。但是你自己可以很容易地在其它地方下载到所需要的模块,然后安装它。
首先你需要
SSL
的必需文件。你可以
http://hunter.campbus.com/
或这里找到相应的软件包(或者下载本主题的附件
1
:
附件
:
mod_ssl_etc.rar
(2006-10-16 15:30, 595.45 K)
该附件被下载次数
103
)。然后只要将包解开将其中的
mod_ssl.so
拷到
Apache
的
modules
目录、
openssl.exe
、
libeay32.dll
、
ssleay32.dll
拷到
bin
目录、
conf/ssl.conf
拷到
conf
目录。
在
Apache
的
conf
目录中用文本编辑器打开
ssl.conf
。
将下面这些行用
#
注释掉:
[Copy to clipboard]
CODE:
DocumentRoot "c:/apache/htdocs"
ServerName www.example.com:443
ServerAdmin you@example.com
ErrorLog logs/error_log
TransferLog logs/access_log
修改
[Copy to clipboard]
CODE:
SSLCertificateFile conf/ssl.crt/server.crt
为
[Copy to clipboard]
CODE:
SSLCertificateFile conf/ssl/my-server.cert
修改
[Copy to clipboard]
CODE:
SSLCertificateKeyFile conf/ssl.key/server.key
为
[Copy to clipboard]
CODE:
SSLCertificateKeyFile conf/ssl/my-server.key
修改
[Copy to clipboard]
CODE:
SSLMutex file:logs/ssl_mutex
为
[Copy to clipboard]
CODE:
SSLMutex default
删除以下两行
(
如果有
)
:
[Copy to clipboard]
CODE:
<IfDefine SSL>
</IfDefine>
打开
Apache
配置文件
(httpd.conf)
,去掉这行的注释
[Copy to clipboard]
CODE:
#LoadModule ssl_module modules/mod_ssl.so
Openssl
需要一个配置文件。你可以从这里下载一个可工作的版本
http://tud.at/programm/openssl.cnf
(
或者本主题附件
2
:
附件
:
openssl.cnf.rar
(2006-9-10 19:11, 1.21 K)
该附件被下载次数
74
)
。将它保存到
bin/openssl.cnf
。
下面你要创建一个
SSL
证书。你可以打开一个命令行窗口,然后
cd
到
Apache
安装目录(比如
C:\program files\apache group\apache2
),敲入以下命令:
[Copy to clipboard]
CODE:
bin\openssl req -config bin\openssl.cnf -new -out my-server.csr
你将被问及一句口令短语。请注意,不要使用简单的几个词,而应该输入一整个句子,比如一篇诗词的一部份,越长越好。同样,你还要输入你的服务器
URL
。然后其它的问题都是可选问答的,不过我建议你也将它们填充。
下一步,敲入以下命令:
[Copy to clipboard]
CODE:
bin\openssl rsa -in privkey.pem -out my-server.key
以及(注意,只有一行)
[Copy to clipboard]
CODE:
bin\openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000
这样将创建一个
4000
天后才过期的证书。最后敲入:
[Copy to clipboard]
CODE:
bin\openssl x509 -in my-server.cert -out my-server.der.crt -outform DER
这些命令在
Apache
目录下创建了一些文件(
my-server.der.crt, my-server.csr, my-server.key, .rnd, privkey.pem, my-server.cert
)。将这些文件拷贝到目录
conf/ssl
(比如
C:\program files\apache group\apache2\conf\ssl
),如果目录
ssl
不存在,你必须先创建一个。
重启
Apache
服务。
现在可以用类似这样的
url
来访问你的版本库了
https://servername/svn/project
QUOTE:
强制通过
SSL
来访问
当你配置了
SSL
来提高版本库安全时,你可能想禁用无
SSL
的
http
访问方式,而只允许通过
https
访问。要达到这种效果,你要在
<Location>
块加入另外一个指示器
SSLRequireSSL
。
一个示例
<Location>
块可能像这样:
<Location /svn>
DAV svn
SVNParentPath D:\SVN
SSLRequireSSL
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile passwd
#AuthzSVNAccessFile svnaccessfile
Require valid-user
</Location>
以上介绍的配置为
Apache
多库方式
,即一个
location
可以同时为多个版本库服务,
假设你的
ip
为
192.168.0.1
,在
D:\SVN
目录下建了两个版本库,
proj1
和
proj2
可以分别用下面两个
url
来访问你的版本库
[Copy to clipboard]
CODE:
http://192.168.0.1/svn/proj1
[Copy to clipboard]
CODE:
http://192.168.0.1/svn/proj1
还有一种配置方式为
Apache
单库方式
,即一个
location
只能为一个版本库服务,
配置时只要将上面的
SVNParentPath
改为
SVNPath
,同时将后面的路径由版本库的父目录改为版本库的目录
如:
[Copy to clipboard]
CODE:
<Location /svn>
SVNPath D:\SVN\proj1
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile D:\passwd
#AuthzSVNAccessFile D:\svnaccessfile
Require valid-user
</Location>
这时,可以用下面的
URL
来访问版本库
proj1
[Copy to clipboard]
CODE:
http://192.168.0.1/svn