Apache HTTP Server安裝與SVN集成配置
1.1 Apache HTTP Server下載地址
Apache HTTP Server (httpd) 2.2.15 is the best available version
http://httpd.apache.org/download.cgi
Download httpd-2.2.15.tar.gz
1.2 Apache HTTP Server安裝
1.2.1 上傳解壓
以svn用戶上傳安裝包httpd-2.2.15.tar.gz到/opt/svn/software/Apache目錄下。
[svn@testbed1 Apache]$ tar xvzf httpd-2.2.15.tar.gz
1.2.2 編譯配置
$ ./configure --enable-dav --enable-so --prefix=/opt/svn/apache2/
1.2.3 編譯
$ make
1.2.4 安裝
$ make install
1.2.5 配置
接着,通過修改PREFIX/conf/下的配置文件,來配置Apache HTTP服務器。
$ vi PREFIX/conf/httpd.conf
修改監聽端口號 Listen IP:8008
1.2.6 測試
啓動Apache HTTP服務器:
$ PREFIX/bin/apachectl start
$ PREFIX/bin/apachectl stop
現在,可以請求Apache HTTP Server的第一個網頁了http://IP:8008/,這個網頁位於DocumentRoot目錄下,通常是PREFIX/htdocs/。
1.3 SVN與Apache HTTP Server結合
通過 HTTP 協議訪問版本庫是 Subversion 的亮點之一。使用 Http 協議意味着只需要打開瀏覽器,輸入 URL 即可輕鬆的瀏覽整個版本庫。由於 Subversion 需要版本化的控制,因此標準的 Http 協議不能滿足需求。要讓 Apache 與 Subversion 協同工作,需要使用 WebDAV(Web 分佈式創作和版本控制)。WebDAV 是 HTTP 1.1 的擴展,關於 WebDAV 的規範和工作原理,可以參考 IETF RFC 2518。
爲了使 Subversion 與 dav 模塊通信,需要安裝 mod_dav_svn 插件,即mod_dav_svn-1.6.12-1.rhel5.x86_64.rpm組件包,可以在 Subversion 的安裝目錄中找到。將其拷貝到 Apache 安裝目錄的 modules 文件夾下。接下來就是配置 Apache 的 httpd.conf 文件,讓 Apache 在啓動的時候加載上述模塊。
用root用戶進入目錄,查找mod_dav_svn插件mod_dav_svn.so和mod_authz_svn.so
[root@testbed1 /]# find -name mod_dav_svn.so
./usr/lib64/httpd/modules/mod_dav_svn.so
[root@testbed1 /]# find -name mod_authz_svn.so
./usr/lib64/httpd/modules/mod_authz_svn.so
[root@testbed1 /]# su - svn
$cp /usr/lib64/httpd/modules/mod_dav_svn.so /opt/svn/apache2/modules/
$cp /usr/lib64/httpd/modules/mod_authz_svn.so /opt/svn/apache2/modules/
在httpd.conf文件的最後添加如下內容:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
<Location /repos>
DAV svn
SVNPath /opt/svn/svndata/repos
</Location>
Location 標籤指出訪問的 URL 以及在服務器上的實際位置。配置完畢後重新啓動 Apache,打開瀏覽器,輸入 http://IP:Port/repos 將會看到SVN的管理界面。
這表示 Apache 的 dav_svn 模塊已經可以正常工作了。用戶可以使XX用任何一種 Subversion 的客戶端通過 Http 協議訪問你的版本庫。
如果想要指定多個版本庫,可以用多個 Location 標籤,也可以使用 SVNParentPath 代替 SVNPath,例如在 /etc/svn 下有多個版本庫 repos1,repos2 等等,用如下方式指定:
<Location /repos>
DAV svn
SVNParentPath /opt/svn/svndata
</Location>
"SVNParentPath /opt/svn/svndata" 表示/opt/svn/svndata下的每個子目錄都是一個版本庫。可以通過 http://IP:Port/repos/repos1,http://IP:Port/repos/repos2 來訪問。
現在你的版本庫任何人都可以訪問,並且有完全的寫操作權限。也就是說任何人都可以匿名讀取,修改,提交,以及刪除版本庫中的內容。顯然大部分場合這是不符合需求的。那麼如何進行權限設置呢,Apache 提供了基本的權限設置。
首先需要創建一個用戶文件。Apache 提供了一個工具 htpasswd,用於生成用戶文件,可以在 Apache 的安裝目錄下找到。具體使用方法如下:
[svn@testbed1 ~]$ mkdir -p /opt/svn/conf
[svn@testbed1 ~]$ vi /opt/svn/conf/password.conf
[svn@testbed1 ~]$ /opt/svn/apache2/bin/htpasswd /opt/svn/conf/password.conf zhaiqi
New password:
Re-type new password:
Adding password for user zhaiqi
如果password.conf文件不存在,可以加上-c選項讓htpasswd新建一個,創建好的文件內容是用戶名加上密碼的 MD5 密文。
接下來修改 httpd.conf,在 Location 標籤中加入如下內容:
AuthType Basic
AuthName "svn repos"
AuthUserFile /opt/svn/conf/password.conf
Require valid-user
重新啓動 Apache, 打開瀏覽器訪問版本庫。Apache 會提示你輸入用戶名和密碼來認證登陸了,現在只有password.conf文件中設定的用戶纔可以訪問版本庫。也可以配置只有特定用戶可以訪問,替換上述 "Require valid-user" 爲 "Require user user1 user2 " 將只有user1和user2可以訪問該版本庫。
有的時候也許不需要這樣嚴格的訪問控制,例如大多數開源項目允許匿名的讀取操作,而只有認證用戶才允許寫操作。爲了實現更爲細緻的權限認證,可以使用 Limit 和
LimitExcept 標籤。例如:
<LimitExcept GET PROPFIND OPTIONS REPORT>
require valid-user
</LimitExcept>
如上配置將使匿名用戶有讀取權限,而限制只有password.conf中配置的用戶可以使用寫操作。如果這還不能滿足你的要求,可以使用 Apache 的 mod_authz_svn 模塊對每個目錄進行認證操作。
用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 /opt/svn/svndata/repos
AuthType Basic
AuthName "svn repos"
AuthUserFile /opt/svn/conf/password.conf
AuthzSVNAccessFile /opt/svn/conf/authz.conf
Satisfy Any
Require valid-user
</Location>
AuthzSVNAccessFile 指向的是 authz 的策略文件,詳細的權限控制可以在這個策略文件中指定,如:
#兩個分組:admingroup,visitorgroup,developers
[groups]
admingroup = zhaiqi,wujinkang
visitorgroup = carlos,marco
developers = jack,michel,rose,user1,user2,user3
#在根目錄下指定所有的用戶有讀權限
[/]
* = r
#追加admingroup組用戶有讀寫權限
@admingroup = rw
#在branches/dev目錄下指定developers組的用戶有讀寫權限
[/branches/dev]
@developers = rw
#在/tags組下給予用戶Jack讀寫權限
[/tags]
jack = rw
#禁止所有用戶訪問/private目錄
[/private]
* =
#給visitorgroup組用戶讀權限
@visitorgroup = r
使用SVNParentPath代替SVNPath來指定多個版本庫的父目錄時,其中所有的版本庫都將按照這個策略文件配置。例如上例中Jack將對所有版本庫裏的/tags目錄具有讀寫權限。如果要對具體每個版本庫配置,用如下的語法:
[groups]
project1_admin = user1 user2
project2_admin = jack michel rose
[repos1:/]
* = r
@ project1_admin = rw
[repos2:/]
* = r
@ project2_admin = rw
這樣項目1的admin組只能對repos1版本庫下的文件具有寫權限而不能修改版本庫repos2,同樣項目2的admin也不能修改repos1版本庫的文件。