1. 引言
在所有的Subversion服務(wù)器配置方式中,基于Apache的是最靈活的。雖然配置起來(lái)有一點(diǎn)點(diǎn)復(fù)雜,但是它提供了其它方式所沒(méi)有的好處:
WebDAV
基于Apache配置的Subversion服務(wù)器使用了被許多其它程序支持的WebDAV協(xié)議。舉個(gè)例子,你可以在Windows的資源管理器中將這樣的一個(gè)版本庫(kù)掛載成一個(gè)“Webfolder”,然后像文件系統(tǒng)中的其它文件夾一樣訪問(wèn)它。

瀏覽版本庫(kù)
你可以在不安裝Subversion客戶端的情況下,使用瀏覽器來(lái)瀏覽版本庫(kù)中的內(nèi)容。這將使得更大范圍的用戶可以訪問(wèn)你的數(shù)據(jù)。

用戶驗(yàn)證
你可以使用任何Apache支持的驗(yàn)證機(jī)制,包括SSPI和LDAP。

安全
Apache是非常的穩(wěn)定和安全,因此你的版本庫(kù)自然而然地?fù)碛型瑯拥陌踩?。包括SSL加密。

. 安裝過(guò)程
2.1. 安裝Apache
安裝Apache前,你要有一臺(tái)運(yùn)行Windows2000、Windows XP + sp1或Windows2003的電腦。
警告:請(qǐng)注意,沒(méi)安裝Service Pack 1的Windows XP將導(dǎo)致錯(cuò)誤的網(wǎng)絡(luò)數(shù)據(jù)從而破壞你的版本庫(kù)!
從
http://httpd.apache.org/download.cgi 最新版本的Apache Web服務(wù)器。確保你下載的版本大于2.0.54。2.0.54版本的Apache將不能與Subversion 1.3.xx配合工作。而且,小于2.0.54的Apache也因?yàn)樵趙indows上的編譯存在一個(gè)bug而導(dǎo)致不能與subversion1.2配合使用。
一旦你已經(jīng)有了Apache2的安裝程序,你可以雙擊它,它將引導(dǎo)你完成整個(gè)安裝過(guò)程。請(qǐng)確保你輸入正確的服務(wù)器URL(如果你的服務(wù)器沒(méi)有DNS名稱,你可以直接輸入IP地址)。我建議你將Apache安裝成 for all Users,on Port 80,as a service。注意:如果你已經(jīng)有一個(gè)IIS或者其它的程序使用80端口,安裝可能會(huì)失敗。如果是這樣,你可以到程序目錄下的Apache Group\Apache2\conf目錄中找到文件httpd.conf,將其中的Listen 80改成一個(gè)不用的端口,比如Listen 81。然后重新運(yùn)行這個(gè)安裝程序,這次應(yīng)該不會(huì)再有問(wèn)題了。
現(xiàn)在你可以在你的瀏覽器中鍵入
http://loccalhost,如果呈現(xiàn)了一個(gè)已經(jīng)配置好的網(wǎng)站,那么你的Apache就安裝成功了。
警告:
如果你將Apache安裝成一個(gè)服務(wù),它將以本地system帳戶來(lái)運(yùn)行。為Apache創(chuàng)建一個(gè)單獨(dú)的用戶來(lái)運(yùn)行它將會(huì)更安全一些。
請(qǐng)確保運(yùn)行Apache的用戶有版本庫(kù)的完全訪問(wèn)
權(quán)限(右鍵版本庫(kù)目錄->屬性->安全)。要不然,用戶將無(wú)法提交他們的更改。
就算Apache以本機(jī)system來(lái)運(yùn)行,你也要設(shè)置它能完全讀寫(xiě)版本庫(kù)目錄。
如果沒(méi)有為Apache配置這個(gè)許可,用戶將會(huì)得到"禁止訪問(wèn)"的錯(cuò)誤信息,在Apache的錯(cuò)誤日志中表現(xiàn)為錯(cuò)誤500。
2.2. 安裝Subversion
從
http://subversion.tigris.org/ser ... entList?folderID=91 (英文)
或
http://bbs.iusesvn.com/forum-7-1.html(
中文)下載最新版本的Subversion。
運(yùn)行Subversion安裝程序,如果安裝程序能夠識(shí)別你已經(jīng)安裝了Apache,那么你的安裝基本上就OK了。如果它不能,那么你要做一些額外的步驟。
注:如果你先安裝Apache,再安裝Subversion,正常情況下下面的工作(2.3配置前)Subversion安裝程序已經(jīng)幫你完成了
使用資源管理器,進(jìn)入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),修改以下內(nèi)容:
去掉以下行的注釋(將開(kāi)頭的#刪除):
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_module modules/mod_dav.so

在LoadModule節(jié)的最后添加以下兩行:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

2.3. 配置
現(xiàn)在,你已經(jīng)安裝了Apache和Subversion,但是Apache還不知道如果處理像TortoiseSVN一樣的Subversion客戶端。要讓Apache知道哪個(gè)URL將被Subversion使用,你要像下面這樣編輯Apache的配置文件(通常在c:\program files\apache group\apache2\conf\httpd.conf):
在配置文件的最后添加下面這些行:
<Location /svn>
DAV svn
SVNParentPath D:\SVN
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile D:\passwd
#AuthzSVNAccessFile D:\svnaccessfile
Require valid-user
</Location>

這樣配置表示:你所有的版本庫(kù)將位于D:\SVN目錄下,要訪問(wèn)你的版本庫(kù)可以使用這樣的URL:
http://MyServer/svn/,訪問(wèn)權(quán)限將由passwd文件中的用戶名/密碼來(lái)限制。
要?jiǎng)?chuàng)建passwd文件,可以打開(kāi)命令行(DOS窗口),將當(dāng)前目錄切換到apache2目錄(通常為c:\program files\apache group\apache2),然后打入以下命令以創(chuàng)建文件:
bin\htpasswd -c passwd <username>

此命令執(zhí)行bin目錄下的htpasswd.exe來(lái)創(chuàng)建一個(gè)密碼文件,重啟Apache服務(wù)。
將你的瀏覽器指向
http://MyServer/svn/MyNewRepository(MyNewRepository是你之前創(chuàng)建的Subversion版本庫(kù))。如果一切正常,你將被提示輸入用戶名密碼,輸入正確的用戶名密碼后你就可以看到版本庫(kù)中的內(nèi)容了。
對(duì)你剛剛輸入的apache配置作一些簡(jiǎn)短的說(shuō)明:
<Location /svn>

意味著可以通過(guò)像這樣的URL(http://MyServer/svn)來(lái)訪問(wèn)Subversion版本庫(kù)

DAV svn

告訴Apache哪個(gè)模塊負(fù)責(zé)服務(wù)像那樣的URL--在這里就是Subversion模塊

SVNListParentPath on

在Subversion 1.3及更高版本中,這個(gè)指示器使得Subversion列出由SVNParentPath指定的目錄下所有的版本庫(kù)

SVNParentPath D:\SVN

告訴Subversion在目錄D:\SVN下尋找版本庫(kù)

AuthType Basic

啟用基本的驗(yàn)證,比如用戶名/密碼對(duì)

AuthName "Subversion repositories"

當(dāng)一個(gè)驗(yàn)證對(duì)話框彈出時(shí),告訴用戶這個(gè)驗(yàn)證是用來(lái)做什么的

AuthUserFile D:\passwd

指定D:\passwd用為密碼文件用來(lái)驗(yàn)證用戶的用戶名及密碼

AuthzSVNAccessFile D:\svnaccessfile

指定D:\svnaccessfile來(lái)限定各個(gè)用戶或組在版本庫(kù)中目錄的訪問(wèn)權(quán)限

Require valid-user

限定用戶只有輸入正確的用戶名及密碼后才能訪問(wèn)這個(gè)路徑

上面的配置僅僅是一個(gè)簡(jiǎn)單的示例。你還可以對(duì)Apache進(jìn)行許許多多的配置。
1如果你想讓所有用戶對(duì)版本庫(kù)都有讀的權(quán)限而只有特定的用戶才有寫(xiě)的權(quán)限,你可以將這行
復(fù)制內(nèi)容到剪貼板
代碼:
Require valid-user
改為
復(fù)制內(nèi)容到剪貼板
代碼:
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
2上面的配置使用了passwd文件將你所有的版本庫(kù)作為一個(gè)單元來(lái)限定訪問(wèn)權(quán)限。如果你想獲得更多的控制,如限定某個(gè)用戶可以訪問(wèn)版本庫(kù)中的哪個(gè)目錄,可以把下面這行的#去掉:
復(fù)制內(nèi)容到剪貼板
代碼:
#AuthzSVNAccessFile D:\svnaccessfile
然后用文本編輯器創(chuàng)建一個(gè)Subversion授權(quán)文件。Apache將確保只有有效的用戶可以訪問(wèn)你的/svn位置,然后將用戶名傳到AuthzSVNAccessFile模塊,這樣可以依據(jù)Subversion授權(quán)文件得到更精細(xì)的權(quán)限控制。注意,路徑將被指定為[庫(kù):路徑]或者簡(jiǎn)單的[路徑]。如果你不明確指定一個(gè)庫(kù),訪問(wèn)規(guī)則將應(yīng)用到由SVNParentPath指定的目錄下所有的版本庫(kù)中。一個(gè)授權(quán)文件例子可能像這樣:
[groups]
admin = john, kate
devteam1 = john, rachel, sally
devteam2 = kate, peter, mark
docs = bob, jane, mike
training = zak

# 為所有庫(kù)指定默認(rèn)訪問(wèn)規(guī)則
# 所有人可以讀,管理員可以寫(xiě),危險(xiǎn)分子沒(méi)有任何權(quán)限
[/]
* = r
@admin = rw
dangerman =

# 允許開(kāi)發(fā)人員可以完全訪問(wèn)他們的項(xiàng)目版本庫(kù)
[proj1:/]
@devteam1 = rw
[proj2:/]
@devteam2 = rw
[bigproj:/]
@devteam1 = rw
@devteam2 = rw
trevor = rw

# 文檔編寫(xiě)人員對(duì)所有的docs目錄有寫(xiě)權(quán)限
[/trunk/doc]
@docs = rw

# 培訓(xùn)人員可以完全訪問(wèn)培訓(xùn)版本庫(kù)
[TrainingRepos:/]
@training = rw

2.4. 使用SSL來(lái)保護(hù)你的服務(wù)器
以上的工作已經(jīng)可以讓你的svn服務(wù)器正常工作了。
如果你要更安全一些,可以配置ssl來(lái)保護(hù)你的服務(wù)器。
因?yàn)槊绹?guó)出口限制,默認(rèn)安裝的Apache服務(wù)器不支持SSL。但是你自己可以很容易地在其它地方下載到所需要的模塊,然后安裝它。
首先你需要SSL的必需文件。你可以
http://hunter.campbus.com/ 或這里找到相應(yīng)的軟件包(或者下載本主題的附件1:
mod_ssl_etc.rar (595.45 KB)
)。然后只要將包解開(kāi)將其中的mod_ssl.so拷到Apache的modules目錄、openssl.exe、libeay32.dll、ssleay32.dll拷到bin目錄、conf/ssl.conf拷到conf目錄。
在Apache的conf目錄中用文本編輯器打開(kāi)ssl.conf。
將下面這些行用#注釋掉:
復(fù)制內(nèi)容到剪貼板
代碼:
DocumentRoot "c:/apache/htdocs"
ServerName [url]www.example.com:443[/url]
ServerAdmin [email]you@example.com[/email]
ErrorLog logs/error_log
TransferLog logs/access_log
修改
復(fù)制內(nèi)容到剪貼板
代碼:
SSLCertificateFile conf/ssl.crt/server.crt
為
復(fù)制內(nèi)容到剪貼板
代碼:
SSLCertificateFile conf/ssl/my-server.cert
修改
復(fù)制內(nèi)容到剪貼板
代碼:
SSLCertificateKeyFile conf/ssl.key/server.key
為
復(fù)制內(nèi)容到剪貼板
代碼:
SSLCertificateKeyFile conf/ssl/my-server.key
修改
復(fù)制內(nèi)容到剪貼板
代碼:
SSLMutex file:logs/ssl_mutex
為
復(fù)制內(nèi)容到剪貼板
代碼:
SSLMutex default
刪除以下兩行(如果有):
復(fù)制內(nèi)容到剪貼板
代碼:
<IfDefine SSL>
</IfDefine>
打開(kāi)Apache配置文件(httpd.conf),去掉這行的注釋
復(fù)制內(nèi)容到剪貼板
代碼:
#LoadModule ssl_module modules/mod_ssl.so
Openssl需要一個(gè)配置文件。你可以從這里下載一個(gè)可工作的版本
http://tud.at/programm/openssl.cnf (或者本主題附件2:
openssl.cnf.rar (1.21 KB)
)。將它保存到bin/openssl.cnf。
下面你要?jiǎng)?chuàng)建一個(gè)SSL證書(shū)。你可以打開(kāi)一個(gè)命令行窗口,然后cd到Apache安裝目錄(比如C:\program files\apache group\apache2),敲入以下命令:
復(fù)制內(nèi)容到剪貼板
代碼:
bin\openssl req -config bin\openssl.cnf -new -out my-server.csr
你將被問(wèn)及一句口令短語(yǔ)。請(qǐng)注意,不要使用簡(jiǎn)單的幾個(gè)詞,而應(yīng)該輸入一整個(gè)句子,比如一篇詩(shī)詞的一部份,越長(zhǎng)越好。同樣,你還要輸入你的服務(wù)器URL。然后其它的問(wèn)題都是可選問(wèn)答的,不過(guò)我建議你也將它們填充。
下一步,敲入以下命令:
復(fù)制內(nèi)容到剪貼板
代碼:
bin\openssl rsa -in privkey.pem -out my-server.key
以及(注意,只有一行)
復(fù)制內(nèi)容到剪貼板
代碼:
bin\openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000
這樣將創(chuàng)建一個(gè)4000天后才過(guò)期的證書(shū)。最后敲入:
復(fù)制內(nèi)容到剪貼板
代碼:
bin\openssl x509 -in my-server.cert -out my-server.der.crt -outform DER
這些命令在Apache目錄下創(chuàng)建了一些文件(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不存在,你必須先創(chuàng)建一個(gè)。
重啟Apache服務(wù)。
現(xiàn)在可以用類似這樣的url來(lái)訪問(wèn)你的版本庫(kù)了
https://servername/svn/project
引用:
強(qiáng)制通過(guò)SSL來(lái)訪問(wèn)
當(dāng)你配置了SSL來(lái)提高版本庫(kù)安全時(shí),你可能想禁用無(wú)SSL的http訪問(wèn)方式,而只允許通過(guò)https訪問(wèn)。要達(dá)到這種效果,你要在<Location>塊加入另外一個(gè)指示器SSLRequireSSL。
一個(gè)示例<Location>塊可能像這樣:
<Location /svn>
DAV svn
SVNParentPath D:\SVN
SSLRequireSSL
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile passwd
#AuthzSVNAccessFile svnaccessfile
Require valid-user
</Location>