Apache與SVN的內建 按照網上的資料配置SVN,無法送出代碼,錯誤如下: svn ci -m "test" svn: Commit failed (details follow): svn: Can't create directory '/home/pub/svn/repos/db/transactions/1-1.txn': Permission denied 解決辦法: sudo chmod 777 /home/pub/svn sudo chmod 777 /home/pub/svn/repos sudo chmod 777 /home/pub/svn/repos/db sudo chmod 777 /home/pub/svn/repos/dav sudo chown -R apache:apache /home/pub/svn 同時apache是以Group apache, User apache運作的。 ... 4、修改Apache的配置檔案 httpd.conf 如下: 在LoadModule cgi_module modules/mod_cgi.so這一行(大概是第83行)後邊增加如下内容 # For SVN LoadModule dav_module modules/mod_dav.so LoadModule dav_fs_module modules/mod_dav_fs.so LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so 或者在子產品加載清單找到以下語句:#LoadModule dav_module modules/mod_dav.so和#LoadModule dav_fs_module modules/mod_dav_fs.so。去掉前面的“#”号,啟用加載這兩個子產品。然後再在子產品加載語句最後添加以下兩行: LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_modulemodules/mod_authz_svn.so 5、拷貝解壓後的SVN目錄下bin檔案夾(對應本例即為 C:/Subversion Server/bin)下的mod_authz_svn.so和mod_dav_svn.so這兩個檔案,到Apache安裝目錄下的modules檔案(本例即為目錄 C:/Apache Software Foundation/Apache2.2/modules)下。 解壓後的SVN目錄下bin檔案夾(對應本例即為 C:/Subversion Server/bin)下的libdb44.dll、libeay32.dll、ssleay32.dll到Apache安裝目錄下的bin檔案夾(即目錄(本例即為目錄 C:/Apache Software Foundation/Apache2.2/bin)下。 6、設定環境變量,必不可少的一步:APR_ICONV_PATH=SVN解壓目錄/iconv,并增加Path變量SVN解壓目錄/bin,對應本例,設定如下:(環境變量的設定方法略) APR_ICONV_PATH=C:/Subversion Server/iconv 在Path變量中增加C:/Subversion Server/bin 7、建立了版本庫以後,修改Apache配置檔案httpd.conf,根據需要建立伺服器。 不帶有任何權限控制的SVN伺服器: 在檔案最後追加如下内容: #SVN <Location /svn> DAV svn SVNListParentPath on #使用SVN版本庫清單功能 SVNParentPath D:/SVN #SVN版本庫根目錄 </Location> 較完備的SVN伺服器:(在httpd.conf後追加如下内容) #SVN <Location /svn/> DAV svn SVNListParentPath on SVNParentPath D:/SVN #SVN版本庫根目錄 #認證的類型 AuthType Basic #認證的名稱,顯示于登入提示框 AuthName "Subversion repositories!Login needed!" #Which password file to use for authentication 存儲使用者登入資訊的檔案 AuthUserFile D:/SVN/passwd #Location of the Access file for paths inside a Subversion repository!存儲SVN伺服器的通路控制政策 AuthzSVNAccessFile D:/SVN/svnaccessfile.txt #For any operations other than these, require an authenticated user.匿名使用者隻有讀權限 登入使用者有寫權限 #在使用AcessFile時如允許匿名通路仍需這樣寫 <LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user #Only valid users are allowed to access the URL </LimitExcept> </Location> 重新開機Apche伺服器即可,在浏覽器輸入:http://localhost/svn/ 驗證配置。 注意:這樣的配置目前還不能用Apache Monitor去啟動服務,必須去指令行隻Apache安裝目錄,輸入httpd指令才能正常啟動~ SVN的使用可以參看我的另外一篇文章: SVN 使用心得 !期待支援Apache 2.2.4 的Exe版本的SVN的釋出。 另外,給大家推薦一個很好的學習和使用SVN的網站:我用Subversion - Subversion中文論壇。是我目前見到的國内的學習SVN最好的網站,相信使用SVN碰到的大部分問題在其中都可以找到合适的解決方法的。尤其推薦:TortoiseSVN中文幫助手冊 ,裡邊有非常詳細的SVN的安裝配置以及使用說明。 http://www.blogjava.net/xfcy2003/archive/2007/02/26/100715.html subversion+apache 配置 2上面的配置使用了passwd檔案将你所有的版本庫作為一個單元來限定通路權限。如果你想獲得更多的控制,如限定某個使用者可以通路版本庫中 的哪個目錄,可以把下面這行的#去掉: CODE: #AuthzSVNAccessFile D:/svnaccessfile 然後用文本編輯器建立一個Subversion授權檔案。Apache将確定隻有有效的使用者可以通路你的/svn位置,然後将使用者名傳到 AuthzSVNAccessFile子產品,這樣可以依據Subversion授權檔案得到更精細的權限控制。注意,路徑将被指定為[庫:路徑]或者簡單的[路徑]。如 果你不明确指定一個庫,通路規則将應用到由SVNParentPath指定的目錄下所有的版本庫中。一個授權檔案例子可能像這樣: 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) 該附件被下載下傳次數 110 )。然後隻要将包解開将其中的mod_ssl.so拷到Apache的modules目錄、openssl.exe、libeay32.dll、ssleay32.dll拷到bin目錄、 conf/ssl.conf拷到conf目錄。 在Apache的conf目錄中用文本編輯器打開ssl.conf。 将下面這些行用#注釋掉: CODE: DocumentRoot "c:/apache/htdocs" ServerName www.example.com:443 ServerAdmin [email protected] ErrorLog logs/error_log TransferLog logs/access_log 修改 CODE: SSLCertificateFile conf/ssl.crt/server.crt 為 CODE: SSLCertificateFile conf/ssl/my-server.cert 修改 CODE: SSLCertificateKeyFile conf/ssl.key/server.key 為 CODE: SSLCertificateKeyFile conf/ssl/my-server.key 修改 CODE: SSLMutex file:logs/ssl_mutex 為 CODE: SSLMutex default 删除以下兩行(如果有,我認為有錯,删掉之後apache無法啟動): CODE: <IfDefine SSL> </IfDefine> 打開Apache配置檔案(httpd.conf),去掉這行的注釋 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) 該附件被下載下傳次數 84 )。将它儲存到bin/openssl.cnf。 下面你要建立一個SSL證書。你可以打開一個指令行視窗,然後cd到Apache安裝目錄(比如C:/program files/apache group/apache2),敲入 以下指令: CODE: bin/openssl req -config bin/openssl.cnf -new -out my-server.csr 你将被問及一句密碼短語。請注意,不要使用簡單的幾個詞,而應該輸入一整個句子,比如一篇詩詞的一部份,越長越好。同樣,你還要輸入 你的伺服器URL。然後其它的問題都是可選問答的,不過我建議你也将它們填充。 下一步,敲入以下指令: CODE: bin/openssl rsa -in privkey.pem -out my-server.key 以及(注意,隻有一行) CODE: bin/openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000 這樣将建立一個4000天後才過期的證書。最後敲入: 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來通路你的版本庫 CODE: http://192.168.0.1/svn/proj1 CODE: http://192.168.0.1/svn/proj1 還有一種配置方式為Apache單庫方式,即一個location隻能為一個版本庫服務, 配置時隻要将上面的SVNParentPath改為SVNPath,同時将後面的路徑由版本庫的父目錄改為版本庫的目錄 如: CODE: <Location /svn> SVNPath D:/SVN/proj1 AuthType Basic AuthName "Subversion repositories" AuthUserFile D:/passwd #AuthzSVNAccessFile D:/svnaccessfile Require valid-user </Location> posted on 2007-02-26 11:49 用 mod_authz_svn 進行目錄通路控制 首先需要讓 Apache 将 mod_authz_svn 子產品加載進來。在 Subversion 的安裝目錄中找到 mod_auth_svn 子產品,将其拷貝到 Apache 安裝目錄的 modules 子目錄下。修改 httpd.conf 檔案,找到 LoadModule dav_svn_module modules/mod_dav_svn.so
| 在其後面加上 LoadModule authz_svn_module modules/mod_authz_svn.so
| 現在可以在 Location 标簽中使用 authz 的功能了。一個基本的 authz 配置如下: <Location /repos>
DAV svn
SVNPath /etc/svn/repos
AuthType Basic
AuthName "svn repos"
AuthUserFile /etc/svn/passwd
AuthzSVNAccessFile /etc/svn/accesspolicy
Satisfy Any
Require valid-user
</Location>
| AuthzSVNAccessFile 指向的是 authz 的政策檔案,詳細的權限控制可以在這個政策檔案中指定,如: #兩個分組:committers,developers
[groups]
committers = paulex richard
developers = jimmy michel spark sean /
steven tony robert
#在根目錄下指定所有的使用者有讀權限
[/]
* = r
#追加 committers 組使用者有讀寫權限
@committers = rw
#在 branches/dev 目錄下指定 developers 組的使用者有讀寫權限
[/branches/dev]
@developers = rw
#在 /tags 組下給予使用者 tony 讀寫權限
[/tags]
tony = rw
#禁止所有使用者通路 /private 目錄
[/private]
* =
#給 committers 組使用者讀權限
@committers= r
| 使用 SVNParentPath 代替 SVNPath 來指定多個版本庫的父目錄時,其中所有的版本庫都将按照這個政策檔案配置。例如上例中 tony 将對所有版本庫裡的 /tags 目錄具有讀寫權限。如果要對具體每個版本庫配置,用如下的文法: [groups]
project1_committers = paulex richard
project2_committers = jimmy michel spark sean /
steven tony robert
[repos1:/]
* = r
@ project1_committer = rw
[repos2:/]
* = r
@ project2_committer = rw
| 這樣項目1的 committer 組隻能對 repos1 版本庫下的檔案具有寫權限而不能修改版本庫 repos2,同樣項目2的 commiter 也不能修改 repos1 版本庫的檔案。 用 MySQL 代替檔案形式存放密碼 到目前為止我們的使用者名密碼檔案還是以文本檔案形式存放在檔案系統中的,出于安全性的需要或者單點登陸等可擴充性的考慮,文本檔案的管理方式都不能滿足需求了。通過 Apache 的 module_auth_mysql 子產品,我們可以用 MySQL 來儲存使用者資訊。該子產品的首頁在 http://modauthmysql.sourceforge.net/,你也可以在 http://modules.apache.org/ 找到它的發行版本。安裝方法同上述 Apache 的子產品一樣,拷貝至 modules 目錄并在 httpd.conf 檔案中添加如下語句: LoadModule mysql_auth_module modules/mod_auth_mysql.so
| 相應的 Location 區域改寫為: <Location /repos>
AuthName "MySQL auth"
AuthType Basic
AuthMySQLHost localhost
AuthMySQLCryptedPasswords Off
AuthMySQLUser root
AuthMySQLDB svn
AuthMySQLUserTable users
require valid-user
</Location>
| 然後在 mysql 中添加名為 svn 的資料庫,并建立 users 資料表: create database svn;
use svn;
CREATE TABLE users (
user_name CHAR(30) NOT NULL,
user_passwd CHAR(20) NOT NULL,
user_group CHAR(10),
PRIMARY KEY (user_name)
);
| 在 users 表中插入使用者資訊 insert into users values('username','password','group');
| 重新啟動 Apache,在通路版本庫的時候 Apache 就會用 mysql 資料表中的使用者資訊來驗證了。 用 SSL 實作安全的網絡傳輸 通過 Apache 的網絡連結,版本庫中的代碼和資料可以在網際網路上傳輸,為了避免資料的明文傳輸,實作安全的版本控制,需要對資料的傳輸進行加密。Apache 提供了基于 SSL 的資料傳輸加密子產品 mod_ssl,有了它,使用者就可以用 https 協定通路版本庫,進而實作資料的加密傳輸了。SSL 協定及其實作方式,是一個非常複雜的話題,本文隻是介紹 Apache 提供的最基本的SSL配置方法,更加詳細的介紹内容,請參考 http://httpd.apache.org/docs-2.0/ssl/ 上的文檔。 開始配置前,我們需要一個實作 Apache 中 SSL 子產品的動态程式庫,通常名為 mod_ssl.so,及其配置檔案,通常名為 ssl.conf。這個實作是跟 Apache 的版本相關的,不比對的版本是不能用的;而且,并不是每一個 Apache 的版本都自帶了相關實作檔案,很多情況下,我們需要自己去搜尋相關檔案。另外,我們還需要 OpenSSL 軟體及其配置檔案,來生成加密密鑰和數字證書。這裡,我們可以使用一些免費網站,如 http://hunter.campbus.com/ 上提供的內建版本的 Apache。 有了相關的工具和檔案,我們就可以開始生成 SSL 的證書和密鑰了。首先,我們需要找到 openssl 程式及其配置檔案 openssl.cnf,運作如下指令來生成 128 位的 RSA 私有密鑰檔案 my-server.key:
openssl genrsa -des3 -out my-server.key 1024
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
.....++++++
........++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:********
Verifying - Enter pass phrase for server.key:********
| 指令運作期間需要使用者輸入并确認自己的密碼。 現在,我們需要 SSL 的認證證書,證書是由 CA(certificate authority) 發放并且認證的。為此,我們可以用如下指令生成一個 CSR(Certificate Signing Request) 檔案發給 CA,進而得到 CA 的認證: openssl req -new -key my-server.key -out my-s erver.csr -config openssl.cnf
| 當然,一般情況下,如果 Subversion 的使用者不是太多,安全情況不是很複雜,我們也可以生成一個自簽名的認證證書,進而省去了向 CA 申請認證的麻煩。如下指令: openssl req -new -key my-server.key -x509 -out my-server.crt -config openssl.cnf
| 以上兩個指令都需要使用者輸入那個 key 檔案的密碼,以及一些網絡設定資訊,如域名,郵箱等等,這裡輸入的伺服器域名應該與 Apache 配置檔案當中的一緻。現在,我們可以在 Apache 的 conf 目錄下建立一個 ssl 目錄,将 my-server.key 和 my-server.crt 檔案都移動到 ssl 目錄裡面。然後修改 ssl.conf 檔案,将 SSLCertificateKeyFile 和 SSLCertificateFile 項指向這兩個檔案。 如果 Apache 的 module 目錄裡面沒有 mod_ssl.so 檔案,可以将事先準備好的檔案拷貝過去。然後,我們可以設定 Apache 的配置檔案 httpd.conf,将 ssl 子產品加入其中: LoadModule ssl_module modules/mod_ssl.so
| 然後,在配置檔案的最後,加上如下 SSL 相關配置項: SSLMutex default
SSLRandomSeed startup builtin
SSLSessionCache none
ErrorLog logs/SSL.log
LogLevel info
<VirtualHost svntest.ut.cn.ibm.com:443>
SSLEngine On
SSLCertificateFile conf/ssl/my-server.crt
SSLCertificateKeyFile conf/ssl/my-server.key
</VirtualHost>
| 這樣,基本的設定工作就完成了。重新啟動 Apache 伺服器,現在可以用 https 協定代替 http 協定來通路版本庫了。如果要限定版本庫隻能用 https 通路,我們可以在 Apache 配置檔案當中 Subversion 部分加上 “SSLRequireSSL”。如下: <Location /repos>
DAV svn
SVNPath /etc/svn/repos
………….#other items
SSLRequireSSL
</Location>
| 總結 Subversion 以其優良的版本控制功能,靈活的網絡通路模型,以及與 Apache 伺服器聯合配置所帶來的更強大的管理控制功能,逐漸在開源軟體開發的實踐當中得到廣泛的應用。本文重點介紹了 Subversion 伺服器端的配置以及與 Apache 伺服器聯合配置的基本步驟和簡單應用,實作了簡單的執行個體應用。讀者如果想要進一步了解相關資訊,請參考文章後面列出的相關資料。 |