Linux下搭建大型SNV平臺
Subversion是什麼?
Subversion是一個自由/開源的版本控制系統。也就是說,在Subversion管理下,文件和目錄可以超越時空。也就是Subversion允許你數據恢復到早期版本,或者是檢查數據修改的歷史。正因爲如此,許多人將版本控制系統當作一種神奇的“時間機器”。
Subversion的版本庫可以通過網絡訪問,從而使用戶可以在不同的電腦上進行操作。從某種程度上來說,允許用戶在各自的空間裏修改和管理同一組數據可以促進團隊協作。因爲修改不再是單線進行,開發速度會更快。此外,由於所有的工作都已版本化,也就不必擔心由於錯誤的更改而影響軟件質量—如果出現不正確的更改,只要撤銷那一次更改操作即可。
某些版本控制系統本身也是軟件配置管理(SCM)系統,這種系統經過精巧的設計,專門用來管理源代碼樹,並且具備許多與軟件開發有關的特性—比如,對編程語言的支持,或者提供程序構建工具。不過Subversion並不是這樣的系統。它是一個通用系統,可以管理任何類型的文件集。對你來說,這些文件這可能是源程序—而對別人,則可能是一個貨物清單或者是數字電影。
Subversion的特性
在講解Subversion爲版本控制領域帶來的特性時,我們會經常通過Subversion對CVS的改進進行說明。如果不熟悉CVS,瞭解所有Subversion的特性會有一定的困難。而如果根本就不熟悉版本控制,你就只有乾瞪眼的份兒了。因此,最好首先閱讀一下第 1 章 基本概念,這一章簡單介紹了一些版本控制的基本思想和概念。
Subversion支持:
版本化的目錄
CVS只能跟蹤單個文件的變更歷史,但是Subversion實現的“虛擬”版本化文件系統則可以跟蹤目錄樹的變更。在Subversion中,文件和目錄都是版本化的。
真實的版本歷史
由於只能跟蹤單個文件的變更,CVS無法支持如文件拷貝和改名這些常見的操作—這些操作改變了目錄的內容。同樣,在CVS中,一個目錄下的文件只要名字相同即擁有相同的歷史,即使這些同名文件在歷史上毫無關係。而在Subversion中,可以對文件或目錄進行增加、拷貝和改名操作,也解決了同名而無關的文件之間的歷史聯繫問題。
原子提交
一系列相關的更改,要麼全部提交到版本庫,要麼一個也不提交。這樣用戶就可以將相關的更改組成一個邏輯整體,防止出現只有部分修改提交到版本庫的情況。
版本化的元數據
每一個文件和目錄都有自己的一組屬性—鍵和它們的值。可以根據需要建立並存儲任何鍵/值對。和文件本身的內容一樣,屬性也在版本控制之下。
可選的網絡層
Subversion在版本庫訪問的實現上具有較高的抽象程度,利於人們實現新的網絡訪問機制。Subversion可以作爲一個擴展模塊嵌入到Apache之中。這種方式在穩定性和交互性方面有很大的優勢,可以直接使用服務器的成熟技術—認證、授權和傳輸壓縮等。此外,Subversion自身也實現了一個輕型的,可獨立運行的服務器軟件。這個服務器使用了一個自定義協議,可以輕鬆的用SSH封裝。
一致的數據操作
Subversion用一個二進制差異算法描述文件的變化,對於文本(可讀)和二進制(不可讀)文件其操作方式是一致的。這兩種類型的文件壓縮存儲在版本庫中,而差異信息則在網絡上雙向傳遞。
高效的分支和標籤操作
在Subversion中,分支與標籤操作的開銷與工程的大小無關。Subversion的分支和標籤操作用只是一種類似於硬鏈接的機制拷貝整個工程。因而這些操作通常只會花費很少且相對固定的時間。
可修改性
Subversion沒有歷史負擔,它以一系列優質的共享C程序庫的方式實現,具有定義良好的API。這使得Subversion非常容易維護,和其它語言的互操作性很強。
Subversion的架構
圖 1 “Subversion的架構”給出了Subversion設計總體上的“俯視圖”。
圖 1. Subversion的架構
圖中的一端是保存所有版本數據的Subversion版本庫,另一端是Subvesion的客戶程序,管理着所有版本數據的本地影射(稱爲“工作拷貝”),在這兩極之間是各種各樣的版本庫訪問(RA)層,某些使用電腦網絡通過網絡服務器訪問版本庫,某些則繞過網絡服務器直接訪問版本庫。
Subversion的組件
安裝好的Subversion由幾個部分組成,下面將簡單的介紹一下這些組件。下文的描述或許過於簡略,不易理解,但不用擔心—本書後面的章節中會用更多的內容來詳細闡述這些組件。
svn
命令行客戶端程序。
svnversion
此工具用來顯示工作拷貝的狀態(用術語來說,就是當前項目的修訂版本)。
svnlook
直接查看Subversion版本庫的工具。
svnadmin
建立、調整和修復Subversion版本庫的工具。
svndumpfilter
過濾Subversion版本庫轉儲數據流的工具。
mod_dav_svn
Apache HTTP服務器的一個插件,使版本庫可以通過網絡訪問。
svnserve
一個單獨運行的服務器程序,可以作爲守護進程或由SSH調用。這是另一種使版本庫可以通過網絡訪問的方式。
svnsync
一個通過網絡增量鏡像版本庫的程序。
如果已經正確完成了Subversion的安裝,我們就可以開始我們的學習之旅了。在後面的兩章中,我們將講解如何使用Subversion的客戶端程序svn。
服務配置
一個Subversion的版本庫可以和客戶端同時運行在同一個機器上,使用file:///訪問,但是一個典型的Subversion設置應該包括一個單獨的服務器,可以被辦公室的所有客戶端訪問—或者有可能是整個世界。
本小節描述了怎樣將一個Subversion的版本庫暴露給遠程客戶端,我們會覆蓋Subversion已存在的服務器機制,討論各種方式的配置和使用。經過閱讀本小節,你可以決定你需要哪種網絡設置,並且明白怎樣在你的主機上進行配置。
概述
Subversion的設計包括一個抽象的網絡層,這意味着版本庫可以通過各種服務器進程訪問,而且客戶端“版本庫訪問”的API允許程序員寫出相關協議的插件,理論上講,Subversion可以使用無限數量的網絡協議實現,目前實踐中只有兩種服務器。
Apache是最流行的web服務器,通過使用mod_dav_svn模塊,Apache可以訪問版本庫,並且可以使客戶端使用HTTP的擴展協議WebDAV/DeltaV進行訪問,因爲Apache是一個非常易於擴展的web服務器,它提供了許多“易於獲取的”特性,例如加密的SSL通訊,日誌和與第三方工具的集成,以及內置的版本庫web瀏覽功能。
在另一個角落是svnserve:一個更小,輕型的服務器程序,同客戶端使用自定義的協議。因爲協議是爲Subversion專門設計的,並且是有狀態的(不像HTTP),它提供了更快的網絡操作—但也有一些代價。它只理解CRAM-MD5的認證,然而它非常易於配置,是開始使用Subversion的小團隊的最佳選擇。
第三個選擇是使用SSH連接包裹的svnserve,儘管這個場景依然使用svnserve,它與傳統的svnserve部署非常不同,SSH在多所有的通訊中使用加密方式,SSH也使用排他的認證,所以在服務器主機(svnserve與之不同,它包含了自己的私有用戶帳號)上必須要有真實的系統帳戶。最後,因爲這些配置需要每個用戶發起一個私有的臨時svnserve進程,這與允許一組本地用戶通過file://協議訪問等同(從訪問許可的視點)。因此路徑爲基礎的訪問控制變得沒有意義,因爲每個用戶都可以直接訪問版本庫。
下面是三種典型服務器部署的總結。
表 6.1.
特性 |
Apache + mod_dav_svn |
svnserve |
svnserve over SSH |
認證選項 |
HTTP(S) basic auth、X.509 certificates、LDAP、NTLM或任何Apache httpd已經具備的方式 |
CRAM-MD5 |
SSH |
用戶帳號選項 |
私有的'users'文件 |
私有的'users'文件 |
系統帳號 |
授權選項 |
可以授予整個版本庫的讀/寫權限,也可以指定目錄的。 |
可以授予整個版本庫的讀/寫權限,也可以指定目錄的。 |
只能對版本庫整體賦予讀/寫權限 |
加密 |
通過可選的 SSL |
無 |
SSH通道的 |
Logging |
對每個HTTP請求記錄完全的Apache日誌,通過選項“高級”記錄普通的客戶端操作。 |
no logging |
no logging |
交互性 |
可以部分的被其他WebDAV客戶端使用 |
只同svn客戶端通訊 |
只同svn客戶端通訊 |
Web瀏覽能力 |
有限的內置支持,或者通過第三方工具,如ViewVC |
只有通過第三方工具,如 ViewVC |
只有通過第三方工具,如 ViewVC |
速度 |
有些慢 |
快一點 |
快一點 |
初始設置 |
有些複雜 |
極爲簡單 |
相當簡單 |
以上介紹摘自Subversion 手冊
http://www.subversion.org.cn/svnbook/1.4/svnbook.html#svn.foreword
本文以下只介紹SVN使用Apache http 服務,將完成多個項目版本庫管理、SSL加密、web界面管理項目、mysql 存放用戶密碼等全套SVN解決方案。
好了,打起精神開始用功學習吧~
一、環境說明
Server : CentOS 5.5 IP: 10.1.254.241
Client : Win2003 IP:10.1.96.9
二、軟件包安裝
1、
[root@subversion-1 ~]# yum -y install mysql mysql-server mysql-devel per-DBI perl-DBD-MySQl mod_auth_mysql php-common Php-cli php http http-devel mod_sslsubversion subversion-devel subversion-perl mod_dav_svn php-mysql
Mod_auth_mysql 把用戶名字和密碼保存到MySQL數據庫,然後直接使用它們進行身份驗證。
Mod_dav_svn Apache通過Apache HTTP服務器用來維護Subversion版本庫配置指示。(詳見:
http://www.subversion.org.cn/svnbook/1.4/svnbook.html#svn.ref.mod_dav_svn)
2、查看subversion是否安裝成功
[root@subversion-1 ~]# svnserve --version
svnserve, version 1.6.11 (r934486)
compiled Jun 8 2011, 16:21:54
三、配置mysql
1、新建一個賬戶
GRANT all privileges ON *.* TO usvn@localhost IDENTIFIED BY 'usvn';
四、配置svn管理程序usvn
下載地址:http://subversion.tigris.org/downloads/subversion-1.6.11.tar.gz
1、 程序環境要求
1) PHP 5 (5.1.2 <= ver < 5.3)
2) apache2
3) mod_dav enable (in Apache httpd.conf - DSO support - "LoadModule dav_module modules/mod_dav.so")
4) mod_dav_fs enable (in Apache httpd.conf - DSO support - "LoadModule dav_fs_module modules/mod_dav_fs.so")
5) mod_rewrite enable (in Apache httpd.conf - DSO support - "LoadModule rewrite_module modules/mod_rewrite.so")
6) proper AllowOverride configuration (see below example - "AllowOverride All")
7) Subversion - below modules are packed in most binary distributions
8) mod_authz_svn enable (in Apache httpd.conf - DSO support - "LoadModule authz_svn_module modules/mod_authz_svn.so")
9) mod_dav_svn enable (in Apache httpd.conf - DSO support - "LoadModule dav_svn_module modules/mod_dav_svn.so")
2、 解壓到/var/www/html/usvn
3、 配置apache,httpd.conf添加以下幾行,並註釋Listen 80。
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
LoadModule ssl_module modules/mod_ssl.so
Alias /usvn /var/www/html/usvn/public/
<Directory "/var/www/html/usvn/public">
Options +SymLinksIfOwnerMatch
AllowOverride all
Order allow,deny
Allow from all
</Directory>
4、 apache啓動後查看https的端口443是否打開,你就可以使用安全的http ssl傳輸數據了
[root@subversion-1 ~]# netstat -antp | grep 443
tcp 0 0 :::443 :::* LISTEN 4239/httpd
不要忘記修改防火牆允許訪問本機的443端口
5、 在瀏覽器上輸入地址:http://10.1.254.241/usvn/
將以上配置添加到httpd.conf末尾,然後重啓。接下來就可以通過usvn管理subversion了。
五、簡單使用usvn
1、登錄後顯示臺下,趕快創建一個項目吧
2、點擊管理---》添加新項目
3、添加項目用戶,點擊管理----用戶-----添加新用戶
4、登錄client安裝TortoiseSVN
下載地址http://tortoisesvn.net/downloads.html,安裝完成後,右鍵選擇checkout
當然,你也可以通過https來瀏覽
還可以登錄到usvn中來瀏覽
具體使用這裏不再詳述。
六、使用編譯安裝httpd,php時遇到的問題及解決方法
1、 要使用usvn就要注意PHP的版本5.1.2 <= ver < 5.3,httpd要把模塊mod_rewrite、mod_dav mod_ssl
2、 Apache相關的軟件包apr apr-util httpd 可以從http://lab.renren.com獲得
Subversion包下載地址 http://subversion.apache.org/download/#pre-releases
3、 以下編譯代碼:
? install apr-1.4.5
./configure
make && make install
? install apr-util
/configure --with-apr=/usr/local/apr
make && make install
? install httpd
./configure --prefix=/usr/local/httpd-2.2.192 \
–-enable-rewrite \
--enable-dav \
--enable-so \
--enable-maintainer-mode \
--enable-ssl \
--with-apr=/usr/local/apr/bin/apr-1-config\ --with-apr-util=/usr/local/apr/bin/apu-1-config &&make && make install
? install subversion
./configure
--prefix=/usr/local/subversion-1.6.11 \
--with-apxs=/usr/local/httpd/bin/apxs \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr && make && make install
? install php
./configure --prefix=/usr/local/php \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-config-file-path=/usr/local/php \
--with-mysql=/usr/local/mysql --with-freetype-dir \
--with-gd --with-jpeg-dir --with-curl --with-png-dir \
--with-zlib --enable-mbstring \
--enable-exif \
--with-openssl && make && make install
? Install mysqli
cd /mysql-ser/ext/mysqi/
/usr/local/php/bin/phpize (產生configure文件)
./configure \
-prefix=/usr/local/mysqli \
-with-php-config=/usr/local/php/bin/php-config \
-with-mysqli=/usr/local/mysql/bin/mysql_config && make && make install
在/usr/local/php/php.ini 添加mysqli.so模塊
extension_dir=”/path/to/mysqli.so/dir” 這個mysqli.so文件的目錄在安裝完成會顯示
extension=mysqli.so
4、錯誤解決方法
? 在編譯mysqli.so的錯誤
vi /usr/local/mysql/include/mysql.h
在第221行
... ...
enum mysql_protocol_type
{
MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
};
/*
There are three types of queries - the ones that have to go to
the master, the ones that go to a slave, and the adminstrative
type which must happen on the pivot connectioin
*/
#添加下面的4行
enum mysql_rpl_type
{
MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN
};
2、如果出現以下錯誤:
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c: In function 'zif_mysqli_stmt_bind_param':
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c:144: error: 'gptr' undeclared (first use in this function)
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c:144: error: (Each undeclared identifier is reported only once
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c:144: error: for each function it appears in.)
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c: In function 'zif_mysqli_stmt_execute':
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c:603: error: 'gptr' undeclared (first use in this function)
make: *** [mysqli_api.lo] 錯誤 1
修改一下這個文件就可以
vi mysqli_api.c
查找所有gptr,有四處分別位於行144、行150、行603、行607,以 char* 替換
? 在進行到usvn第六步時要出現type=innodb錯誤,將報錯的文件type=innodb全替換成engine=innodb,因爲新的mysql版本不在支持type命令。
好了,休息一下。