显示标签为“apache”的博文。显示所有博文
显示标签为“apache”的博文。显示所有博文

2007年9月17日星期一

在 Windows 上使用 Trac on Apache - 安裝與設定篇

在 Windows 上使用 Trac on Apache - 安裝與設定篇

說明

最近公司的伙伴們變多了,專案的控管也變得越來越重要;原來的 Trac/Subversion 獨立伺服器在權限控制方面也變得有點礙手礙腳,所以這次我決定改以 Apache 為基礎伺服器的方式來安裝 Trac/Subversion 。

我打算把此系列文章分成三個部份:

  • 第一部份是第一次的伺服器程式安裝步驟,及相關的 Trac 模組與 Subversion 的安裝。

  • 第二部份是每次新建立一個專案時所必要的設定。

  • 第三部份是 Trac 的使用方式。

以下先來看看如何安裝及設定。


檔案下載

  • Apache 2.0(apache_2.0.59-win32-x86-no_ssl.msi)
    - 我們用它來當做伺服器,這裡一定要用 2.0.x 版。

  • Subversion (svn-win32-1.4.3.zip)
    - 基本上只要抓最新的 1.4.x 版

  • Python (python-2.4.4.msi)
    - 一定要用 2.4.x 版,因為相關套件的整合度較高。

  • mod_python (mod_python-3.2.10.win32-py2.4-apache2.0.exe)
    - 請配合上面的 Apache 及 Python 版本,並抓取最新版。

  • Python bindings for Subversion (svn-python-1.4.3.win32-py2.4.exe)
    - 這個可以讓我們透過 Python 操控 SVN ,要配合 Python 的版本抓取最新版。

  • pysqlite (pysqlite-2.3.3.win32-py2.4.exe)
    - 這個可以讓我們透過 Python 操控 Sqlite ,要配合 Python 的版本抓取最新版。

  • ClearSilver (clearsilver-0.9.14.win32-py2.4.exe)
    - 這個是一個樣版引擎,要配合 Python 的版本抓取最新版。

  • SilverCity (SilverCity-0.9.6.win32-py2.4.exe)
    - 這個是一個程式碼上色模組,要配合 Python 的版本抓取最新版。

  • setuptools (ez_setup.py)
    - 這個是方便我們安裝 Python 模組用的, Trac 的模組會用到。

  • Trac (trac-0.10.3.win32.exe)
    - 這個就是用 Python 開發的 Trac 主程式了。

  • TortoiseSVN (TortoiseSVN-1.4.3.8645-win32-svn-1.4.3.msi)
    - Windows 上的 Subversion 視覺化用戶端,找最新的就對了。

  • TortoiseSVN Language Pack (LanguagePack-1.4.3.8645-win32-zh_TW.exe)
    - TortoiseSVN 的正體中文語言套件,要配合上面的 TortoiseSVN 版本。

  • svn2cl for win32 (svn2cl-0.7-win2.zip)
    - 將 SVN 的記錄轉換成 ChangeLog 的工具 (Optional) 。

安排目錄結構

和之前一樣,我打算把相關的程式放在 D:\AppServ 底下,而檔案庫則放在 D:\Repository 底下。以下是我所規劃的目錄結構:

D:
|
|- AppServ (伺服器相關程式)
| |
| |- Apache2 ( Apache 的主要程式檔)
| |
| |- python ( Python 的主要程式檔)
| |
| |- svn ( Subversion 的主要程式檔)
| |
| |- trac ( Trac 的相關批次程式檔)
|
|- Repository (檔案庫)
|
|- svn
|
|- trac

繼續往下以前,請先按照上面的結構把目錄建立好。

註:放在 D: (或其他非 C: 分割區) 的好處是不用擔心重灌後,資料及相關設定會消失。

安裝 Apache 2

第一次安裝

如果有使用 IIS 的話,請先把 IIS 停掉。然後執行 apache_2.0.59-win32-x86-no_ssl.msi 。

然後要注意的是安裝位置,這裡我會把它安裝在 D:\AppServ\Apache2 下,方法如下:

  1. 安裝到 Setup Type 時選 Custom ,並按 Next 。

  2. 把 Apache HTTP Server 2.0.xx 的 Install to 改到 D:\AppServ ,這樣下方 Apache Runtime 的 Install to 會自動變成 D:\AppServ\Apache2 。

至於其他選項就按照當時情況自行決定囉。

安裝好後,在 D:\AppServ\Apache\conf\httpd.conf 中把 Port 80 改成 Port 8000 (或其他不影響系統運作的數字) ,然後重新啟動 Apache 及 IIS 。

後面的說明將會以 Port 8000 為主。

接著把 D:\AppServ\Apache2\bin 加入系統變數 PATH 裡,這樣方便到時候直接使用指令來控制 Apache 。

重灌系統後的安裝

假設我們的 D:\AppServ\Apache2 底下已經 Apache 的程式檔,只是重灌後使得系統設定消失。這樣的話,我們要先把D:\AppServ\Apache2\bin 加入系統變數 PATH 裡,接著再用以下方式重新建立服務 (粗體字部份) :

C:\>apache -k install -D Apache2

最後用:

C:\>apache -k start 

來啟動服務。

安裝 Subversion

第一次安裝

  1. 解開 svn-win32-1.4.3.zip ,將 svn-win32-1.4.3 這個資料夾重新命名為 svn (裡面應該有 bin 等資料夾) ,並將它移至 D:\AppServ 下。

  2. 將 D:\AppServ\svn\mod_authz_svn.so 及 D:\AppServ\svn\mod_dav_svn.so 兩個檔案複製到 D:\AppServ\Apache2\modules 下。

  3. 將 D:\AppServ\svn\bin 加到 PATH 系統環境變數裡。
  4. 在系統環境變數裡加上以下兩個變數:

    APR_ICONV_PATH = D:\AppServ\svn\iconv
    SVN_EDITOR = notepad.exe (或其他慣用的文字編輯器執行檔絕對路徑)

後面會再說明 Apache 部份需要設定的部份。

更新

當 Subversion 推出新版時,一樣是把新版本的壓縮檔下載回來,而更新的步驟跟第一次安裝是一樣的。

安裝 Python 及 Trac 相關模組

Python 主程式

python 的主程式安裝也很簡單,除了安裝位置改在 D:\AppServ\python 底下,其他就使用預設值即可。

安裝好後,將 D:\AppServ\python 加入 PATH 系統環境變數裡。

相關模組

以下的模組直接執行該 exe 檔即可,沒有任何設定需要注意。

  • 執行 svn-win32-1.4.3_py-2.4.exe ,會在 Python 的安裝目錄中註冊 svn 模組。

  • 執行 pysqlite-2.3.3.win32-py2.4.exe ,會在 Python 的安裝目錄中註冊 pysqlite 模組。

  • 執行 clearsilver-0.9.14.win32-py2.4.exe ,會在 Python 的安裝目錄中註冊 clearsilver 模組。

  • 執行 trac-0.10.3.win32.exe ,會在 Python 的安裝目錄中註冊 trac 模組。

  • 執行 SilverCity-0.9.6.win32-py2.4.exe ,會在 Python 的安裝目錄中註冊 SilverCity 模組。

mod_python 模組

執行 mod_python-3.2.10.win32-py2.4-apache2.0.exe ,一樣是按照預設值安裝;但是當問到「 Where is Apache installed? 」時要選擇「 D:\AppServ\Apache2 」,這時安裝程式會把 mod_python.so 複製到 D:\AppServ\Apache2\modules 底下。

後面會再說明 Apache 部份需要設定的部份。

setuptools 模組

如果剛剛已經有 Python 的安裝路徑設定在 PATH 系統變數裡的話,那麼直接點兩下 ez_setup.py 執行即可;或是開啟命令提示列視窗,並切換到 ez_setup.py 所存放的路徑下,並用以下指令執行 (粗體字部份) :

D:\downloads\python>python ez_setup.py 

這樣 ez_setup.py 會自動從網路下載相關套件,並安裝到 Python 裡。

更新

如果上面的任何程式有更新版本的話,也是將個別的檔案下載回來,再按照上面的步驟重新做一次即可。

安裝 TortoiseSVN

第一次安裝

  1. 執行 TortoiseSVN-1.4.3.8645-win32-svn-1.4.3.msi ,安裝完成後暫時不要重開機。

  2. 執行 LanguagePack-1.4.3.8645-win32-zh_TW.exe ,這時才需要重開機。

安裝好以後,請參考此篇文章調整 TortoiseSVN 的效能。

更新

當 TortoiseSVN 有更新版本時,要分別下載主程式與對應版本的語言套件。然後直接按照第一次安裝的步驟執行,不必移除舊有版本。

安裝 Trac Plugins

Trac 0.10.x 預設並沒有安裝管理套件,所以這裡我們要手動為它安裝。

註:據 Trac 官方指出,在 0.11 版後會內建相關的管理套件。

補充:我找到了一篇不錯的 Blog 文章:「Trac 管理小記(一):安裝 plugin 注意事項」,裡面有介紹 Trac 應該安裝的 Plugins 。

安裝 WebAdmin (for Trac 0.10.x)

WebAdmin 是用來管理 Trac 專案相關設定的套件,安裝步驟如下:

先開啟 DOS 命令列模式視窗,並切換到一個暫時的目錄 (假設是 D:\downloads\trac\plugins ) ,然後輸入以下指令 (粗體字部份) :

D:\downloads\trac\plugins>mkdir webadmin
D:\downloads\trac\plugins>cd webadmin
D:\downloads\trac\plugins\webadmin>svn co http://svn.edgewall.com/repos/trac/sandbox/webadmin/ . (請注意最後有一個句點)
D:\downloads\trac\plugins\webadmin>python setup.py install

這樣就能將 WebAdmin 安裝到 Trac 裡了,後面會說明如何在專案中啟用它們。

補充:

上面的做法顯示我不曉得 easy_install 可以讓 plugin 的安裝更簡單,在看了 b6s 的介紹後,我才知道可以改用如下的方式。

先在命令列模式視窗中切換到 D:\AppServ\python 路徑,然後輸入以下指令:

D:\AppServ\python\Scripts>easy_install http://svn.edgewall.com/repos/trac/sandbox/webadmin/

是不是比上面的方式簡單多了?

安裝 AccountManager (for Trac 0.10.x)

AccountManager 是用來管理 Trac 專案的成員帳號,安裝步驟如下:

先開啟 DOS 命令列模式視窗,並切換到一個暫時的目錄 (假設是 D:\downloads\trac\plugins ) ,然後輸入以下指令 (粗體字部份) :

D:\downloads\trac\plugins>mkdir accountmanager
D:\downloads\trac\plugins>cd accountmanager
D:\downloads\trac\plugins\accountmanager>svn co http://trac-hacks.swapoff.org/svn/accountmanagerplugin/0.10 . (請注意最後有一個句點)
D:\downloads\trac\plugins\accountmanager>python setup.py install

這樣就能將 AccountManager 安裝到 Trac 裡了,後面會說明如何在專案中啟用它們。

補充:

跟 WebAdmin 一樣,我們把安裝方式改為:

D:\AppServ\python\Scripts>easy_install http://trac-hacks.swapoff.org/svn/accountmanagerplugin/0.10

補充:安裝 IniAdmin

這個 Plugin 是 b6s 介紹的,可以讓我們直接在 Web 介面上調整 trac.ini 。安裝方式如下:

D:\Appserv\python\Scripts>easy_install http://trac-hacks.org/svn/iniadminplugin/trunk/

相關的調整後面會再說明。

Plugins 的更新

更新 Plugins 很簡單,只要利用 svn update 把最新版的 Plugins 更新回本地端,然後重新安裝即可。以 WebAdmin 為例,更新方式如下:

D:\downloads\trac\plugins>cd webadmin
D:\downloads\trac\plugins\webadmin>svn update
D:\downloads\trac\plugins\webadmin>python setup.py clean (非必要)
D:\downloads\trac\plugins\webadmin>python setup.py install

這樣就可以了。

補充:

更新 Plugin 的方式就是重新執行上面補充的步驟即可。

Trac 的 plugins 更新後,一定要重新啟動 Apache 。如果這時有登入 Trac 管理畫面的話,也必須登出再重新登入。

Apache 設定

設定使用者

我們可以讓 Trac 和 Subversion 的使用者共用同一組帳號,而這些帳號可以由 Apache 的 htpasswd 指令來建立。

假設我們把帳號密碼檔放置在 D:\Repository\project-users.db 這個文字檔裡,那麼我們可以在命令提示列中輸入以下指令 (粗體字部份) :

D:\Repository>htpasswd -c project-users.db admin
Automatically using MD5 format.
New password: ******
Re-type new password: ******
Adding password for user admin

上面的指令會先建立一個 project-users.db 文字檔,這個就是我們存放帳號密碼的地方;然後我們需要為帳號 admin 設定一組密碼,這樣一來,帳號 admin 將會是往後我們為所有專案所預設的最高管理員。

假如開發的是網站專案,會需要自動更新測試環境的檔案時,就需要再建立一個 website 帳號:

D:\Repository>htpasswd project-users.db website
Automatically using MD5 format.
New password: ******
Re-type new password: ******
Adding password for user website

website 帳號的密碼請自行決定。

模組設定

首先要先以文字編輯器開啟 D:\AppServ\Apache2\conf\httpd.conf ,然後搜尋到:

#LoadModule dav_module modules/mod_dav.so

將上面的註解 ( # 字號) 去除,然後在整個 LoadModule 區段的下方加入以下設定:

# For Subversion
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

# For Trac
LoadModule python_module modules/mod_python.so

這樣 Apache 重新啟動時,就會載入 DAV 、 SVN 和 Python 等模組。

SVN 設定

假如希望某專案的 svn 的路徑是長成這樣:

http://localhost:8000/svn/projectname

那麼就需要在 httpd.conf 的最後面加上以下設定:


DAV svn
SVNParentPath D:/Repository/svn
#
AuthType Basic
AuthName "CompanyName"
AuthUserFile "D:/Repository/project-users.db"
Require valid-user
#

這樣不論任何要存取檔案庫的動作 (例如 Checkout 或 Commit ) ,SVN 用戶端都會詢問帳號和密碼。如果希望 Checkout 時不詢問帳號密碼 (也就是匿名帳號可取得檔案) ,那麼就將 LimitExcept 部份的註解拿掉。

註:當然也可以配合 domainname 和 VirtualHost 來設定,不過內部使用的話這樣就夠了;以下的 Trac 設定也是一樣。

Trac 設定

如果希望用以下網址來連到某專案的 Trac 管理系統:

http://localhost:8000/trac/projectname

那麼也是在 httpd.conf 的最後面加上:


SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir D:/Repository/trac
PythonOption TracUriRoot /trac
AuthType Basic
AuthName "CompanyName"
AuthUserFile "D:/Repository/project-users.db"
Require valid-user

這樣任何人在連線到該網址時,都會詢問帳號密碼;這樣在權限控管上會較為安全一點。不過這樣會有一個缺點,那就是到時 Trac 的 logout 功能會沒有作用。如果想讓匿名帳號可以先連進來,然後再使用 Trac 的 login 功能來登入的話,可以改成以下方式:


SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir D:/Repository/trac
PythonOption TracUriRoot /trac



AuthType Basic
AuthName "CompanyName"
AuthUserFile "D:/Appserv/project-users.db"
Require valid-user

這樣一來,也可以 logout 後重新以另一個帳號登入。

總結

再把重點提示一次:

  1. 下載相關檔案。

  2. 安裝 Apache 、 Python (Trac) 、 Subversion 。

  3. 設定 Apache 。

以上就是 Trac/Subversion on Apache 的安裝與設定,通常只要做一次即可。而如果已經按照上面的說明將環境安裝好,那麼請再看第二篇有關第一次建立專案的說明。

註:這裡提到的方式也許不是最好的,希望有經驗的前輩能夠提點一下更好的方式。

在 Windows 上使用 Trac on Apache - 專案建置篇

在 Windows 上使用 Trac on Apache - 專案建置篇

說明

前一篇安裝與設定篇已經架設好環境了,但是專案才是 Trac/Subversion 的靈魂所在,這一篇就是說明如何建立一個新的 Trac/Subversion 專案。


建立 Subversion 專案

建立檔案庫

建立的方式很簡單,假設現在要建立一個名為 projectname 的專案,那麼就在命令提示列視窗中輸入以下指令 (粗體字部份) :

D:\>cd Repository\svn
D:\Repository\svn>svnadmin create projectname

這樣就能建立出屬於 projectname 這個專案的檔案庫了。

註:先前提過的權限設定改由 Apache 來控管,因此不用再修改 conf 底下的檔案了。

設定 post-commit

post-commit 簡單來說就是在本地端 Commit 後,會自動執行的 hook 機制;通常是用來記錄更新的 log 或是發送 Email ,這裡則是用來自動更新測試環境的 Web 檔案。其執行的原理暫時略過,這裡先說明如何設定。

這裡我先假設 D:\wwwroot\projectname 就是我們所要更新的目的地, IIS 是以它做為執行的根目錄;當我們在本地端開發的檔案 Commit 後,就會同步這裡的檔案。

接下來的設定方式很簡單,只要把以下文字存成 post-commit.bat :

@ECHO OFF
SET SVN="D:\\appserv\\svn\\bin\\svn.exe"
SET DIR="D:\\wwwroot\\projectname\\"
CALL %SVN% update %DIR% --username website --password websitepassword --non-interactive

然後存到 D:\Repository\svn\projectname\hooks\ 下即可,其中 website 帳號在前一篇說明裡已經建立了。

註:這裡也可以更新記錄存到 log 檔案裡或是發送 Email 給相關組員,不過這邊暫時不打算弄得太複雜。

建立 Trac 專案

建立好 SVN 檔案庫以後,接下來就可以建立 Trac 專案了。

建立資料庫

請切換到 D:\AppServ\python\Scripts 路徑,並在命令提示列視窗中執行以下指令 (粗體字部份) :

切換到 D:\Appserv\python\Scripts 下,建立一個名為 projectname 的 trac 專案。

D:\Appserv\python\Scripts>python trac-admin D:\Repository\trac\projectname initenv

接著會出現以下提示文字,請依照下面的建議操作:

Project Name [My Project]> New Project (輸入專案名稱,不必和目錄名稱相同)
Database connection string [sqlite:db/trac.db]> (直接按 Enter 使用預設值)
Repository type [svn]> (直接按 Enter 使用預設值)
Path to repository [/path/to/repos]> D:\Repository\svn\projectname (輸入 Subversion 專案檔案庫的位置)
Templates directory [D:\Appserv\python\share\trac\templates]> (直接按 Enter 使用預設值)

這樣就建立好 Trac 的資料庫了。

設定預設使用者

保留 D:\Appserv\python\Scripts 的執行路徑,並在命令提示列視窗中執行以下指令 (粗體字部份) :

D:\Appserv\python\Scripts>python trac-admin D:\Repository\trac\projectname permission add admin TRAC_ADMIN

這樣會將 admin 加入 Trac 專案管理者。

如果不想讓匿名使用者在 Trac 專案有任何權限的話,就執行:

D:\Appserv\python\Scripts>python trac-admin D:\Repository\trac\projectname permission remove anonymous '*'

註:之前我測試用 * 號可以刪掉所有權限,不曉得什麼時候改成要用單引號把 * 號包起來。

然後我們再建立一個 developer 群組,同時給它需要的權限 (請自行決定相關權限) :

D:\Appserv\python\Scripts>python trac-admin D:\Repository\trac\projectname permission add developer WIKI_VIEW WIKI_CREATE WIKI_MODIFY SEARCH_VIEW TICKET_APPEND TICKET_CREATE TICKET_VIEW TIMELINE_VIEW ROADMAP_VIEW

註:如果 developer 沒有對應到 Apache 所建立的帳號時,它對 Trac 而言就是一個群組。

相關 Plugins 設定

建立好 Trac 資料庫後,就要在專案裡啟用 WebAdmin 和 AccountManager 這兩個 Plugins 。請用文字編輯器打開 D:\Repository\trac\projectname\conf\trac.ini ,把以下文字貼到 trac.ini 的最下方:

[account-manager]
password_file = D:\Repository\project-users.db
password_store = HtPasswdStore

[components]
acct_mgr.admin.accountmanageradminpage = enabled
acct_mgr.api.accountmanager = enabled
acct_mgr.htfile.htpasswdstore = enabled
acct_mgr.web_ui.accountmodule = enabled
acct_mgr.web_ui.loginmodule = enabled
acct_mgr.web_ui.registrationmodule = enabled
trac.web.auth.loginmodule = enabled
iniadmin.iniadmin.iniadminplugin = enabled
webadmin.* = enabled

這樣到時候用 admin 登入專案時,就能夠使用 Admin 功能了 (包含 WebAdmin 、 AccountManager 和 IniAdmin ) 。

補充:如果用 admin 登入後,還是看不到 Admin 功能的話,請重新啟動 Apache 。

註:這時的 logout 功能因為前面 httpd.conf 設定的關係,所以只有重新載入 Trac 的動作而無法真正登出。

總結

再一次提示重點:

  1. 建立 Subversion 檔案庫並且配置 post-commit 。

  2. 建立 Trac 資料庫,並配置權限與相關 plugins 。

以上便是完整的 Trac/Subversion 專案建置方式,每新增一個專案都要做一次。

接下來將會補上簡易的使用說明。

在 Windows 上使用 Trac on Apache - 使用說明篇

在 Windows 上使用 Trac on Apache - 使用說明篇

說明

以下將會簡單介紹 Trac 的使用方式,這裡是以 0.10.3 版為基礎。另外本文僅供初入門的朋友參考,因為我個人也還在學習中。


操作介面

Trac 主要由四個區塊組成:搜尋、使用者工具、功能選單及內容頁。

搜尋

這裡可以搜尋所有記在 Trac 資料庫裡的資訊,像是 Wiki 、 Changesets 或 Tickets 等等。

使用者工具

包含登入登出功能、使用者資訊修改介面及求助文檔。

功能選單

Trac 主要功能的選單, 像是 Wiki 、 Timeline 或 Roadmap 等等。

內容頁

上面的使用者工具或是功能選單如果有相關畫面的話,就會在這裡呈現。

主要功能簡述

Trac 的重點在於記錄專案相關歷程,方便管理者或開發人員追蹤之用。以下將對相關的功能做簡單的描述。

註:我會簡單的以意義而非直譯來翻譯裡面的專有名詞,不過可能會和業界所公認的有所不同;如果大家有比較好的建議,歡迎告知。

Wiki

Wiki (記事) 通常是用來記錄專案的相關說明,像是開發目的、版本演進說明、程式架構與功能等。 Trac 內建的 Wiki 包含很多實用的功能,像是 提供連結到 Milestone 、 Ticket 等相關頁面的語法,也可以自行擴充 Marco 與 Processor 。

Wiki 的詳細說明可參考 http://trac.edgewall.org/wiki/TracWiki

註:在新建每個專案時, Trac 都會自動幫我們建立相關的求助文檔,這也是用 TracWiki 製作的。

Timeline

Timeline (歷程) 會顯示專案所有變動,包含程式碼的修改、 Wiki 更新、新增 Ticket 或 Milestone 等。我們可以在其右上方的控制板上選擇日期範圍或是資訊類型,來顯示符合條件的變動。

另外這裡的內容是不可更改的,因為它們已經是歷史了。

Roadmap

Roadmap (指標) 是 Milestone (里程碑) 的集合體,而 Milestone 也可以是 Ticket (編修項目) 的集合體 (非必要) 。

Roadmap 主要的功能是讓管理者很清楚的掌握專案的進度;當所有 Milestone 完成後,專案即宣告結束。

Browse Source

因為我們安裝的 Trac 是搭配 Subversion ,因此這裡可以直接瀏覽專案 SVN 檔案庫裡的所有資訊。而且這裡也可以簡單比對出版本之間的差異;這個功能可以讓我們在撰寫 ChangeLog 時,直接連結引用。

註: Trac 預設是 UTF-8 編碼,所以 Source 裡面有用到 Big5 編碼的話,在這裡會看到亂碼。解決的方式是在 trac.ini 裡,將 trac 區段的 default_charset 改為 big5 。

View Tickets

依分類列出所有編修項目的報告,這可以方便管理者整理出給客戶的報表 (可匯出 CSV 格式的文字檔) 。 Trac 已預設提供多個實用的報告類型,不過管理者也可以以 SQLite 的 SQL 語法來建立屬於自己的報告類型。

New Ticket

建立一個編修項目,預設有 defect (缺失) 、 enhancement (功能加強) 及 task (工作) 等三種類型。

  • defect:就是一般我們所說的 Bug 。

  • enhancement:原先沒有規劃的功能,或是客戶建議改進的部份。

  • task :專案中預期應該要製作的項目。

這裡的 Full description 可以使用 TracWiki 語法。

而 Ticket 也有以下屬性可供設定:

  • Priority: 優先順序,預設為 major 。

  • Milestone: 里程碑。

  • Component: 所屬元件。

  • Version: 所屬版本。

  • Severity: 嚴重性。

  • Keywords: 關鍵字。

  • Assign to: 指定給某使用者。

  • Cc: 給某使用者一個副本。

另外最下方我們也可以為這個 Ticket 附加相關的檔案。

Search

上方 Search 區塊的進階版,多了 Wiki 、 Changesets 或 Tickets 的勾選項目;這裡同時也是呈現搜尋結果的頁面。

Admin

在安裝 WebAdmin 這個 Plugin 後就會多出來的功能,以下會再深入介紹。

管理項目

在 Admin 功能中,如果有依照前面的步驟安裝了 WebAdmin 、 Account Manager 及 IniAdmin 等 Plugin 的話,就會出現以下選單項目:

  • Accounts
    • Configuration
    • Users
  • General
    • Basic Settings
    • Logging
    • Permissions
    • Plugins
  • Ticket System
    • Components
    • Milestones
    • Priorities
    • Severities
    • Ticket Types
    • Versions
  • trac.ini

一般來說,在這裡調整相關設定後,只需要重新登入即可套用變更的設定。不過其中還是有一些設定需要重新啟動 Apache ,請特別小心。

註:這裡我會略過 trac.ini ,因為大部份需要調整的部份都已經在上面三個大項裡了。

Accounts / Configuration

這裡可以設定要存取的 Apache 帳號密碼檔,即為前一篇裡的 D:\Repository\project-users.db 。

Accounts / Users

這裡會列出 D:\Repository\project-users.db 裡所有使用者的帳號,右邊的控制板可以讓我們新增使用者。

General / Basic Settings

這裡可以設定專案的相關資訊,包含專案名稱、網址及簡述。

General / Logging

這裡可以設定 Trac Log 記錄的地方,可以是檔案或是 Windows 事件裡。這裡的設定變更後,需要重新啟動 Apache 。

General / Permissions

這裡會列出所有使用者的權限,右邊的控制板則可以設定使用者的權限,而且也可以新增一個群組或是把使用者加入一個群組。

General / Plugins

這裡會列出 Trac 已載入的 Plugins ,在 Plugin 的名稱上點一下可看到細部元件的啟用狀況。

另外可以利用檔案上傳的方式來安裝 Plugin ,這樣似乎是僅能讓該專案使用,而且可以移除;如果該 Plugin 是利用第一篇提到的方式安裝的話,似乎就沒辦法移除。(這裡用「似乎」一詞是因為我試過但沒成功,還望各位先進指導。)

Ticket System / Components

Components (元件) 會列出專案中會用到的獨立元件,像是類別庫或 JS 庫等等。每個 component 都可以為它們指定一個 owner (擁有者) ,以供開發協調用。任意點選一個 component 的名稱後即可修改它,這裡的 Description 可以使用 TracWiki 語法。

如果專案裡不需要 Components 的話,可以把預設的 component1 和 component2 移除。

註:在 Ticket System 中的所有子選單中如果把所有項目移除,那麼在 New Ticket 時,其對應的下拉選單就會自動隱藏。 (以下皆適用。)

Ticket System / Milestones

Milestones (里程碑) 會列出專案的所有里程碑,這裡管理者可以建立一個新的 milestone ,並且指定預定的到期日 (Due) 。 和 Components 一樣,任意點選一個 milestone 的名稱後即可修改它,並填寫它真正完成的日期。

Ticket System / Priorities

Priorities (優先順序) 會列出專案中所定義的優先順序,這裡管理者可以建立一個新的 priority ,並且指定它的順序 (Order) 。

Ticket System / Severities

Severities (嚴重性) 會列出專案中所定義的嚴重性,如同 Priorities ,這裡管理者可以建立一個新的 severity ,並且指定它的順序 (Order) 。

Ticket System / Ticket Types

Ticket Types (編修項目類型) 會列出專案中所定義的編修項目類型,如同 Priorities ,這裡管理者可以建立一個新的 ticket type ,並且指定它的順序 (Order) 。

Ticket System / Versions

Versions ( 版本) 會列出專案的所有版本,要注意的是這些版本是管理員自行決定的,而非版本控制系統提供。這裡管理者可以新增一個新版本,並填寫預計發佈日期。任意點選一個 版號後即可修改它,這裡的 Description 可以使用 TracWiki 語法。

參考流程

Trac 並沒有硬性規定它的用法,大家可以依照上面的說明自行決定要如何使用。以下我提供一個簡單的使用流程供大家參考:

  1. 管理者設定相關使用者權限。

  2. 管理者在 Wiki 中撰寫專案目的。

  3. 管理者依序建立 Version 、 Milestone 。

  4. 管理者建立 Task 並指派給開發者。

  5. 開發者進行專案建置,此時開發者可利用 Subversion 提交程式碼。

  6. 由客戶或 PM 提供 defect 或 enhancement 。

  7. 開發者依照 Ticket 的嚴重性或優先順序繼續進行程式修改。

  8. 管理者依照進度調整 Version 及 Milestone ,並視狀況撰寫 Wiki 以供備忘。

  9. 重複步驟 3 到步驟 8 ,直到專案結束。

註:請利用想像力,把這些步驟看成是多人同時執行的狀態。

以上流程歡迎補充。

2007年9月11日星期二

20070801 trac apache 密码 权限

20070801 trac apache 密码 权限

20070801 trac apache 密码 权限
http://www.shengfang.org

搭建svn+apache+trac平台(二)-Trac权限管理

遨游一番Trac之后,真是爱他爱得欲罢不能。在这里我们谈谈Trac的权限配置管理,[由于Trac是用python开发的,而python我一点都不懂,只能站在一个使用者很低的角度谈了o(∩_∩)o,高手们见笑了]


配置完Trac后,默认匿名用户是拥有如下权限的
anonymous BROWSER_VIEW //查看版本库
anonymous CHANGESET_VIEW //查看修改记录
anonymous FILE_VIEW //查看文件内容
anonymous LOG_VIEW //查看日志
anonymous MILESTONE_VIEW //查看里程杯
anonymous REPORT_SQL_VIEW //查看报告查询语句
anonymous REPORT_VIEW //查看报告
anonymous ROADMAP_VIEW //查看路标
anonymous SEARCH_VIEW //显示查找
anonymous TICKET_CREATE //创建任务单
anonymous TICKET_MODIFY //修改任务单
anonymous TICKET_VIEW //显示任务单
anonymous TIMELINE_VIEW //查看时间线
anonymous WIKI_CREATE //创建wiki
anonymous WIKI_MODIFY //修改wiki
anonymous WIKI_VIEW //查看wiki


我们可以使用trac-admin脚本来完成权限配置
【运行下面命令前,最好把Python相关的路径加到环境变量中,方便操作】
例如,我们把匿名用户的权限都干掉
python C:\Python24\Scripts\trac-admin D:/SubversionFiles/Trac/PBassistant permission remove anonymous *
【注: “D:/SubversionFiles/Trac/PBassistant”是你TRAC项目的路径,也可以先python C:\Python24\Scripts\trac-admin D:/SubversionFiles/Trac/PBassistant 启动trac-admin,然后输入permission remove anonymous *】
最后我建议重新给匿名用户加上REPORT_VIEW,TICKET_VIEW,TIMELINE_VIEW三个权限,原因是如果要使用他的RSS,没有这些权限,可能你的RSS客户端接收不到
permission add anonymous REPORT_VIEW
permission add anonymous TICKET_VIEW
permission add anonymous TIMELINE_VIEW


建立管理组admin
permission add admin TRAC_ADMIN //TRAC_ADMIN包含所有Trac的权限
然后把管理者加到admin中,如:
permission add linqingfeng admin


建立开发组developer
permission add developer BROWSER_VIEW
。。。。具体权限由你来定,这里就省略过了,细致的权限说明可以参考Trac上的Wiki.

--------------------------------------------------------------------------------

APACHE htpasswd - 管理用於基本認證的用戶文件


htpasswd建立和更新用於基本認證的存儲用戶名/密碼的文本文件。如果htpasswd不能讀寫此文件,它返回一個出錯代碼,而不做任何修改。


伺服器上的資源可以被限制為僅允許由htpasswd建立的文件中的用戶所訪問。此程式只能管理存儲在文本文件中的用戶名和密碼,但是它可以加密並顯示密碼資料,因此可以為其他數據存儲類型所利用。要使用DBM數據庫,請參見dbmmanage 。


htpasswd使用專為Apache作了修改的MD5演算法或系統函數crypt()加密密碼。htpasswd所管理的文件可以包含兩種類型的密碼;有些用戶的密碼使用MD5加密的,而同一個文件中的其他用戶密碼則使用crypt()加密。


示例


htpasswd /usr/local/etc/apache/.htpasswd-users jsmith


添加或修改用戶jsmith的密碼。密碼將被提示輸入。在Windows平台上,密碼將使用Apache修改過的MD5演算法進行加密;在其它平台上將使用crypt()進行加密。如果指定的文件不存在,htpasswd將只返回一個錯誤代碼,而不做其它任何事。


htpasswd -c /home/doe/public_html/.htpasswd jane


創建一個新文件並在其中添加一條用戶jane的記錄。密碼將被提示輸入。如果文件存在但是不能被讀取或寫入,則不會有任何記錄被修改,同時htpasswd將會顯示一個錯誤資料並返回一個錯誤代碼。


htpasswd -mb /usr/web/.htpasswd-all jones Pwd4Steve


將來自命令行的密碼(Pwd4Steve)使用MD5演算法加密,並將其存入指定的文件。


实际操作:
一、TRAC权限设置
Trac [D:\Svntrac\prj]> permission add anonymous REPORT_VIEW
Trac [D:\Svntrac\prj]> permission add anonymous TICKET_VIEW
Trac [D:\Svntrac\prj]> permission add anonymous TIMELINE_VIEW
Trac [D:\Svntrac\prj]> permission add admin TRAC_ADMIN
Trac [D:\Svntrac\prj]> permission add shengfang admin


二、HTPASSWD 密码生成
D:\SVNADDON\Apache Group\Apache2\bin>htpasswd D:\svntrac\tracpwd shengfang
Automatically using MD5 format.
New password: ******
Re-type new password: ******
Adding password for user shengfang


三、HTTPD.CONF修改
1、HTTP访问目录弹出登录提示:
Alias /svntrac "D:/svntrac"[[BR]]
#验证的目录,也就是说访问这个目录的时候会提示输入用户名和密码
#Allowoverride none
#表示进行身份验证.服务器忽略访问控制文件的设置
#order allow,deny
#allow from all
#信任任何地方的IP
authtype basic
#authtype指定认证类型。在HTTP1.0中,只有一种认证类型:basic。在HTTP1.1中有几种认证类型,如:MD5。
authname "TRAC"
#验证时弹出的窗口上所显示的内容(自己可以定义)
authuserfile D:/svntrac/tracpwd
#密码文件存放的地方
require valid-user
#指定哪些用户或组才能被授权访问。如:


2、TRAC登录


AuthType Basic
AuthName Trac"
AuthUserFile D:/svntrac/tracpwd
Require valid-user


2007年9月10日星期一

Trac on Apache - 使用说明

Trac on Apache - 使用说明

说明

以下将会简单介绍 Trac 的使用方式,这里是以 0.10.3 版为基础。另外本文仅供初入门的朋友参考,因为我个人也还在学习中。

操作介面

Trac 主要由四个区块组成:搜寻、使用者工具、功能选单及内容页。
搜寻

这里可以搜寻所有记在 Trac 资料库里的资讯,像是 Wiki 、 Changesets 或 Tickets 等等。
使用者工具

包含登入登出功能、使用者资讯修改介面及求助文档。
功能选单

Trac 主要功能的选单, 像是 Wiki 、 Timeline 或 Roadmap 等等。
内容页

上面的使用者工具或是功能选单如果有相关画面的话,就会在这里呈现。
主要功能简述

Trac 的重点在於记录专案相关历程,方便管理者或开发人员追踪之用。以下将对相关的功能做简单的描述。

注:我会简单的以意义而非直译来翻译里面的专有名词,不过可能会和业界所公认的有所不同;如果大家有比较好的建议,欢迎告知。
Wiki

Wiki (记事) 通常是用来记录专案的相关说明,像是开发目的、版本演进说明、程式架构与功能等。 Trac 内建的 Wiki 包含很多实用的功能,像是 提供连结到 Milestone 、 Ticket 等相关页面的语法,也可以自行扩充 Marco 与 Processor 。

Wiki 的详细说明可参考 http://trac.edgewall.org/wiki/TracWiki

注:在新建每个专案时, Trac 都会自动帮我们建立相关的求助文档,这也是用 TracWiki 制作的。
Timeline

Timeline (历程) 会显示专案所有变动,包含程式码的修改、 Wiki 更新、新增 Ticket 或 Milestone 等。我们可以在其右上方的控制板上选择日期范围或是资讯类型,来显示符合条件的变动。

另外这里的内容是不可更改的,因为它们已经是历史了。
Roadmap

Roadmap (指标) 是 Milestone (里程碑) 的集合体,而 Milestone 也可以是 Ticket (编修项目) 的集合体 (非必要) 。

Roadmap 主要的功能是让管理者很清楚的掌握专案的进度;当所有 Milestone 完成後,专案即宣告结束。
Browse Source

因为我们安装的 Trac 是搭配 Subversion ,因此这里可以直接浏览专案 SVN 档案库里的所有资讯。而且这里也可以简单比对出版本之间的差异;这个功能可以让我们在撰写 ChangeLog 时,直接连结引用。

注: Trac 预设是 UTF-8 编码,所以 Source 里面有用到 Big5 编码的话,在这里会看到乱码。解决的方式是在 trac.ini 里,将 trac 区段的 default_charset 改为 big5 。
View Tickets

依分类列出所有编修项目的报告,这可以方便管理者整理出给客户的报表 (可汇出 CSV 格式的文字档) 。 Trac 已预设提供多个实用的报告类型,不过管理者也可以以 SQLite 的 SQL 语法来建立属於自己的报告类型。
New Ticket

建立一个编修项目,预设有 defect (缺失) 、 enhancement (功能加强) 及 task (工作) 等三种类型。

*

defect:就是一般我们所说的 Bug 。
*

enhancement:原先没有规划的功能,或是客户建议改进的部份。
* task :专案中预期应该要制作的项目。

这里的 Full description 可以使用 TracWiki 语法。

而 Ticket 也有以下属性可供设定:

*

Priority: 优先顺序,预设为 major 。
*

Milestone: 里程碑。
*

Component: 所属元件。
*

Version: 所属版本。
*

Severity: 严重性。
*

Keywords: 关键字。
*

Assign to: 指定给某使用者。
* Cc: 给某使用者一个副本。

另外最下方我们也可以为这个 Ticket 附加相关的档案。
Search

上方 Search 区块的进阶版,多了 Wiki 、 Changesets 或 Tickets 的勾选项目;这里同时也是呈现搜寻结果的页面。
Admin

在安装 WebAdmin 这个 Plugin 後就会多出来的功能,以下会再深入介绍。
管理项目

在 Admin 功能中,如果有依照前面的步骤安装了 WebAdmin 、 Account Manager 及 IniAdmin 等 Plugin 的话,就会出现以下选单项目:

* Accounts
o Configuration
o Users
* General
o Basic Settings
o Logging
o Permissions
o Plugins
* Ticket System
o Components
o Milestones
o Priorities
o Severities
o Ticket Types
o Versions
* trac.ini

一般来说,在这里调整相关设定後,只需要重新登入即可套用变更的设定。不过其中还是有一些设定需要重新启动 Apache ,请特别小心。

注:这里我会略过 trac.ini ,因为大部份需要调整的部份都已经在上面三个大项里了。
Accounts / Configuration

这里可以设定要存取的 Apache 帐号密码档,即为前一篇里的 D:\Repository\project-users.db 。
Accounts / Users

这里会列出 D:\Repository\project-users.db 里所有使用者的帐号,右边的控制板可以让我们新增使用者。
General / Basic Settings

这里可以设定专案的相关资讯,包含专案名称、网址及简述。
General / Logging

这里可以设定 Trac Log 记录的地方,可以是档案或是 Windows 事件里。这里的设定变更後,需要重新启动 Apache 。
General / Permissions

这里会列出所有使用者的权限,右边的控制板则可以设定使用者的权限,而且也可以新增一个群组或是把使用者加入一个群组。
General / Plugins

这里会列出 Trac 已载入的 Plugins ,在 Plugin 的名称上点一下可看到细部元件的启用状况。

另外可以利用档案上传的方式来安装 Plugin ,这样似乎是仅能让该专案使用,而且可以移除;如果该 Plugin 是利用第一篇提到的方式安装的话,似乎就没办法移除。(这里用「似乎」一词是因为我试过但没成功,还望各位先进指导。)
Ticket System / Components

Components (元件) 会列出专案中会用到的独立元件,像是类别库或 JS 库等等。每个 component 都可以为它们指定一个 owner (拥有者) ,以供开发协调用。任意点选一个 component 的名称後即可修改它,这里的 Description 可以使用 TracWiki 语法。

如果专案里不需要 Components 的话,可以把预设的 component1 和 component2 移除。

注:在 Ticket System 中的所有子选单中如果把所有项目移除,那麽在 New Ticket 时,其对应的下拉选单就会自动隐藏。 (以下皆适用。)
Ticket System / Milestones

Milestones (里程碑) 会列出专案的所有里程碑,这里管理者可以建立一个新的 milestone ,并且指定预定的到期日 (Due) 。 和 Components 一样,任意点选一个 milestone 的名称後即可修改它,并填写它真正完成的日期。
Ticket System / Priorities

Priorities (优先顺序) 会列出专案中所定义的优先顺序,这里管理者可以建立一个新的 priority ,并且指定它的顺序 (Order) 。
Ticket System / Severities

Severities (严重性) 会列出专案中所定义的严重性,如同 Priorities ,这里管理者可以建立一个新的 severity ,并且指定它的顺序 (Order) 。
Ticket System / Ticket Types

Ticket Types (编修项目类型) 会列出专案中所定义的编修项目类型,如同 Priorities ,这里管理者可以建立一个新的 ticket type ,并且指定它的顺序 (Order) 。
Ticket System / Versions

Versions ( 版本) 会列出专案的所有版本,要注意的是这些版本是管理员自行决定的,而非版本控制系统提供。这里管理者可以新增一个新版本,并填写预计发布日期。任意点选一个 版号後即可修改它,这里的 Description 可以使用 TracWiki 语法。
参考流程

Trac 并没有硬性规定它的用法,大家可以依照上面的说明自行决定要如何使用。以下我提供一个简单的使用流程供大家参考:

1.

管理者设定相关使用者权限。
2.

管理者在 Wiki 中撰写专案目的。
3.

管理者依序建立 Version 、 Milestone 。
4.

管理者建立 Task 并指派给开发者。
5.

开发者进行专案建置,此时开发者可利用 Subversion 提交程式码。
6.

由客户或 PM 提供 defect 或 enhancement 。
7.

开发者依照 Ticket 的严重性或优先顺序继续进行程式修改。
8.

管理者依照进度调整 Version 及 Milestone ,并视状况撰写 Wiki 以供备忘。
9.

重复步骤 3 到步骤 8 ,直到专案结束。

注:请利用想像力,把这些步骤看成是多人同时执行的状态。

以上流程欢迎补充。

原文链接:http://blog.roodo.com/jaceju/archives/2772843.html

[浩南艰辛原创]Apache 2.2 + SVN 1.44 + Trac 0.10.4 安装全过程

  早就对从网页上访问SVN垂涎已久,更对bug追踪想入非非好多年~~~
  今天,终于告一个段落了,能够较好的工作和高亮语法显示。如同大多数网上文章所言,安装正确版本的软件,就是成功的一半。
  这里需要以下软件:
  SVN
  svn-1.4.4-setup.exe
  TortoiseSVN-1.4.4.9706-win32-svn-1.4.4.msi
  LanguagePack-1.4.4.9706-win32-zh_CN.exe
  SVNService.exe
  
  Apache
  apache_2.2.4-win32-x86-no_ssl.msi
  
  Trac
  trac-0.10.4.win32.exe
  
  但是这些软件仅仅是冰山一角。。。需要依赖的软件太多了。。。
  
  Python 系列
  python-2.4.msi
  clearsilver-0.9.14.win32-py2.4.exe
  SilverCity-0.9.7.win32-py2.4.exe 语法高亮显示必备!!
  pywin32-210.win32-py2.4.exe
  svn-python-1.4.3.win32-py2.4.exe
  pysqlite-2.3.2.win32-py2.4.exe
  mod_python-3.3.0b.win32-py2.4-Apache2.2.exe
  
  神啊,光看着就很头痛了。为了语法高亮,还要安装:
  enscript-1.6.3-9-bin.zip
  libintl-0.14.4-bin.zip
  libiconv-1.9.2-1-bin.zip
  
  一个极为严重的问题是,SVN使用的APR版本与Apache2.2使用的APR版本不一致,SVN的mod_authz_svn和mod_dav_svn 在apache中加载失败。感谢网络上大牛提供自己编译的两个so动态库文件,详细信息见Subversion 1.3 mod_dav_svn for Apache 2.2。这里就需要相关的如下文件:
  mod_authz_svn.zip
  mod_dav_svn.zip
  libapr.zip
  libhttpd.zip
  
  把这些对应的文件覆盖掉原来的文件即可。
  
  其他的东西基本就遵循网上的了 :)

apache svn+trac 配置

贡丸 @ 2007-02-17 02:33

1. 软件:
a) silvercity: SilverCity-0.9.7.win32-py2.4.exe
b) enscript: enscript-1.6.3-9-bin.exe
c) clearsilver: clearsilver-0.9.14.win32-py2.4.exe
d) pysqlite: pysqlite-2.3.3.win32-py2.4.exe

2. 配置:
a) cmd到Reposity/svn目录,
svnadmin create projectname
创建一个repository. 或者直接用TortoiseSVN之类的东西创建也可以. 然后就可以import代码上去了, 按照先前的配置, 代码位置在: http://localhost/svn/projectname
b) 把上面四个东西先装完, cmd到Reposity/trac目录下,
python trac-admin D:\WebServer\Repository\trac\projectname initenv
创建一个repository, 按如下输入:
Project Name [My Project]> New Project (reposity 名字)
Database connection string [sqlite:db/trac.db]> (回车使用默认值)
Repository type [svn]> (回车, 用的就是这个)
Path to repository [/path/to/repos]> D:\Repository\svn\projectname (svn repository目录, 注意是svn的)
Templates directory [D:\Appserv\python\share\trac\templates]> (回车使用默认值)
c) cmd到$python\Scripts目录,
python trac-admin D:\WebServer\Repository\trac\projectname permission add admin TRAC_ADMIN
把之前的admin设置成管理员.
d) 装了silvercity应该就能显示语法了, 但是很多还是不行, 调用enscript, $projectname$\conf\trac.ini, 找到:
enscript_path = enscript
改成完整路径即可.
e) plugins设置:
打开$projectname$\conf\trac.ini文件, 加入如下内容到最下面:
[account-manager]
password_file = D:\WebServer\Repository\project-users.db
password_store = HtPasswdStore
[components]
acct_mgr.admin.accountmanageradminpage = enabled
acct_mgr.api.accountmanager = enabled
acct_mgr.htfile.htpasswdstore = enabled
acct_mgr.web_ui.accountmodule = enabled
acct_mgr.web_ui.loginmodule = enabled
acct_mgr.web_ui.registrationmodule = enabled
trac.web.auth.loginmodule = enabled
iniadmin.iniadmin.iniadminplugin = enabled
webadmin.* = enabled
这样就能使用admin所有的功能了.

本文参考了这篇文章.

apache svn+trac 配置

贡丸 @ 2007-02-17 02:33

1. 软件:
a) silvercity: SilverCity-0.9.7.win32-py2.4.exe
b) enscript: enscript-1.6.3-9-bin.exe
c) clearsilver: clearsilver-0.9.14.win32-py2.4.exe
d) pysqlite: pysqlite-2.3.3.win32-py2.4.exe

2. 配置:
a) cmd到Reposity/svn目录,
svnadmin create projectname
创建一个repository. 或者直接用TortoiseSVN之类的东西创建也可以. 然后就可以import代码上去了, 按照先前的配置, 代码位置在: http://localhost/svn/projectname
b) 把上面四个东西先装完, cmd到Reposity/trac目录下,
python trac-admin D:\WebServer\Repository\trac\projectname initenv
创建一个repository, 按如下输入:
Project Name [My Project]> New Project (reposity 名字)
Database connection string [sqlite:db/trac.db]> (回车使用默认值)
Repository type [svn]> (回车, 用的就是这个)
Path to repository [/path/to/repos]> D:\Repository\svn\projectname (svn repository目录, 注意是svn的)
Templates directory [D:\Appserv\python\share\trac\templates]> (回车使用默认值)
c) cmd到$python\Scripts目录,
python trac-admin D:\WebServer\Repository\trac\projectname permission add admin TRAC_ADMIN
把之前的admin设置成管理员.
d) 装了silvercity应该就能显示语法了, 但是很多还是不行, 调用enscript, $projectname$\conf\trac.ini, 找到:
enscript_path = enscript
改成完整路径即可.
e) plugins设置:
打开$projectname$\conf\trac.ini文件, 加入如下内容到最下面:
[account-manager]
password_file = D:\WebServer\Repository\project-users.db
password_store = HtPasswdStore
[components]
acct_mgr.admin.accountmanageradminpage = enabled
acct_mgr.api.accountmanager = enabled
acct_mgr.htfile.htpasswdstore = enabled
acct_mgr.web_ui.accountmodule = enabled
acct_mgr.web_ui.loginmodule = enabled
acct_mgr.web_ui.registrationmodule = enabled
trac.web.auth.loginmodule = enabled
iniadmin.iniadmin.iniadminplugin = enabled
webadmin.* = enabled
这样就能使用admin所有的功能了.

本文参考了这篇文章.

无废话Apache+Tomcat配置

(Wed Jun 5 16:01:47 2002) , 转信
//至少看过两三本书上关于apache和tomcat的配置,都是支支吾吾,不得要领
//这篇文章非常实用,照着它的说明不须一个小时,就可以配置和测试好环境
//可以说是 无废话Apache+Tomcat配置,强烈推荐!
eyzz 日期:2000-12-24 11:00:11
网上那帮混蛋整天胡说八道,把你弄得迷迷糊糊,其实这个安装真是很简单,跟我做,
几步搞定:
假设:
apache安装目录为APACHE_HOME
tomcat安装目录为TOMCAT_HOME (要设到环境变量中)
jdk安装目录为JAVA_HOME(要设到环境变量中)
1.安装apache:(假定安装目录为APACHE_HOME,根据你实际安装自行替换)
废话不多说,安装后修改APACHE_HOME/CONF/httpd.conf 以下6个地方:
1) Port 8080 或者80 随你
2) ServerName localhost
3) DocumentRoot "e:/www" (为了发布方便,不如自己建个目录作为文档根)
4) 把原来的改为

5) 添加index.jsp为缺省的主索引文件

DirectoryIndex index.html index.jsp

6) 这是最关键一步,在httpd.conf最后加上
#tomcat支持
include TOMCAT_HOME/conf/mod_jk.conf-auto
只需要这一句就够了,别听那些白痴的话,加上什么tomcat-apache.conf,那没用.
把mod_jk.dll拷贝进APACHE_HOME/module目录
这会先不管apache了,来设置tomcat3.2
步骤:
把tomcat解压缩,将它真正的目录jarakar-tomcat拷贝到你要的目录名TOMCAT_HOME
修改TOMCAT_HOME下的conf目录中的server.xml
1) 如果你不想看TOMCAT启动信息,这么做:
path="logs/tomcat.log"
verbosityLevel = "INFORMATION"
/>
增加一个PATH="logs/tomcat.log" 就可以了
2) 让tomcat改到8081上,一般来说www服务在80或者8080上:


value="org.apache.tomcat.service.http.HttpConnectionHandler"/>


3)增加APJ13协议支持





就放在原来的APJ12连接器后面就可以了
4)配合APACHE修改文档根目录



5)为了用例子测试,还得改一下EXAMPLES的CONTEXT:
docBase="TOMCAT_HOME/webapps/examples" crossContext="false" >

要使用MOD_JK还得改一下同一目录下的WORKERS.PROPERTIES文件:
1) workers.tomcat_home=TOMCAT_HOME
2) workers.java_home=JAVA_HOME
3) ps= 我爱windows 赫赫
现在ok了,开始启动!
别慌,还有启动顺序问题,注意啊,先启动tomcat让它自己修改一下配置,第一次一定
要先tomcat,以后除非修改tomcat的设置,都可以先启动apache了。
ok 来启动tomcat:运行TOMCAT_HOME/bin下面的startup.bat
看到:Startting tomcat. Check logs/tomcat.log for error messages.那就对了
再来检查tomcat的情况
先随便在e:www里面放个index.jsp文件,内容是

JAVA天堂


<%="啊哈!jsp第一次运行!"%>
用浏览器打开http://localhost:8081
如果看到上面的话出现,那么根文档就成功了,再来用例子测试一下,用浏览器打开:
http://localhost:8081/examples/jsp
运行猜数字游戏,如果正确了,说明咱们的examples上下文也关联正确。这就简单了。
剩下就是运行apache了
运行apache,看到这么一行:
Apache/1.3.14 (win32) with mod_jk running...那就对了
再来测试它们的组合,用浏览器打开http://localhost:8080(我假设你用8080端口,如
果是80端口,那就用http://localhost
还是看到那句“啊哈!jsp第一次运行!”
这就说明apache和tomcat连上了!
你可以再用http://localhosy:8080/examples/jsp测试一下例子。
就这么简单,真正的mod_jk搞定了!
---------------------------爱从一个微笑开始,
在热吻中得以延伸, JAVA天堂
却随眼泪逝去......
. [FROM: 61.170.157.128]

JDK1.6 + Tomcat6 + Apache2.2

JDK1.6 + Tomcat6 + Apache2.2

花了我一下午的时间,我相信对你会有用处
紫外线原创
1, j2se jdk1.6
http://java.sun.com/javase/downloads/index.jsp

2, Tomcat 6
http://archive.apache.org/dist/tomcat/tomcat-6/

3, Apache 2.2.4
http://archive.apache.org/dist/httpd/

4, MySql5.0.27
http://dev.mysql.com/downloads/mysql/

5, mysql-connector-java-5.0.5
http://dev.mysql.com/downloads/connector/j/

6,mod_jk-apache-2.2.4.so
http://tomcat.apache.org/download-connectors.cgi

一,JDK
双击jdk-6u1-windows-i586-p.exe安装即可,记住自己的安装路径
添加JAVA环境变量(我的电脑右键->属性->高级->环境变量->系统变量)
JAVA_HOME 设置变量值 C:/jdk安装路径
CLASSPATH 设置变量值 %JAVA_HOME%/bin;%JAVA_HOME%/jre/bin;%JAVA_HOME%/lib;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar
PATH 设置变量值 %JAVA_HOME%;%JAVA_HOME%/bin;

二,TOMCAT
我的是apache-tomcat-6.0.13.exe,不过大同小异
在安装过程中需要选择JDK安装路径,如果JDK安装正确的话TOMCAT会自动找到路径
TOMCAT_HOME 设置变量值 c:/Tomcat6安装路径

三,APACEH
apache_2.2.4-win32-x86-no_ssl.msi,双击安装,记住路径

四,整合
apache2.1版本以上提供了mod_proxy_ajp连接TOMCAT功能,但只可以对目录设置TOMCAT代理。
我使用MOD_JK

mod_jk-apache-2.2.4.so(因版本而名称可能有异)文件copy至Apache的modules目录下
>开始>Apache HTTP Server 2.2.4>Configure Apache Server>Edit the Apache httpd.conf Configuration File

如果运行站点时出错,请尝试修改以下内容

#Options FollowSymLinks
Options Indexes FollowSymLinks
#Options Indexes MultiViews
AllowOverride None
Order deny,allow
#Deny from all
allow from all
Satisfy all

行尾加以下内容

LoadModule jk_module modules/mod_jk-apache-2.2.4.so
#JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /servlet/* ajp13
JkMount /*.jsp ajp13
JkMount /*.do ajp13
# 增加testApp目录,把改目录下所有文件全部交给tomcat处理,
# JkMount /testApp/* ajp13
# 也可以根据需要来设定,比如只把testApp/*.jsp交给tomcat处理
# JkMount /testApp/*.jsp ajp13

五,多站点配置,在第四步下面接着写入

NamevirtualHost *:80


ServerName www.eii.cn
DocumentRoot D:/www/jsp


ServerName music.eii.cn
DocumentRoot D:/www/test

同时在C:\Tomcat 6.0\conf\server.xml 新加站点

www.eii.cn" appBase="D:/www/jsp"
unpackWARs="true" autoDeploy="true">


unpackWARs="true" autoDeploy="true">

Apache HTTP Server 与 Tomcat 的三种连接方式介绍

Apache HTTP Server 与 Tomcat 的三种连接方式介绍

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

将此页作为电子邮件发送

将此页作为电子邮件发送



级别: 初级

刘 冬 (javayou@gmail.com), 开发工程师,  

2007 年 1 月 15 日

整合 Apache Http Server 和 Tomcat 可以提升对静态文件的处理性能、利用 Web 服务器来做负载均衡以及容错、无缝的升级应用程序。本文介绍了三种整合 Apache 和 Tomcat 的方式。

首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接。事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该端口改为 80。

既然 Tomcat 本身已经可以提供这样的服务,我们为什么还要引入 Apache 或者其他的一些专门的 HTTP 服务器呢?原因有下面几个:

1. 提升对静态文件的处理性能

2. 利用 Web 服务器来做负载均衡以及容错

3. 无缝的升级应用程序

这 三点对一个 web 网站来说是非常之重要的,我们希望我们的网站不仅是速度快,而且要稳定,不能因为某个 Tomcat 宕机或者是升级程序导致用户访问不了,而能完成这几个功能的、最好的 HTTP 服务器也就只有 apache 的 http server 了,它跟 tomcat 的结合是最紧密和可靠的。

接下来我们介绍三种方法将 apache 和 tomcat 整合在一起。

JK

这是最常见的方式,你可以在网上找到很多关于配置JK的网页,当然最全的还是其官方所提供的文档。JK 本身有两个版本分别是 1 和 2,目前 1 最新的版本是 1.2.19,而版本 2 早已经废弃了,以后不再有新版本的推出了,所以建议你采用版本 1。

JK 是通过 AJP 协议与 Tomcat 服务器进行通讯的,Tomcat 默认的 AJP Connector 的端口是 8009。JK 本身提供了一个监控以及管理的页面 jkstatus,通过 jkstatus 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置,如下图所示:


图 1:监控以及管理的页面 jkstatus
图 1:监控以及管理的页面 jkstatus

在 这个图中我们可以看到当前JK配了两个连接分别到 8109 和 8209 端口上,目前 s2 这个连接是停止状态,而 s1 这个连接自上次重启后已经处理了 47 万多个请求,流量达到 6.2 个 G,最大的并发数有 13 等等。我们也可以利用 jkstatus 的管理功能来切换 JK 到不同的 Tomcat 上,例如将 s2 启用,并停用 s1,这个在更新应用程序的时候非常有用,而且整个切换过程对用户来说是透明的,也就达到了无缝升级的目的。关于 JK 的配置文章网上已经非常多了,这里我们不再详细的介绍整个配置过程,但我要讲一下配置的思路,只要明白了配置的思路,JK 就是一个非常灵活的组件。

JK 的配置最关键的有三个文件,分别是

httpd.conf
Apache 服务器的配置文件,用来加载 JK 模块以及指定 JK 配置文件信息

workers.properties
到 Tomcat 服务器的连接定义文件

uriworkermap.properties
URI 映射文件,用来指定哪些 URL 由 Tomcat 处理,你也可以直接在 httpd.conf 中配置这些 URI,但是独立这些配置的好处是 JK 模块会定期更新该文件的内容,使得我们修改配置的时候无需重新启动 Apache 服务器。

其中第二、三个配置文件名都可以自定义。下面是一个典型的 httpd.conf 对 JK 的配置


# (httpd.conf)
# 加载 mod_jk 模块
LoadModule jk_module modules/mod_jk.so

#
# Configure mod_jk
#

JkWorkersFile conf/workers.properties
JkMountFile conf/uriworkermap.properties
JkLogFile logs/mod_jk.log
JkLogLevel warn

接下来我们在 Apache 的 conf 目录下新建两个文件分别是 workers.properties、uriworkermap.properties。这两个文件的内容大概如下


#
# workers.properties
#


# list the workers by name

worker.list=DLOG4J, status

# localhost server 1
# ------------------------
worker.s1.port=8109
worker.s1.host=localhost
worker.s1.type=ajp13

# localhost server 2
# ------------------------
worker.s2.port=8209
worker.s2.host=localhost
worker.s2.type=ajp13
worker.s2.stopped=1

worker.DLOG4J.type=lb
worker.retries=3
worker.DLOG4J.balanced_workers=s1, s2
worker.DLOG4J.sticky_session=1

worker.status.type=status

以上的 workers.properties 配置就是我们前面那个屏幕抓图的页面所用的配置。首先我们配置了两个类型为 ajp13 的 worker 分别是 s1 和 s2,它们指向同一台服务器上运行在两个不同端口 8109 和 8209 的 Tomcat 上。接下来我们配置了一个类型为 lb(也就是负载均衡的意思)的 worker,它的名字是 DLOG4J,这是一个逻辑的 worker,它用来管理前面配置的两个物理连接 s1 和 s2。最后还配置了一个类型为 status 的 worker,这是用来监控 JK 本身的模块。有了这三个 worker 还不够,我们还需要告诉 JK,哪些 worker 是可用的,所以就有 worker.list = DLOG4J, status 这行配置。

接下来便是 URI 的映射配置了,我们需要指定哪些链接是由 Tomcat 处理的,哪些是由 Apache 直接处理的,看看下面这个文件你就能明白其中配置的意义


/*=DLOG4J
/jkstatus=status

!/*.gif=DLOG4J
!/*.jpg=DLOG4J
!/*.png=DLOG4J
!/*.css=DLOG4J
!/*.js=DLOG4J
!/*.htm=DLOG4J
!/*.html=DLOG4J

相信你已经明白了一大半了:所有的请求都由 DLOG4J 这个 worker 进行处理,但是有几个例外,/jkstatus 请求由 status 这个 worker 处理。另外这个配置中每一行数据前面的感叹号是什么意思呢?感叹号表示接下来的 URI 不要由 JK 进行处理,也就是 Apache 直接处理所有的图片、css 文件、js 文件以及静态 html 文本文件。

通过对 workers.properties 和 uriworkermap.properties 的配置,可以有各种各样的组合来满足我们前面提出对一个 web 网站的要求。您不妨动手试试!





回页首


http_proxy

这是利用 Apache 自带的 mod_proxy 模块使用代理技术来连接 Tomcat。在配置之前请确保是否使用的是 2.2.x 版本的 Apache 服务器。因为 2.2.x 版本对这个模块进行了重写,大大的增强了其功能和稳定性。

http_proxy 模式是基于 HTTP 协议的代理,因此它要求 Tomcat 必须提供 HTTP 服务,也就是说必须启用 Tomcat 的 HTTP Connector。一个最简单的配置如下


ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / http://localhost:8080/

在这个配置中,我们把所有 http://localhost 的请求代理到 http://localhost:8080/ ,这也就是 Tomcat 的访问地址,除了 images、css、js 几个目录除外。我们同样可以利用 mod_proxy 来做负载均衡,再看看下面这个配置


ProxyPass /images !
ProxyPass /css !
ProxyPass /js !

ProxyPass / balancer://example/

BalancerMember http://server1:8080/
BalancerMember http://server2:8080/
BalancerMember http://server3:8080/


配置比 JK 简单多了,而且它也可以通过一个页面来监控集群运行的状态,并做一些简单的维护设置。


图 2:监控集群运行状态
图 2:监控集群运行状态




回页首


ajp_proxy

ajp_proxy 连接方式其实跟 http_proxy 方式一样,都是由 mod_proxy 所提供的功能。配置也是一样,只需要把 http:// 换成 ajp:// ,同时连接的是 Tomcat 的 AJP Connector 所在的端口。上面例子的配置可以改为:


ProxyPass /images !
ProxyPass /css !
ProxyPass /js !

ProxyPass / balancer://example/

BalancerMember ajp://server1:8080/
BalancerMember ajp://server2:8080/
BalancerMember ajp://server3:8080/


采用 proxy 的连接方式,需要在 Apache 上加载所需的模块,mod_proxy 相关的模块有 mod_proxy.so、mod_proxy_connect.so、mod_proxy_http.so、mod_proxy_ftp.so、 mod_proxy_ajp.so, 其中 mod_proxy_ajp.so 只在 Apache 2.2.x 中才有。如果是采用 http_proxy 方式则需要加载 mod_proxy.so 和 mod_proxy_http.so;如果是 ajp_proxy 则需要加载 mod_proxy.so 和 mod_proxy_ajp.so这两个模块。





回页首


三者比较

相 对于 JK 的连接方式,后两种在配置上是比较简单的,灵活性方面也一点都不逊色。但就稳定性而言就不像 JK 这样久经考验,毕竟 Apache 2.2.3 推出的时间并不长,采用这种连接方式的网站还不多,因此,如果是应用于关键的互联网网站,还是建议采用 JK 的连接方式。



参考资料



关于作者


刘冬,一直使用 J2EE/J2ME 从事移动互联网方面的开发。您可以通过 Java 自由人网站来跟他联系,网址是:http://www.dlog.cn/javayou ,另外他的邮件地址是javayou@gmail.com

Apache+Tomcat中支持“UTF-8”编码的中文地址

Apache+Tomcat中支持“UTF-8”编码的中文地址

  Tomcat默认安装时,是8080端口。这时,要使Tomcat支持“UTF-8”的中文地址,只需要在server.xml文件中,将8080端口的标签设置成URIEncoding="UTF-8":

<Connector port="8080" URIEncoding="UTF-8" />

  当Tomcat用JK与Apache集成时,用works.properties文件来配置Apache和tomcat连接时使用的一些参数。其中包括Apache要使用的Tomcat端口:

worker.list=ajp13
worker
.ajp13.port=8009
# 本机,若上面Tomcat主机不为localhost,作相应修改
worker.ajp13.host=192.168.1.5
# 类型
worker.ajp13.type=ajp13
# 代理数,不用修改
worker.ajp13.lbfactor=1

  文件中“rker.ajp13.port=8009”就是用来设置Apache要连接的Tomcat端口。因此,Apache和Tomcat集成后,要使服务器支持UTF-8的中文地址,应该设置8009端口的标签:

<Connector port="8009" URIEncoding="UTF-8" />

一个生产环境使用的apache module– viewvc权限控制)

一个生产环境使用的apache module– viewvc权限控制)

from: [url]http://www.loveopensource.com/?p=19[/url]

Apache模块开发/用C语言扩展apache(4:一个生产环境使用的apache module– viewvc权限控制)
by linux_prog
下面公布一个目前在我们公司使用的apache module的源代码。
我们公司开发人员很多,使用了SVN和viewvc来进行版本控制和查看,通过web界面,SVN能够根据每个用户的权限来控制能够
浏览某个项目下的代码,但是viewvc只要你在SVN中有用户,你就可以看当前SVN中所有项目的代码。这个风险比较大,因此,我们
开发了一个apache module,用来读取SVN的权限配置文件,把相应的权限集成到VIEWVC中。
源代码:
#include “apr_strings.h”
#include “apr_hash.h”
#include “apr_tables.h”
#include “apr_md5.h” /* for apr_password_validate */
#include “apr_lib.h” /* for apr_isspace */
#include “apr_base64.h” /* for apr_base64_decode et al */
#define APR_WANT_STRFUNC /* for strcasecmp */
#include “apr_want.h”

#include “ap_config.h”
#include “httpd.h”
#include “http_config.h”
#include “http_core.h”
#include “http_log.h”
#include “http_protocol.h”
#include “http_request.h”
#include “ap_provider.h”
#include

#define ENABLED 1
#define DISABLED 0

/* data need by our module */
typedef struct
{
short enabled;
short debug;
char *dir;
// the starting path
char *prefixPath;
// the stop url pattern
char *stopPattern;
// the svn access file
char *accessFile;
} authSVN_rec;

struct access_rec
{
// 0: group
// 1: user
// 2: all
short type;
// the group or user name
char *name;
// 0: don’t have read access
// 1: have read access
short access;
// the next access record
struct access_rec *next;
};
module AP_MODULE_DECLARE_DATA authSVN_module;

// src starts with start
static short start_with(const char *src, const char *start)
{
int i = 0;
if(strlen(src) < strlen(start))
return 0;

i = strlen(start) - 1;

while(i >= 0)
{
if(src[i] != start[i])
return 0;
i–;
}

return 1;
}

// parse the SVN access file
static short parse_access_file(request_rec *r, const char* file,
const authSVN_rec *conf,
apr_hash_t* ugMap,
apr_hash_t* accessMap)
{
ap_configfile_t *f = NULL;
apr_status_t status;
char l[MAX_STRING_LEN], dir[256];
status = ap_pcfg_openfile(&f, r->pool, file);
short flag = 0;

if (status != APR_SUCCESS)
return 0;

while(!(ap_cfg_getline(l, MAX_STRING_LEN, f)))
{
const char *w = NULL;
char *last = NULL;
apr_table_t *apt = NULL;
struct access_rec *arec = NULL, *arecp = NULL;

if ((l[0] == ‘#’) || (!l[0])) {
continue;
}

if(start_with(l, “[groups]”)) {
flag = 1;
continue;
}

if(l[0] == ‘[’) {
flag = 2;
w = apr_strtok(l, “[]:\n”, &last);

if(w && w[0] == ‘/’) {
// the root directory
snprintf(dir, sizeof(dir), “%s”, conf->prefixPath);
dir[strlen(dir) - 1] = ‘\0′;
}
else if(w && w[0] != ‘/’)
{
const char *project = w;
w = apr_strtok(NULL, “[]:\n”, &last);
if(w)
{
snprintf(dir, sizeof(dir), “%s%s%s”, conf->prefixPath, project, w);
// make sure the dir is not end with /
int len = strlen(dir);
if(dir[len - 1] == ‘/’) dir[len - 1] = ‘\0′;
}
else
dir[0] = ‘\0′;
}
else
{
dir[0] = ‘\0′;
}

continue;
}

if(flag == 1) {
// this is the groups and users definition
w = apr_strtok(l, “=, \n”, &last);
if(w == NULL)
// group name not found
continue;

apt = (apr_table_t *)apr_hash_get(ugMap, (const void *)w, APR_HASH_KEY_STRING);
if(apt == NULL) {
apt = apr_table_make(r->pool, 10);
apr_hash_set(ugMap, (const void *)apr_pstrdup(r->pool, w),
APR_HASH_KEY_STRING, (const void *)apt);
}

while((w = apr_strtok(NULL, “=, \n”, &last)) != NULL) {
// this is group name or user name
if(w[0] == ‘@’) {
w++;
if(w) {
apr_table_setn(apt, apr_pstrdup(r->pool, w), “0″);
}
}
else
{
// this is user name
apr_table_setn(apt, apr_pstrdup(r->pool, w), “1″);
}
}

}

if(flag == 2) {
if(dir[0] == ‘\0′) continue;
w = apr_strtok(l, “= \n”, &last);
if(w)
{
arec = (struct access_rec *)apr_pcalloc(r->pool, sizeof(struct access_rec));
arec->access = 0;

if(w[0] == ‘@’) {
w++;
if(w) {
arec->name = apr_pstrdup(r->pool, w);
arec->type = 0;
}
else continue;
}
else if(w[0] == ‘*’)
{
arec->name = apr_pstrdup(r->pool, “*”);
// this is all
arec->type = 2;
}
else
{
arec->name = apr_pstrdup(r->pool, w);
// this is user name
arec->type = 1;
}
}
else continue;

w = apr_strtok(NULL, “= \n”, &last);
if(!w)
{
arec->access = 0;
}
else
{
arec->access = 1;
}

arecp = (struct access_rec *)apr_hash_get(accessMap, (const void *)dir, APR_HASH_KEY_STRING);
if(arecp == NULL) {
arec->next = NULL;
apr_hash_set(accessMap, (const void *)apr_pstrdup(r->pool, dir),
APR_HASH_KEY_STRING, (const void *)arec);
}
else
{
while(arecp->next != NULL) arecp = arecp->next;
arecp->next = arec;
}

}

}

ap_cfg_closefile(f);

return 1;
}
/* init per dir */
static void *create_authSVN_dir_config(apr_pool_t *p, char *d)
{
authSVN_rec *conf = (authSVN_rec *)apr_pcalloc(p, sizeof(*conf));
if(conf == NULL) return NULL;

conf->enabled = DISABLED;
conf->debug = DISABLED;
conf->dir = d;
conf->prefixPath = NULL;
conf->stopPattern = NULL;
conf->accessFile = NULL;

return conf;
}

/* hex to int */
static char hex2int(char c)
{
if( c>=’0′ && c<='9' ) return (c - '0');
return (c - 'A' + 10);
}

/* url decode */
static void url_decode(char *url)
{
char *p = url;
char *p1 = NULL;

while(*p)
{
if(*p == '+') *p = ' ';

/* %AB */
if(*p=='%' && *(p+1) && *(p+2))
{
*p = hex2int(toupper(*(p+1))) * 16 + hex2int(toupper(*(p+ 2)));
strcpy(p + 1, p + 3);
}
/* \xAB */
if(*p=='\\' && *(p+1) && *(p+2) && *(p+3))
{
p1 = p + 1;
if(*p1 && *p1=='x')
{
*p = hex2int(toupper(*(p+2))) * 16 + hex2int(toupper(*(p+3)));
strcpy(p+1, p+4);
}
}
p++;
}

return;
}

static void parent_path(char *url)
{
char *p = url + strlen(url) - 1;

while(p != url && *p != '/') { *p = '\0'; p--; }
if(p != url && *p=='/') *p = '\0';

return;
}

// return
// 0: the user don't belong to this group
// 1: the user belong to this group
static short find_user_in_group(const char* user, const char *group, apr_hash_t* ugMap)
{
apr_table_t *apt = (apr_table_t *)apr_hash_get(ugMap,
(const void *)group,
APR_HASH_KEY_STRING);
if(apt == NULL) return 0;
apr_array_header_t *arr;
apr_table_entry_t *elts;
int i;
arr = (apr_array_header_t *)apr_table_elts(apt);
elts = (apr_table_entry_t *)arr->elts;

for(i=0; inelts; i++)
{
if(elts[i].key == NULL || elts[i].val == NULL) continue;

if(elts[i].val[0] == ‘1′ && strcmp(elts[i].key, user) == 0)
{
return 1;
}

if(elts[i].val[0] == ‘0′)
{
if(find_user_in_group(user, elts[i].key, ugMap))
return 1;
}
}

return 0;
}

// return
// 0:don’t have access
// 1:have read access
// 2:access not found
static short find_access(const char* user, const char* url,
apr_hash_t* ugMap, apr_hash_t* accessMap)
{
struct access_rec *arec= (struct access_rec *)apr_hash_get(accessMap,
(const void *)url, APR_HASH_KEY_STRING);

short access = 2;

while(arec != NULL)
{
if(strcmp(arec->name, “*”) == 0)
{
// specified access to all users and groups on this url
access = arec->access;
}

if(arec->type == 1 && strcmp(arec->name, user) == 0)
{
// specified user access on this url
access = arec->access;
}

if(arec->type == 0)
{
// this is group access
if(find_user_in_group(user, arec->name, ugMap))
access = arec->access;
}

// if this user have access, we return
if(access == 1) return access;

arec = arec->next;
}

return access;
}
static short estimate_access( request_rec *r, const authSVN_rec* conf,
char* url, apr_hash_t* ugMap,
apr_hash_t* accessMap )
{
const char* user = r->user;
// unauthorized
if(!user || !user[0]) return 0;

short access = find_access(user, url, ugMap, accessMap);
if(access < 2) return access;

if(url[0] == '/' && url[1] == '\0') return 0;

parent_path(url);

return estimate_access(r, conf, url, ugMap, accessMap);
}

// do regexp matching
static short regexp_match(char *str, char *pattern)
{
regex_t reg;
regmatch_t pm[1];
const size_t nmatch = 1;
int res = 0;
short r = 0;
char ebuf[MAX_STRING_LEN];

res = regcomp(®, pattern, REG_EXTENDED);

if(res != 0)
{
regfree(®);
return 0;
}

res = regexec(®, str, nmatch, pm, 0);

if(res == REG_NOMATCH)
r = 0;
else
r = 1;

regfree(®);

return r;
}

/* all pages need to pass from this handler */
static int authSVN_handler(request_rec *r)
{
authSVN_rec *conf = ap_get_module_config(r->per_dir_config,
&authSVN_module);
if(!conf || !conf->enabled)
return DECLINED;

if(conf->prefixPath == NULL || !start_with(r->uri, conf->prefixPath))
return DECLINED;

if(conf->stopPattern !=NULL && regexp_match(r->uri, conf->stopPattern))
return DECLINED;

apr_hash_t* ugMap = apr_hash_make(r->pool);
apr_hash_t* accessMap = apr_hash_make(r->pool);

if(!parse_access_file(r, conf->accessFile, conf, ugMap, accessMap))
return 403;

if(conf->debug)
{
// run in debug mode
// print all users/groups and access information
apr_hash_index_t* hi;
char *key;
apr_table_t *val;
struct access_rec *arec;
apr_array_header_t *arr;
apr_table_entry_t *elts;
int i;

r->content_type=”text/plain”;
ap_rprintf(r, “Parsed Users and Groups:\n”);

hi = apr_hash_first(r->pool, ugMap);
while(hi != NULL)
{
apr_hash_this(hi, (void *)&key, NULL, (void *)&val);

ap_rprintf(r, “%s: “, key);
arr = (apr_array_header_t *)apr_table_elts(val);
elts = (apr_table_entry_t *)arr->elts;
for(i=0; inelts; i++)
{
if(elts[i].key == NULL || elts[i].val == NULL) continue;
if(elts[i].val[0] == ‘0′)
{
ap_rprintf(r, “@”);
}
ap_rprintf(r, “%s “, elts[i].key);
}

ap_rprintf(r, “\n”);

hi = apr_hash_next(hi);
}

ap_rprintf(r, “Parsed Path Access:\n”);
hi = apr_hash_first(r->pool, accessMap);
while(hi != NULL)
{
apr_hash_this(hi, (void *)&key, NULL, (void *)&arec);
ap_rprintf(r, “%s:\n”, key);
while(arec != NULL)
{
if(arec->type == 0)
ap_rprintf(r, “group:%s “, arec->name);
else if(arec->type == 1)
ap_rprintf(r, “user:%s “, arec->name);
else
ap_rprintf(r, “all “);

ap_rprintf(r, “access:%d “, arec->access);
ap_rprintf(r, “\n”);
arec = arec->next;
}

ap_rprintf(r, “\n”);
hi = apr_hash_next(hi);
}
}

char *url = apr_pstrdup(r->pool, r->uri);
// decode the url for some chinese characters
url_decode(url);

// analyze the access
if(estimate_access(r, conf, url, ugMap, accessMap))
{
if(conf->debug)
{
ap_rprintf(r, “%s have access on:%s\n”, r->user, r->uri);
return OK;
}
return DECLINED;
}
else
{
if(conf->debug)
{
ap_rprintf(r, “%s don’t have access on:%s\n”, r->user, r->uri);
return OK;
}
}

return 403;
}

/* enable this module or not */
static const char *set_authSVN_enable(cmd_parms *cmd,
void *mconfig,
int arg)
{
authSVN_rec *conf = (authSVN_rec *) mconfig;
conf->enabled = arg;
return NULL;
}

/* debug this module or not */
static const char *set_authSVN_debug( cmd_parms *cmd,
void *mconfig,
int arg)
{
authSVN_rec *conf = (authSVN_rec *) mconfig;
conf->debug = arg;
return NULL;
}

/* setting prefix path */
static const char *set_prefix_path(cmd_parms *cmd,
void *mconfig,
const char *name)
{
authSVN_rec *conf = (authSVN_rec *) mconfig;

if(strlen(name) <= 0)
return "AuthSVNPrefixPath can not be null.";

if(name[0] != '/' || name[strlen(name) - 1] != '/')
return "AuthSVNPrefixPath must start and end with '/'.";

conf->prefixPath = apr_pstrdup(cmd->pool, name);

return NULL;
}

/* setting stop url pattern */
static const char *set_stop_pattern(cmd_parms *cmd,
void *mconfig,
const char *name)
{
authSVN_rec *conf = (authSVN_rec *) mconfig;

if(strlen(name) <= 0)
return "AuthSVNStopPattern can not be null.";

conf->stopPattern = apr_pstrdup(cmd->pool, name);

return NULL;
}

/* setting SVN access file */
static const char *set_authSVN_accessFile(cmd_parms *cmd,
void *mconfig,
const char *name)
{
authSVN_rec *conf = (authSVN_rec *) mconfig;
ap_configfile_t *f = NULL;
apr_status_t status;

if(strlen(name) <= 0)
return "SVNAccessFile can not be null.";

status = ap_pcfg_openfile(&f, cmd->pool, name);

if (status != APR_SUCCESS) {
return “Can not open given SVN access file.”;
}
ap_cfg_closefile(f);

conf->accessFile = apr_pstrdup(cmd->pool, name);

return NULL;
}
static const command_rec auth_cmds[] =
{
AP_INIT_FLAG(”EnableAuthSVN”, set_authSVN_enable, NULL, OR_FILEINFO,
“enable authSVN or not.”),
AP_INIT_FLAG(”DebugAuthSVN”, set_authSVN_debug, NULL, OR_FILEINFO,
“debug authSVN or not.”),
AP_INIT_TAKE1(”AuthSVNPrefixPath”, set_prefix_path, NULL, OR_FILEINFO,
“set prefix path.”),
AP_INIT_TAKE1(”AuthSVNStopPattern”, set_stop_pattern, NULL, OR_FILEINFO,
“the url pattern we do not do the access checking.”),
AP_INIT_TAKE1(”SVNAccessFile”, set_authSVN_accessFile, NULL, OR_FILEINFO,
“set SVN access file.”),
{ NULL }
};

static void register_hooks(apr_pool_t *p)
{
ap_hook_handler(authSVN_handler, NULL, NULL, APR_HOOK_FIRST);
}

module AP_MODULE_DECLARE_DATA authSVN_module =
{
STANDARD20_MODULE_STUFF,
create_authSVN_dir_config, /* dir config creater */
NULL, /* dir merger — default is to override */
NULL, /* server config */
NULL, /* merge server config */
auth_cmds, /* command apr_table_t */
register_hooks /* register hooks */
};

安装方法:
install the module:
./bin/apachectl stop
./bin/apxs -c mod_authSVN.c
./bin/apxs -a -i -n authSVN mod_authSVN.la
./bin/apachectl start

add the following to httpd.conf(insite the viewvc location directory):
EnableAuthSVN on
DebugAuthSVN off
SVNAccessFile /usr/local/apache2.2.4/access
AuthSVNPrefixPath /viewvc/
AuthSVNStopPattern ^\/viewvc\/\*docroot\*\/

2007年9月9日星期日

apache+svn+trac项目管理

apache+svn+trac项目管理

Apache+svn+trac安装笔记
2007.8.24

一:安装环境 WIndows 2000/2003/Xp通用

二:安装准备
apache_2.0.59-win32-x86-no_ssl.msi
mod_python-3.3.1.win32-py2.4-Apache2.0.exe
python-2.4.4.msi
pysqlite-2.3.3.win32-py2.4.exe
sqlite-3_3_11.zip 数据库,解开是一个EXE
clearsilver-0.9.14.win32-py2.4.exe
trac-0.10.3.win32.exe
svn-python-1.4.4.win32-py2.4.exe Subversion的python接口
svn-1.4.4-setup.exe

三:安装程序
1)先装python D:\python24
2)apache D:\Program Files\ApacheForSvn\Apache2
3)svn D:\Subversion
4)pysqlite,clearsilver,svn_python,mod_python,trac自动根据python路径默认

四:环境设置
1)安装好svn后
输入C:\>svnadmin create e:\vekeeads
E盘建立了一个vekeeads文件夹,作为SVN源码库。

2)建立trac的环境
C:\>python trac-admin e:\trac initenv
然后要求输入项目名称,我输入vekeeads 回车
接着询问数据库连接类型,我们用的sqlite默认就可以了,直接回车
继续,会询问版本库类型,也是默认svn, 回车
询问源码库位置,这就是刚svn里建立的这个项目的源码库,输入e:\vekeeads 回车
询问模板路径,这个默认, 回车
接着就自动生成一系列的模板
最后显示congratulations!

3)apache发布svn
/httpd/目录下的 mod_dav_svn.so 和 mod_authz_svn.so Copy到 /modules/ 目录下。
/bin/ 目录下的 libdb42.dll、libeay32.dll、以及 ssleay32.dll Copy到 底下的 bin
打开apache的httpd.conf添加以下代码(有的已存在,只有取消注释就可以)

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

设置svn源码库的路径,在httpd.conf中添加代码


DAV svn
# 指向SVN Repository的ROOT
SVNPath E:/vekeeads
AuthType Basic
AuthName "请输入用户名和密码"
AuthUserFile e:/vekeeads/passwdfile #认证文件
Require valid-user

注:passwdfile文件是通过apache\bin\htpasswd 生成的。只创建时带参 -c
htpasswd -b -c e:/vekeeads/passwdfile username password
访问http://localhost/svn/,看到项目包说明成功

4)apache发布trac
设置trac源码库的路径,在httpd.conf中添加以下码:

ScriptAlias /trac D:/Python24/share/trac/cgi-bin/trac.cgi

SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv E:/trac
#TracUriRoot "E:/trac"
PythonOption TracUriRoot /trac

#认证模块

Require valid-user
AuthType Basic
AuthName "Trac"
#这里使用的用户密码文件和APACHE一样了,无需在trac再创建用户了,只需添加权限就可以
AuthUserFile e:/vekeeads/passwdfile

访问http://localhost/trac 显示trac说明成功

Trac0.9b1简体中文版完全安装攻略,带所有配套软件!(Apache+SVN+Trac方式)

Trac0.9b1简体中文版完全安装攻略,带所有配套软件!(Apache+SVN+Trac方式)

由于工作需要,自己尝试安装TRAC系统,安装的过程实在是不敢恭维,太繁琐了,这里把我的安装过程记录下崽,希望对新来的人有所帮助。

辛苦劳动所得,欢迎转载,注明出处就可以了:http://blog.csdn.net/voyager512

完整命令都已经给出,可以直接拷贝到msdos运行

-----------安装Apache-------------
1 安装Apache 2.0.59

目前windows下的subversion只能跟Apache2.0.x配合,不能用于Apache2.2.x,除非你自己编译
安装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 8080。然后重新运行这个安装程序,这次应该不会再有问题了。

现在你可以在你的浏览器中键入 http://loccalhost/,如果呈现了一个已经配置好的网站,那么你的Apache就安装成功了。

警告:
如果你将Apache安装成一个服务,它将以本地system帐户来运行。为Apache创建一个单独的用户来运行它将会更安全一些。
请确保运行Apache的用户有版本库的完全访问权限(右键版本库目录->属性->安全)。要不然,用户将无法提交他们的更改。
就算Apache以本机system来运行,你也要设置它能完全读写版本库目录。
如果没有为Apache配置这个许可,用户将会得到"禁止访问"的错误信息,在Apache的错误日志中表现为错误500。

-----------安装SVN-------------
2. 安装Subversion
下载最新版本的svn-1.4.0-setup.exe
运行Subversion安装程序,
3 安装TortoiseSVN(如果喜欢svn命令方式可以跳过)
TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi
LanguagePack-1.4.0.7501-win32-zh_CN.exe

-----------配置Apache-------------

4. 拷贝Subversion module文件到Apache目录
C:\> copy c:\Progra~1\Subver~1\bin\*.so c:\progra~1\apache~1\apache2\modules
C:\> copy c:\progra~1\subver~1\bin\*.dll c:\progra~1\apache~1\apache2\modules
5. 创建密码文件(w/user 'admin')
C:\> md c:\svn
C:\> c:\progra~1\apache~1\apache2\bin\htpasswd -cm c:\svn\.htaccess admin
题诗输入密码:比如admin888
6. 配置Apache (编辑 httpd.conf)

6.1. 添加Modules
6.1.1. 去掉以下行的注释(将开头的#删除):
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
6.1.2. 最后添加(默认系统已经有的话,可以不修改):
# Subversion
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
6.2. 添加Apache为服务运行(一般已经作为服务了,没有的话运行下面命令)
C:\Progra~1\Apache~1\Apache2\bin\Apache -k install -n "Apache2"
6.3. Add location root for multiple repositories
在配置文件的最后添加下面这些行:
# Subversion

DAV svn
# any /svn/foo URL will map to a repository C:/svn/foo
# I've only got it working using SVNPath!!
SVNParentPath C:/svn
AuthType Basic
AuthName "Subversion repository"
AuthUserFile c:/svn/.htaccess
#AuthzSVNAccessFile D:\svnaccessfile
Require valid-user

6.4. 添加cgi handler,去掉注释:
AddHandler cgi-script .cgi

-----------配置SVN-------------
7 创建Repository版本库
7.1 命令方式(file://):
C:\> svnadmin create c:\svn\repo1
在c:\temp\project创建目录结构
例如:
/project
/vendor
/tags
/trunk
files
/myproject
/branches
/tags
/trunk
files
建立版本库目录
C:\> svn import d:\temp\project file:///d:/svn/repo1 -m "Initial Load"

建立本地版本
C:\> svn checkout file:///d:/svn/repo1 d:\project

7.2 TortoiseSVN方式略过,比较简单

8. 测试安装的Subversion
重起Apache
http://localhost:80/svn/repo1
如果一切正常,你将被提示输入用户名密码,输入正确的用户名密码后你就可以看到版本库中的内容了。

-----------添加用户-------------
9. 通过以下方式往password文件中继续添加用户
C:\> c:\progra~1\apache~1\apache2\bin\htpasswd -m c:\svn\.htaccess user

-----------安装Trac必备软件-------------
注意软件版本
10. 安装Python
下载:python-2.4.3.msi,默认安装
Add C:\Python24 to the path

11. 安装Subversion Python Bindings
svn-python-1.4.0-py2.4.exe

12. 安装PySQLite
pysqlite-2.3.2.win32-py2.4.exe

13. 安装ClearSilver
clearsilver-0.9.14.win32-py2.4.exe
-----------安装Trac-------------
14. 安装Trac
trac-0.10.win32.exe
想安装中文版TRAC就下载0.91b版,
trac-0.9b1.win32.exe
0.91b版的中文包,共创软件联盟有人汉化,下面是地址,支持一下,不过里边的包有点小问题,siteconfig.py文件有问题,如果从网上下载的话,删除了这个文件再覆盖就没有问题了。
http://cosoft.org.cn/forum/forum.php?forum_id=8756

-----------配置CGI script-------------
15. 拷贝trac.cig文件

C:\> copy c:\python24\share\trac\cgi-bin\trac.cgi c:\progra~1\apache~1\apache2\cgi-bin
用ultraedit编辑trac.cgi,确保第一行包含python的正确路径
#!C:\Python24\python.exe

-----------配置Trac DB-------------
trac数据库可以命名成和他配合的版本库的名字,特别是有多个版本库的时候,更有利于区分,这个例子中"trac.db"可以被认为就是"repo1.db"

16. 运行trac-admin

C:\python24\Scripts> python trac-admin c:/svn/trac.db
如果提示‘python不是内部或外部命令‘,是因为没有设置环境路径,可以运行下面的命令

C:\python24> python scripts/trac-admin c:/svn/trac.db

17. 初始化DB

Trac [c:/svn/trac.db]> initenv
输入项目名称:My Project

Database connection string [sqlite:db/trac.db]>
接受默认就可以了

Enter path to repository
c:\svn\repo1(输入真实版本库地址)

Enter path to templates
c:\python24\share\trac\templates(一般是默认)

成功的话最后给出Congratulations!!

18. 继续添加管理权限(下面命令将所有权限付给'admin'用户)

Trac [c:/svn/trac.db]>permission add admin TRAC_ADMIN
Trac [c:/svn/trac.db]>quit

-----------将Trac添加到Apache-------------

19. 编辑httpd.conf:

19.1 第一种Apache访问trac方式(http://localhost/cgi-bin/trac.cgi)
文件最后添加以下代码
# TRAC
Alias /trac "C:/python24/share/trac/htdocs"


SetEnv TRAC_ENV "c:/svn/trac.db"
SetEnv PYTHONPATH "C:/Program Files/Subversion/bin"
# if you are running Apache as a user other than System, the TMP variable
# needs to be set to a place where that user can write scratch files. Make
# sure that this directory is created and writable by that user.
# SetEnv TMP "c:/svn/trac.db/tmp


AuthType Basic
AuthName "Project"
AuthUserFile C:/svn/.htaccess
Require valid-user


Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all

19.2第二中方是:URL友好模式,比如 http://hostname/trac,
用下面代码替换上面相关代码
注意:这个是用的C:/Python24/share/trac/cgi-bin/trac.cgi,确保里边第一行包含python24的正确位置

# TRAC

# Transfer serving up of static content to Apache
Alias /trac/chrome/common "C:/Python24/share/trac/htdocs"

# Alias for the friendly URL
ScriptAlias /trac "C:/Python24/share/trac/cgi-bin/trac.cgi"

SetEnv TRAC_ENV "d:/svn/trac.db"
SetEnv PYTHONPATH "C:/Program Files/Subversion/bin"
# if you are running Apache as a user other than System, the TMP variable
# needs to be set to a place where that user can write scratch files. Make
# sure that this directory is created and writable by that user.
SetEnv TMP "d:/svn/trac.db/tmp



AuthType Basic
AuthName "trac"
AuthUserFile C:/svn/.htaccess
Require valid-user

Note: if you get an error "Authentication information not available." after clicking "login", refer to #2258

19.3 集成域账号模式(略,参照官方文档)

20. 重起Apache.

------------摒住呼吸,测试TRAC------------
http://localhost:80/cgi-bin/trac.cgi
或者
http://localhost:80/trac
我一直是使用8080端口,也正常安装了

------------排错------------
如果出现错误,仔细看Apache的提示吧,会有所提示,我第一次也没有运行成功,提示找不到clearsilver,后来重新运行了一遍clearsilver,就好了
如果是ntfs文件系统的话,注意检查目录权限;
如果启用tmp,建立: D:\svn\trac.db\tmp目录,给权限;
确保trac.cgi第一行得python路径;
其他错误,自己检查C:\Program Files\Apache Group\Apache2\logs\error.log;

------------软件下载------------
打包软件下载地址(包含文中提到的软件):
http://www.bamtri.com/lq/trac/trac09b1allinonecn.rar


参考网站:
http://trac.edgewall.org/
http://www.iusesvn.com/bbs/index.php
http://cosoft.org.cn/projects/cntrac/
http://www.tigris.org/
等等
一并表示感谢!

Subversion: 用 Apache2 作为 Subversion 的服务平台

Subversion: 用 Apache2 作为 Subversion 的服务平台

04 06 月

Posted by dualface as 开发和工作, at 2005-06-04

我以前一直是用 Svnserve 做为 Subversion 服务器。这样简单易行,而且访问速度也不错。

但 Svnserve 做服务器有几个不足之处:
1、权限管理太简单,只能为整个仓库设置访问权限,不能为目录设置访问权限;
2、访问用户的密码以明文形式保存在文本文件里面;
3、只能提供一个仓库,如果要提供多个仓库,就必须启动多个 Svnserve 实例;
4、Svnserve.exe 必须借助第三方工具软件(例如 FireDaemon)才能安装为 Windows 系统服务;
5、必须在防火墙上打开单独的端口,而不能直接通过 HTTP 协议访问。

而换成用 Apache2 作为 Subversion 的服务平台,具有下列好处:
1、可以为每个仓库、目录设置访问权限;
2、密码采用 MD5 或者 Crypt 加密存储,并可以利用其他验证方式;
3、可以同时服务多个 Subversion 仓库;
4、通过 HTTP 协议即可访问仓库,几乎不会受到防火墙影响;
5、可以通过浏览器直接浏览、下载文件;
6、任何支持 WebDAV 的软件都可以操作 Subversion 仓库。

废话不说了,安装步骤如下:

第一步:安装 Apache2
很遗憾,必须使用 Apache2,而不能是 Apache1 或者 IIS。如果你的系统正在使用 IIS 或者 Apache1,那么可以将 Apache2 绑定到其他端口,例如 8080。这只需要修改 httpd.conf 的 Listen 80 为 Listen 8080 (注意去掉该行前面的 # 注释符号) 即可。

第二步:集成 Subversion 到 Apache2 中
修改 httpd.conf,加入下面两行:
LoadModule dav_svn_module d:/svn-1.2.0-win32/bin/mod_dav_svn.so
LoadModule dav_svn_module d:/svn-1.2.0-win32/bin/mod_authz_svn.so

第三步:创建仓库
在命令行窗口运行:
d:/svn-1.2.0-win32/bin/svnadmin create d:/svnrepo
然后继续修改 httpd.conf,加入下面的内容:

DAV svn
SVNPath d:/svnrepo

现在启动 Apache2,通过浏览器访问
http://127.0.0.1:8080/public/
应该就可以看到如下画面了。当然了,如果你的仓库里面什么都没有,就只能看到一个空目录而已。

第四步:权限验证
经过前面三个步骤,我们建立了一个任何人都可以访问并操作的 Subversion 仓库。所以现在就是该为这个仓库加上锁的时候了。

修改 httpd.conf,找到刚刚输入的 ,修改为如下内容:

DAV svn
SVNPath d:/svnrepo

AuthzSVNAccessFile "d:/svn-1.2.0-win32/conf/repo-access-file"

Satisfy Any
Require valid-user

AuthType Basic
AuthName "我的 Subversion 仓库"
AuthUserFile "d:/svn-1.2.0-win32/conf/auth-file"

这里我们指定了两个文件。repo-access-file 文件用于指定仓库的访问策略,auth-file 则保存用户名和密码。

repo-access-file 文件的内容如下:


[/]
dualface = rw
* = r

[/private]
dualface = rw

这个文件里面,[/] 表示要为根目录指定访问策略,而 [/private] 则表示为 /private 目录指定访问策略。
[/] 后面的 dualface = rw 表示名为 dualface 的用户在这个目录及其子目录中具有读写权限(r = 读,w = 写)。* = r 则表示任何用户都具有只读权限。[/private] 后面没有 * = r,因此除了 dualface 以外的任何其他用户都无法访问这个目录。
这里要注意的是,虽然我们为 / 根目录指定的访问策略是允许任何人具有只读权限,但 /private 目录单独的访问策略具有更高的优先级。

接下来,还要创建保存用户名和密码的 auth-file 文件。这个文件不能直接建立,需要使用 Apache2 的 htpasswd 程序来建立。使用格式如下:
htpasswd -cm d:/svn-1.2.0-win32/conf/auth-file dualface

-cm 参数表示创建文件,并添加用户。而 dualface 则是要添加的用户名。执行命令后,htpasswd 会提示输入两次为用户指定的密码。

如果要添加更多用户,将参数 -cm 改为 -m 即可。最后重新启动 Apache2,如果一切顺利,我们的仓库就完全建立好了!