標籤:centos linux nginx apache subversion
1.前言
本篇將介紹如何編譯安裝SVN伺服器端管理軟體subverion和Web伺服器Apache。本來在前面的系列文章已經講過使用Nginx作為Web伺服器的,所以我一直在找有關subverion整合nginx的資料,在此過程中找到了Nginx作者Igor Sysoev在回答別人類似問題的網址,網址是http://mailman.nginx.org/pipermail/nginx/2007-January/000504.html,不過按照Igor Sysoev的回答並沒有成功,因此仍回到Apache與SVN整合,然後再通過Nginx反向 Proxy到Apache的辦法。本來直接安裝subversion即可實現版本控制,但由於這種方式有一些問題,比如密碼是明文儲存到檔案的,因此採用了Apache整合Nginx的方式。
2.準備
本篇主要講述編譯和配置subversion和Apache(即httpd),但由於編譯這兩個軟體依賴於別的類庫,於是總共需要下面7個檔案才能完成subverion1.9.5和httpd2.4.25的編譯安裝,即apr、apr-util、scons、serf、sqlite-amalgamation、httpd和subversion。
我們以root的身份登入系統,將其通過wget下載到/root目錄下。
subversion-1.9.5:wget http://mirrors.hust.edu.cn/apache/subversion/subversion-1.9.5.tar.gz
httpd-2.4.25:wget https://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.25.tar.gz
serf-1.3.9:wget https://www.apache.org/dist/serf/serf-1.3.9.tar.bz2
scons-2.5.1:wget http://prdownloads.sourceforge.net/scons/scons-2.5.1.tar.gz
sqlite-amalgamation-3190300:wget http://www.sqlite.org/2017/sqlite-amalgamation-3190300.zip
apr-1.5.2:wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.5.2.tar.gz
apr-util-1.5.4:wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.5.4.tar.gz
下載完成後的效果:
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M02/99/03/wKiom1lCs7aAGGEYAAEbG_ib1bU197.png-wh_500x0-wm_3-wmp_4-s_4212267782.png" title="SVN01_prepare.png" alt="wKiom1lCs7aAGGEYAAEbG_ib1bU197.png-wh_50" />
3.編譯安裝
3.1預備
考慮到在編譯過程中需要一些依賴庫支援,通過下面的命令來安裝:
yum install zlib zlib-devel openssl openssl-devel –y
另外由於serf需要用scons來編譯,而編譯scons又需要python支援,因此需要安裝python:
yum install python –y
3.2編譯安裝apr
cd /root
tar zxvf /root/apr-1.5.2.tar.gz
cd /root/apr-1.5.2/
./configure --prefix=/usr/local/apr
make && make install
說明:apr-util依賴於apr,因此優先於apr-util編譯。參數中--prefix=/usr/local/apr表示編譯後的安裝目錄為/usr/local/apr。
3.3編譯安裝apr-util
cd /root/
tar zxvf /root/apr-util-1.5.4.tar.gz
cd /root/apr-util-1.5.4/
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
說明:參數中--prefix=/usr/local/apr-util表示編譯後的安裝目錄為/usr/local/apr-util,同時通過--with-apr=/usr/local/apr參數指定了它的依賴項apr的目錄為/usr/local/apr。
3.4編譯安裝scons
cd /root/
tar zxvf ./scons-2.5.1.tar.gz
cd /root/scons-2.5.1/
python setup.py install --prefix=/usr/local/scons
說明:serf必須使用scons來編譯,因此優先於serf編譯。參數中--prefix=/usr/local/apr表示編譯後的安裝目錄為/usr/local/apr。
3.5編譯安裝serf
cd /root/
tar xf ./serf-1.3.9.tar.bz2
cd /root/serf-1.3.9
/usr/local/scons/bin/scons prefix=/usr/local/serf APR=/usr/local/apr APU=/usr/local/apr-util
/usr/local/scons/bin/scons install
說明:參數中- prefix=/usr/local/serf表示編譯後的安裝目錄為/usr/local/serf。
3.6編譯安裝Apache(httpd)
cd /root
tar zxvf /root/httpd-2.4.25.tar.gz
cd /root/httpd-2.4.25
./configure --prefix=/usr/local/httpd-2.4.25 --enable-dav --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-fcgi --enable-dav --enable-dav-fs --enable-maintainer-mode
make && make install
說明:因subverion編譯時間會將產生的mod_dav_svn.so及mod_authz_svn.so拷貝到/usr/local/httpd-2.4.25/modules目錄,並且在/usr/local/httpd-2.4.25/conf/httpd.conf設定為自動載入。參數中--prefix=/usr/local/httpd-2.4.25表示編譯後的安裝目錄為/usr/local/httpd-2.4.25。
3.7安裝subverion
由於編譯subversion需要sqlite支援,所以將下載的sqlite-amalgamation-3190300.zip解壓後將檔案夾重新命名為sqlite-amalgamation並拷貝到/root/subversion-1.9.5/目錄下。
cd /root
tar zxvf ./subversion-1.9.5.tar.gz
unzip /root/sqlite-amalgamation-3190300.zip
mv /root/sqlite-amalgamation-3190300 /root/subversion-1.9.5/sqlite-amalgamation
cd /root/subversion-1.9.5
./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-serf=/usr/local --enable-mod-activation --with-apache-libexecdir=/usr/local/httpd-2.4.25/modules --with-apxs=/usr/local/httpd-2.4.25/bin/apxs --without-berkeley-db
make && make install
支援已經完成了subversion和apache的編譯和安裝,這裡都是通過—prefix參數將編譯後的安裝目錄設定到了/usr/local目錄下。
4.配置
4.1使用者配置
在本執行個體中subversion的進程和Apache的進程將會以svn來運行,因此需要建立svn使用者帳號。
useradd svn -s /sbin/nologin –M
4.2環境變數配置
為便於每次運行命令時需要輸入冗長的路徑資訊(或切換到其所在目錄),在本處將本系列文章截止到目前的應用程式都添加環境變數中,類似Windows中設定path環境變數,在CentOS7中是在/etc/profile中配置,截止目前在檔案末尾添加的內容:
export JAVA_HOME=/usr/local/jdk1.8.0_131
export JRE_HOME=/usr/local/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:/usr/local/apache-tomcat-8.5.15/bin:/usr/local/httpd-2.4.25/bin:/usr/local/svn/bin:/usr/local/php/bin
即將svn、tomcat、php、Java和Apache的可執行檔的路徑都添加到PATH環境變數中,以後執行這些命令時可以直接執行了。
最後,通過source /etc/profile使我們的配置生效。
4.3SVN配置
由於將svn的可執行檔路徑添加到/etc/profile中的PATH變數中了,因此可直接執行svn安裝目錄下的bin子目錄中的檔案;比如查看版本svn --version。但是第一次執行svn --version命令的時候會報錯:
svn: error while loading shared libraries: libserf-1.so.1: cannot open shared object file: No such file or directory
解決辦法就是在/etc/ld.so.conf.d/目錄下手動建立serf-1.3.9.conf檔案,檔案內容是libserf-1.so.1檔案所在的目錄,在本虛擬機器中libserf-1.so.1在/usr/local/lib下,因此serf-1.3.9.conf檔案內容如下:
/usr/local/lib
將檔案儲存並退出後再通過如下命令查看載入情況:
/sbin/ldconfig –v
4.3.1建立svn版本庫
mkdir -p /var/svn
cd /var/svn
svnadmin create phpproject
svnadmin create javaproject
svnadmin create dotnetproject
即建立/var/svn目錄,此目錄為svn的根目錄,並在此目錄下依次建立了phpproject、javaproject和dotnetproject三個版本庫。
因為我們最終是要讓subversion支援多個版本庫,因此關於svn帳號、授權的資訊不能放在某個單獨的庫下,因此我們直接放在/var/svn這個svn的版本庫根目錄下,主要是三個檔案:
authz:用於存放版本庫的授權資訊。
passwd:用於存放帳號和密碼。
svnserve.conf:用於svnserve形式啟動的設定檔。
我們從phpproject版本庫中拷貝出這三個檔案,然後基於它們修改作為多版本庫的控制檔案:
cp /var/svn/phpproject/conf/authz /var/svn/authz
cp /var/svn/phpproject/conf/passwd /var/svn/passwd
cp /var/svn/phpproject/conf/svnserve.conf /var/svn/svnserve.conf
4.3.2建立svn帳號
為安全起見,將使用者密碼作處理後儲存到檔案中,這就需要使用Apache內建的htpasswd工具,它可以產生passwd檔案,其中使用者名稱為明文,使用者密碼為md5雜湊值。
htpasswd -c /var/svn/passwd jerry #once only
htpasswd /var/svn/passwd harry
htpasswd /var/svn/passwd root
htpasswd /var/svn/passwd admin
htpasswd /var/svn/passwd haley
注意:htpasswd位於/usr/local/httpd-2.4.25/bin,即我們編譯安裝Apache時指定的目錄,因為將/usr/local/httpd-2.4.25/bin添加到/etc/profile中了,所以可以直接htpasswd,如果指定的目錄不存在passwd檔案,就需要帶上”-c”參數,表示建立檔案,但是之後就不需要了。如果每次都帶上,反而只有最後一次的執行結果。
最終產生的檔案內容如下:
650) this.width=650;" src="https://s4.51cto.com/wyfs02/M02/99/03/wKioL1lCs86iOIHWAACWYgof_P0413.png-wh_500x0-wm_3-wmp_4-s_1926786505.png" title="SVN05_SVN_password.png" alt="wKioL1lCs86iOIHWAACWYgof_P0413.png-wh_50" />
4.3.3編輯svnserve.conf檔案
可以通過vim /var/svn/svnserve.conf來編輯,最終檔案內容如下:
[general]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
[sasl]
4.3.4編輯配置SVN授權檔案
執行命令vim /var/svn/authz來編輯,最終檔案內容如下:
[aliases]
# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average
[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
developers = jerry,haley
administrators = root,admin
[/]
@administrators=rw
haley = r
jerry = rw
* = r
[javaproject:/]
@administrators = r
@developers = rw
[phpproject:/]
root = rw
haley = rw
jerry = r
[dotnetproject:/]
@administrators = rw
jerry = rw
說明:在上面的檔案中前面帶”@”的是使用者組,例如dotnetproject這個版本庫administrators組有讀寫權限,而jerry這個使用者也有讀寫權限,而其它使用者則沒有許可權。
4.3.5強制開發每次提交代碼必須填寫注釋
預設情況下每次提交代碼時填寫注釋是可選的,但在多人團隊中如果大家每次提交不填寫注釋則容易造成事後不知道提交代碼是為了修複bug還是增加新功能了,因此有必要強制一下,這裡就以要求每次提交時注釋不得少於5個字元為例。
在我們通過svnadmin create版本庫時,每個版本庫下都有個hooks目錄,裡面有不少鉤子的樣本。將已建立的任一項目下的hooks子目錄下的pre-commit.tmpl拷貝一份並命名為pre-commit,根據檔案名稱望文生義就知道這個檔案是在提交代碼到svn版本庫之前執行的鉤子程式。
現在來編輯pre-commit:
vim /var/svn/pre-commit
檔案的最終結果為如下:
REPOS="$1"
TXN="$2"
# Make sure that the log message contains some text.
SVNLOOK=/usr/local/svn/bin/svnlook
#$SVNLOOK log -t "$TXN" "$REPOS" | \
# grep "[a-zA-Z0-9]" > /dev/null || exit 1
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[\w\u4e00-\u9fa5]" | wc -c`
if [ "$LOGMSG" -lt 5 ];
then
echo -e "Comment cann‘t be empty! you must input more than 5 chars as comment!" 1>&2
exit 1
fi
set -e
# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
#commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1
# All checks passed, so allow the commit.
exit 0
然後給pre-commit添加可執行許可權
chmod 755 /var/svn/pre-commit
然後將pre-commit檔案拷貝到其它幾個版本庫的hooks目錄:
cp /var/svn/pre-commit /var/svn/phpproject/hooks
cp /var/svn/pre-commit /var/svn/javaproject/hooks
cp /var/svn/pre-commit /var/svn/dotnetproject/hooks
注意:以後每次建立一個版本庫,都要將這個pre-commit拷貝到它的hooks目錄下。
到這裡我們可以通過命令列來啟動svn伺服器了,命令如下:
svnserve --config-file /var/svn/svnserve.conf -d -r /var/svn
即以/var/svn/svnserve.conf作為設定檔,svn版本庫的根目錄為/var/svn,然後就可以在命令下以svn命令來操作版本庫了。
4.4subverion與apache整合
直接使用svn協議來操作也是可以的,不過目前比較流行的還是subverion與apache整合,然後藉助一個web的svn管理工具,這樣svn管理起來就方便很多了。在這一節就將如何講subverion與apache整合。
因為在當前伺服器上已經安裝nginx作為web server,並且使用了80連接埠,所以只好讓apache使用8000連接埠了。這裡提一下,網上到處是svn與apache整合的介紹,很少有svn與nginx整合的介紹。我找了一些英文資料,發現在nginx網站上也有人在2007年問過這個問題,而nginx的作者、俄羅斯的Igor Sysoev也回答過這個問題,網址是:http://mailman.nginx.org/pipermail/nginx/2007-January/000504.html,按照作者的說法是可能通過配置支援的,但我沒試過,有感興趣的可以試一下。
4.4.1httpd.conf的修改
在apache的設定檔httpd.conf需要修改的地方有:
修改監聽連接埠,由80修改為8000;
更改apache運行時所使用的user和group,均由daemon修改為svn;
include一個關於svn配置的檔案,檔案名稱為httpd-svn.conf,位於/usr/local/httpd-2.4.25/conf/extra/。註:這個檔案預設沒有,是稍後將建立的。
同時,為便於按日跟蹤apache日誌,利用了/usr/local/httpd-2.4.25/bin/目錄下的rotatelogs來切割記錄檔,這樣一來ErrorLog和CustomLog的配置就變為:
ErrorLog "|/usr/local/httpd-2.4.25/bin/rotatelogs /usr/local/httpd-2.4.25/logs/error_log.%Y%m%d 86400 480"
CustomLog "|/usr/local/httpd-2.4.25/bin/rotatelogs /usr/local/httpd-2.4.25/logs/access_log.%Y%m%d 86400 480" common
上述命令中86400表示以天為單位分割,86400是一天的總秒數,而480表示按照東八時區的時間來分割(與UTC相隔8小時,480分鐘)。
同時,由於編譯時間參數的制定,啟用了多個mpm模組,僅保留一個將其餘的注釋掉,否則啟動時會報錯。修改前後的對比如:
650) this.width=650;" src="https://s4.51cto.com/wyfs02/M01/99/03/wKioL1lCs-uwxzTHAABqs1aJidk214.png-wh_500x0-wm_3-wmp_4-s_4231854224.png" title="SVN06_SVN_httpd_config.png" alt="wKioL1lCs-uwxzTHAABqs1aJidk214.png-wh_50" />
中有紅色框的都是修改後的內容,而下方的就是修改前的內容。
4.4.2在Apache中增加svn的相關配置
首先在/usr/local/httpd-2.4.25/conf/extra/目錄建立前文提到的httpd-svn.conf檔案:
vim /usr/local/httpd-2.4.25/conf/extra/httpd-svn.conf
檔案內容如下:
<Location /svn>
DAV svn
#support more repositories
SVNParentPath /var/svn
#list all repositories
#SVNListParentPath on
AuthType Basic
AuthName "Please input Username and Password"
AuthUserFile /var/svn/passwd
AuthzSVNAccessFile /var/svn/authz
Require valid-user
</Location>
在這裡使用的是多版本庫的配置,使用了SVNParentPath設定,並且有關使用者帳號、授權資訊都是指向svn版本庫的根目錄下的檔案。
4.4.3使用權限設定
因為設定了Apache以svn/svn這個user/group來運行,因此需要讓svn帳號有讀寫/var/svn目錄下的許可權,可執行命令:
chown –R svn:svn /var/svn
5.檢驗配置
在https://tortoisesvn.net/downloads.html下載與作業系統對應的TortoiseSVN用戶端,就可以checkin和checkout代碼了。
如是checkout時的介面:
650) this.width=650;" src="https://s3.51cto.com/wyfs02/M00/99/03/wKiom1lCtADijuFDAACJ3bBcjtE475.png-wh_500x0-wm_3-wmp_4-s_1367281996.png" title="SVN02_checkout.png" alt="wKiom1lCtADijuFDAACJ3bBcjtE475.png-wh_50" />
是提交時注釋達不到設定要求時的錯誤介面:
650) this.width=650;" src="https://s1.51cto.com/wyfs02/M00/99/03/wKioL1lCtBPgRUmQAADDibNf2YE230.png-wh_500x0-wm_3-wmp_4-s_1421454993.png" title="SVN03_checkin_error.png" alt="wKioL1lCtBPgRUmQAADDibNf2YE230.png-wh_50" />
是在瀏覽器中開啟svn版本庫的介面:
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M02/99/03/wKioL1lCtCSCmUsJAACmm1EzC6M735.png-wh_500x0-wm_3-wmp_4-s_2552094089.png" title="SVN04_Apache_view.png" alt="wKioL1lCtCSCmUsJAACmm1EzC6M735.png-wh_50" />6.總結
從業十幾年來,本人使用過VSS/TFS/StarTeam/SVN/Git作為原始碼版本控工具,目前來說價格比較低廉甚至免費而又實用方便的就是SVN和Git了。本篇就是講述了如何編譯安裝subversion和httpd(即Apache),並使之整合的。
本文出自 “周公(周金橋)的專欄” 部落格,請務必保留此出處http://zhoufoxcn.blog.51cto.com/792419/1937326
開發人員學Linux(8):CentOS7編譯安裝Subversion1.9.5及Apache2.4.25並整合