Linux 架設 Git Server 同時支援 ssh 和 http 兩種協定

最近在整理自己過去寫的各種程式碼,真是又多又雜 版本分支多
打算自己建立一台 Git Server 來管理
也打算把近期維護的 VB.NET 的程式碼也一併使用 Git 管理版本
找一了一下的教學,才發現 Virtual Studio 不支援 SSH 僅支援 HTTP 協定

動手弄了台主機就開始搞了,前後花了三個晚上才搞定
SSH 沒搞太久幾乎都是卡在 HTTP 的部份,爬文爬到 Chrome 分頁都快40個了

環境說明:

  • CentOS 7 (1511) x64
  • Apache 2.4.6

我自己的要求:

  1. 該主機也會是開發測試環境
  2. Git 主要自己要使用而已,但要預留將來提供他人使用可能性
  3. SSH 和 HTTP 兩種模式要能維護同一份 Repository
  4. HTTP 需要權限驗證,SSH 不需要輸入帳號密碼
  5. 不使用 WebDAV 協定

實做方式:

新增一個 git 帳號,home 指定為 /home/git
統一透過這個帳號維護所有的 Repository

SSH 的部份比較簡單
透過 git 帳號的 ~/.ssh/authorized_keys 來做授權處理

Apache 不將 User 和 Group 設定為 git,而是預設的 Apache 或多數人慣用的 nobody
然後 suexec 不透過 mod_userdir 實現
而是使用 VirtualHost 透過 SuexecUserGroup 切換為 git 身份

但是套用 suexec 後一直失敗,陸續修改設定不停測試
大部分的時間都是卡在 “End of script output before headers" 這個錯誤訊息
爬了不少文,走了很多冤枉路後,才確定問題出在 suexec 本身…

先來看一下 apache 原本的 suexec

問題就出在 AP_DOC_ROOT 這行,指定的路徑是 “/var/www"
然而我的 git 帳號的 home 設定為 /home/git
多數的 virtualhost 也都是放在 /home 下面,方便進行維護
所以我們需要重新編譯一個 suexec 出來,將其 AP_DOC_ROOT 設定為 /home

先安裝 yum-utils 用來直接下載 SOURCE RPM 檔案

 

安裝 rpm build 相關工具,嘗試 build rpm 檔案並解決檢查相依性

 

發現 distcache-devel 並沒有被安裝,也下載不到 SOURCE RPM,所以上網找了一下

 

繼續重製 httpd 套件,跑一段時間後應該會發生錯誤
不用理會 因為我們的目的是 suexec 檔案

 

到這邊,已經編譯出我們需要的 suexec 檔案,置換掉原本的並設定權限

 

原本的 suexec 是設定 AP_LOG_SYSLOG
現在的 suexec 是設定 AP_LOG_EXEC="/var/log/httpd/suexec.log"
所以我們也要處理一下紀錄檔案的部份

最後重新啟動 httpd 即完成了置換 suexec 的動作

 

Git 官方官方 blog 中的 Smart HTTP Transport 提到的設定方式

由於使用了 suexec 的關係,在 httpd.conf 中設定了上面兩個設定值將不會作用生效
這是因為 suexec 使用比較嚴格的安全性管控,只會傳遞安全名單中的環境變數
所以要運用一點小技巧來實現

在 /home/git 下新增一個 suexec-git-httpd-backend 檔案

檔案內容如下

 

而 Apache 的 httpd.conf 中新增以下設定

重新啟動 httpd,使用 htaccess 對 /home/git/git.htpasswd 檔案新增權限
到此,鸚鵡自己的要求已經完成

 

新增 Git repository: HelloWorld
路徑:/home/git/HelloWorld.git

HTTP URL: http://YOUR_DOMAIN/HelloWorld.git
SSH:git@YOUR_DOMAIN:/home/git/HelloWorld.git

 

相關參考資料: