分布式版本控制系統Mercurial(二):web server的架設


關於Mercurial的基本功能請參閱 分布式版本控制系統Mercurial(一):Mercurial基本功能介紹

 

到目前為止,還沒有一個比較成熟的Mercurial Web Server軟件,所以如果需要通過web訪問mercurial的數據倉庫,就需要我們手動一步一步地配置,這個過程較為繁瑣,應該說這是Mercurial與SVN相比,比較大的一個問題,不過相對於一款極為優秀的工具每天都能給自己提供服務來說,麻煩一次並不算什么。

 

注意: 以下描述的安裝過程僅用於Web服務器端。各客戶端只需要簡單安裝tortoisehg with mercirual即可。

 

1. 環境和版本

我使用的Mercurial版本是2.1, 配了tortoisehg2.3.0. 其中, Mercurial使用的python版本是2.6.6.
操作系統是windows server 2008.

2. 安裝過程所需要用到的素材.

a) TortoiseHg 2.3.0 (http://mercurial.selenic.com/downloads/)

b) Mercurial 2.1 Python 2.6 package - x86 Windows
(http://mercurial.selenic.com/downloads/)

c) Python 2.6.6 (http://www.python.org/ftp/python/2.6.6/python-2.6.6.msi)

d) IIS的url rewrite組件(http://www.iis.net/download/URLRewrite) (這個組件只能用於IIS7)

3. 先安裝Python2.6.6, 然后安裝Mercurial的Python package, 然后安裝TortoiseHg, 最后安裝url rewrite組件. 當然, 其實也不見得按照這個順序安裝, 只不過如果你不知道應該按何種順序安裝的話,可以參考我這個安裝順序.

4. 在D盤建一個數據倉庫總目錄, 例如D:\Mercurial, 所有的repositories都將位於這個目錄之下.

5. 在IIS中建立一個application, 命名為hg(當然, 你可以隨便叫什么名字), 使其物理路徑指向d:\Mercurial, 然后編輯其Handler Mappings, 如圖所示:

image

雙擊Handlers Mappings, 右側會出現一個actions列表, 點擊Add Managed Handler, 會彈出一個新建窗口, 按如下圖所示填寫這個新建窗口:image

6. 在D:\Mercurial下新建一個文本文件, 重命名為test.cgi (注意連同擴展名一起修改) , 編輯其內容如下:

print 'Status: 200 OK'

print 'Content-Type: text/html'

print

print '<html><body><h1>It Works!</h1></body></html>'

保存, 然后在IIS中瀏覽test.cgi:

url: http://localhost/hg/test.cgi

界面:

image

如果能看到上述界面, 說明初期配置成功,繼續.

如果提示HTTP 錯誤 404.2 - Not Found

由於 Web 服務器上的“ISAPI 和 CGI 限制”列表設置,無法提供您請求的頁面

打開IIS管理器, 定位到服務器級別, 在其功能列表中找到ISAPI and CGI restrictions, 如圖:

image

雙擊打開, 里面必須存在如下圖所示的行:

image

如果不存在則按點擊右側的”add”, 按下圖填寫:

image

 

如果已存在, 但是被禁用, 將其啟用即可.

完成后重試打開test.cgi, 應該可以看到it works字樣.

7. 在D:\Mercurial目錄下新建一個文本文件, 重命名為hgweb.cgi, 編輯其內容為以下幾句話:

#!/usr/bin/env python

#

# An example hgweb CGI script, edit as necessary

# See also http://mercurial.selenic.com/wiki/PublishingRepositories

# Path to repo or hgweb config to serve (see 'hg help hgweb')

config = "D:/Mercurial/hgweb.config"

# Uncomment and adjust if Mercurial is not installed system-wide:

#import sys; sys.path.insert(0, "/path/to/python/lib")

# Uncomment to send python tracebacks to the browser if an error occurs:

#import cgitb; cgitb.enable()

from mercurial import demandimport; demandimport.enable()

from mercurial.hgweb import hgweb, wsgicgi

application = hgweb(config)

wsgicgi.launch(application)

然后再在D:\Mercurial下新建一個文本文件, 重命名為hgweb.config, 不需要寫入任何內容, 即可嘗試瀏覽http://localhost/hg/hgweb.cgi . 應該能看到如下界面:

image

如果提示unexpected indent, 打開此文件 ,刪除每一行前面的空格即可。

8. 在url中包括一個hgweb.cgi是很不令人喜歡的一件事, 所以本步驟的目的就是消除hgweb.cgi字眼, 如果你覺得沒必要, 可以跳過本步驟不看.

第5步在IIS中建立application的時候, IIS會自動在D:\Mercurial目錄下創建一個web.config文件, 用任意文本編輯器打開此文件, 在System.webServer節下的handlers節下面增加一個rewrite節, 最終的文件內容如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="Python" path="*.cgi" verb="*" modules="CgiModule" scriptProcessor="C:\Python26\python.exe -u &quot;%s&quot;" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
    <rewrite>
      <rules>
        <clear />
        <rule name="hgweb.cgi" enabled="true" patternSyntax="Wildcard">
          <match url="*" />
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
          </conditions>
          <action type="Rewrite" url="hgweb.cgi/{R:1}" />
        </rule>
      </rules>
    </rewrite>
    <security>
      <authorization>
        <remove users="*" roles="" verbs="" />
        <add accessType="Allow" users="*" />
      </authorization>
    </security>
  </system.webServer>
</configuration>

然后打開hgweb.config, 寫入如下內容:

[web]

baseurl = /hg

這時可以嘗試瀏覽http://localhost/hg, 其結果應該和http://localhost/hg/hgweb.cgi完全相同.

9. 測試匿名帳戶
現在在D:\Mercurial下建一個名為test的目錄, 並在這個目錄下執行命令hg init (或tortoisehg的create repository here命令)使得它成為一個hg的倉庫. 然后瀏覽http://localhost/hg, 應該會看到test項目被列舉了出來:

image

這時可以把這個test項目clone到另一個位置, 例如, 在控制台中執行如下命令:

Hg clone http://localhost/hg/test d:\test

就可以把這個測試倉庫clone到D:\test, 在D:\test下新建一個文本文件, 然后add & commit, 最后在D:\test下執行hg push, Mercurial會返回一個錯誤提示: ssl required.

因為此時沒有啟用SSL, 雖然可以Clone, 但是Mercurial是不允許Push的, 有一個簡單的辦法可以暫時禁用SSL檢查, 打開hgweb.config, 在web節下增加push_ssl=false配置, 如下所示:

[web]

baseurl = /hg

push_ssl = false

這時再嘗試push, Mercurial會返回另一個錯誤提示, abort: authorization failed. 因為現在連接的是匿名用戶, 而默認情況下是禁止匿名用戶push的, 所以再在hgweb.config的web節下增加一個配置指令: allow_push = *, 如下所示:

[web]

allow_push = *

baseurl = /hg

push_ssl = false

現在重新嘗試push, 就會成功了.

10. 其實到現在為止, 如果不考慮安全性和權限管理, 應該說Mercurial的web服務端已經可以正式運行了, 但是在實際應用中, 不考慮安全性是不可能的, 所以我們下面來逐步配置安全性和權限相關的設置. 首先是啟用SSL.

打開IIS, 點擊選中最頂級的服務器節點, 它有一個Server certificates選項, 如圖:

image

雙擊, 進入Server certificates選項, 點擊右側Actions列表的Create self-signed certificate, 接下來會彈出一個小窗口, 提示輸入證書的名稱, 隨便起個名字, 例如hgTemp, 確定, 證書即可生成, 如下圖所示:

image

然后, 右擊網站節點, 在右鍵菜單中點擊Edit bindings, 如圖:

image

這里是編輯網站與哪個端口綁定的地方, 默認情況下, 這里應該有一個80端口的綁定, 我們先點擊Add增加一個443端口, 點擊Add后, 填表如下:

image

另外, 最好把原有的80端口刪除, 這樣以后這個網站就不允許使用80端口訪問, 而必要使用更安全的https:// 前綴來訪問了.

也可以在網站這個層級允許80端口, 而只把hg這個虛擬目錄配置為要求SSL.

現在, 編輯hgweb.config, 把push_ssl = false 這句話刪除, 表示網站對push動作要求必須使用SSL.

先到客戶端嘗試執行一下clone命令, 會發現Mercurial返回了一個錯誤提示, 原來Mercurial對我們剛才創建的self-signed certificate是非常不信任的, 它並不承認這個證書, 但是有一個—insecure選項可以用來解決這個問題, 在控制台中執行以下命令:

image

Clone指令能夠成功執行, 但是會返回一個警告, 這個警告很重要, 里面包含一個fingerprint的信息, 把上述警告中的fingerprint copy下來, (即上圖中的77:a4……23:96), 找到當前用戶的根目錄, (C:\Users\user_name), 里面應該有一個mercurial.ini, 用任意文本編輯器打開此ini文件, 參考如下內容修改:

[ui]

username = Marvin Yan <MarvinYan@xxx.com>

[hostfingerprints]

localhost = 77:a4:29:03:bf:27:2b:bf:83:d1:7f:30:79:b7:09:f6:79:cf:23:96

[web]

name =

其中, ui節應該是在安裝Mercurial以后就配置好的, 這是Mercurial用戶名, 最重要的基本配置之一, 格式為: 用戶姓名<郵件地址>.

還有一個web節, name的右側不用寫任何東西, 讓Mercurial自動取工作目錄為名字即可.

除此兩節外, 增加一個hostfingerprints節, 按上述格式寫上你自己的fingerprint.

現在再執行hg指令, 不需要增加—insecure參數, 也不再返回任何警告, 都可以成功執行了.

注意: 修改mercurial.ini是在客戶端執行的,也就是說,每一台客戶端都需要執行本步驟以避免安全警告。

11. 身份驗證.

打開IIS, 點擊虛擬目錄hg, 右側會有相應的Authentication和Authorication rules選項, 如圖:

image

首先雙擊Authentication, 進入Authentication編輯頁面, 默認情況下, Anonymous authentication是被啟用的, 先右擊, 將它禁用, 這樣用戶就不能匿名訪問這個網站了. 然后在Basic Authentication上右擊, 點擊Edit, 進入如下的Edit頁面:

image

在Default domain和Realm上分別填入需要驗證身份的域(計算機名), 這里需要說明的是: 如果這台Mercurial server處於某個域中, 可以填入域名,這樣域中所有的用戶都可以訪問項目, 當然也可以authorication中進一步篩選, 但是后續的不少操作都受域服務器中策略的影響, 所以我個人不建議直接使用域帳戶, 除非你同時也是域服務器的管理員, 那就無所謂了.

不填域名, 而是填上本機的計算機名, 這樣進行身份驗證的用戶實際上就是本機的windwos用戶, 進行各種控制相對來說都是比較自由的. 上圖中, 我直接填上我的計算機名.

最后不要忘了檢查是否已經把Basic authentication的狀態改為enable, 並且其它驗證都disable掉了.

Authorication rules中, 默認是allow all users的, 建議不必修改, 當然也可以改為specific user, 只允許一部分用戶訪問, 不過意義不大. 因為可以在windows的用戶管理中刪除多余的帳戶, 保證只留下有效的帳戶.

如果使用了本機帳戶, 需要注意的是, 一般為本機添加的新用戶都是屬於User組的, 而User組默認對許多文件夾只有讀權限, 而沒有寫權限, 這時在服務端要在Repo的根目錄上給User組寫權限, 否則會拋出如下錯誤:

HTTP Error: 500 (D:\Mercurial\Repos\EERP.Web\.hg/store\00changelog.i:)

[command returned code 255 Fri Mar 02 15:56:42 2012]

12. 自動驗證

每一次連接服務器都要輸入一次用戶名和密碼顯然是太麻煩了,Mercurial也支持自動驗證。打開用戶根目錄下的Mercurial.ini, 增加[auth] 節如下:

[auth]

default.prefix = https://localhost/

default.username = Marvin

default.password = a

其中, default並沒有實質意義, 僅僅為了分組. 可以將default改為任何名字 .

 

至此,整個Web Server和架設就全部完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM