Apache与SVN的集成.docx
《Apache与SVN的集成.docx》由会员分享,可在线阅读,更多相关《Apache与SVN的集成.docx(9页珍藏版)》请在冰豆网上搜索。
Apache与SVN的集成
Apache与SVN的集成
Apache与SVN的集成
按照网上的资料配置SVN,无法提交代码,错误如下:
svnci-m"test"
svn:
Commitfailed(detailsfollow):
svn:
Can'tcreatedirectory'/home/pub/svn/repos/db/transactions/1-1.txn':
Permissiondenied
解决办法:
sudochmod777/home/pub/svn
sudochmod777/home/pub/svn/repos
sudochmod777/home/pub/svn/repos/db
sudochmod777/home/pub/svn/repos/dav
sudochown-Rapache:
apache/home/pub/svn
同时apache是以Groupapache,Userapache运行的。
...
4、修改Apache的配置文件httpd.conf如下:
在LoadModulecgi_modulemodules/mod_cgi.so这一行(大概是第83行)后边增加如下内容
#ForSVN
LoadModuledav_modulemodules/mod_dav.so
LoadModuledav_fs_modulemodules/mod_dav_fs.so
LoadModuledav_svn_modulemodules/mod_dav_svn.so
LoadModuleauthz_svn_modulemodules/mod_authz_svn.so
或者在模块加载列表找到以下语句:
#LoadModuledav_modulemodules/mod_dav.so和#LoadModule
dav_fs_module
modules/mod_dav_fs.so。
去掉前面的“#”号,启用加载这两个模块。
然后再在模块加载语句最后添加以下两行:
LoadModuledav_svn_modulemodules/mod_dav_svn.so
LoadModuleauthz_svn_modulemodules/mod_authz_svn.so
5、拷贝解压後的SVN目录下bin文件夹(对应本例即为C:
\Subversion
Server\bin)下的mod_authz_svn.so和mod_dav_svn.so这两个文件,到Apache安装目录下的modules文件
(本例即为目录C:
\ApacheSoftwareFoundation\Apache2.2\modules)下。
解压後的SVN目录下bin文件夹(对应本例即为C:
\Subversion
Server\bin)下的libdb44.dll、libeay32.dll、ssleay32.dll到Apache安装目录下的bin文件夹(即目
录(本例即为目录C:
\ApacheSoftwareFoundation\Apache2.2\bin)下。
6、设置环境变量,必不可少的一步:
APR_ICONV_PATH=SVN解压目录\iconv,并增加Path变量SVN解压目录\bin,对应本例,设置如下:
(环境变量的设置方法略)
APR_ICONV_PATH=C:
\SubversionServer\iconv
在Path变量中增加C:
\SubversionServer\bin
7、创建了版本库以后,修改Apache配置文件httpd.conf,根据需要创建服务器。
不带有任何权限控制的SVN服务器:
在文件最后追加如下内容:
#SVN
DAVsvn
SVNListParentPathon#使用SVN版本库列表功能
SVNParentPathD:
\SVN#SVN版本库根目录
较完备的SVN服务器:
(在httpd.conf后追加如下内容)
#SVN
DAVsvn
SVNListParentPathon
SVNParentPathD:
\SVN#SVN版本库根目录
#认证的类型
AuthTypeBasic
#认证的名称,显示于登录提示框
AuthName"Subversionrepositories!
Loginneeded!
"
#Whichpasswordfiletouseforauthentication存储用户登录信息的文件
AuthUserFileD:
\SVN\passwd
#LocationoftheAccessfileforpathsinsideaSubversionrepository!
存储SVN服务器的访问控制策略
AuthzSVNAccessFileD:
\SVN\svnaccessfile.txt
#Foranyoperationsotherthanthese,requireanauthenticateduser.匿名用户只有读权限登录用户有写权限
#在使用AcessFile时如允许匿名访问仍需这样写
Requirevalid-user#OnlyvalidusersareallowedtoaccesstheURL
重启Apche服务器即可,在浏览器输入:
http:
//localhost/svn/验证配置。
注意:
这样的配置目前还不能用ApacheMonitor去启动服务,必须去命令行只Apache安装目录,输入httpd命令才能正常启动~
SVN的使用可以参看我的另外一篇文章:
SVN使用心得!
期待支持Apache2.2.4的Exe版本的SVN的发布。
另外,给大家推荐一个很好的学习和使用SVN的网站:
我用Subversion-Subversion中文论坛。
是我目前见到的国内的学习SVN最好的网站,相信使用SVN碰到的大部分问题在其中都可以找到合适的解决方法的。
尤其推荐:
TortoiseSVN中文帮助手册,里边有非常详细的SVN的安装配置以及使用说明。
subversion+apache配置
2上面的配置使用了passwd文件将你所有的版本库作为一个单元来限定访问权限。
如果你想获得更多的控制,如限定某个用户可以访问版本库中
的哪个目录,可以把下面这行的#去掉:
CODE:
#AuthzSVNAccessFileD:
\svnaccessfile
然后用文本编辑器创建一个Subversion授权文件。
Apache将确保只有有效的用户可以访问你的/svn位置,然后将用户名传到
AuthzSVNAccessFile模块,这样可以依据Subversion授权文件得到更精细的权限控制。
注意,路径将被指定为[库:
路径]或者简单的[路径]。
如
果你不明确指定一个库,访问规则将应用到由SVNParentPath指定的目录下所有的版本库中。
一个授权文件例子可能像这样:
CODE:
[groups]
admin=john,kate
devteam1=john,rachel,sally
devteam2=kate,peter,mark
docs=bob,jane,mike
training=zak
#为所有库指定默认访问规则
#所有人可以读,管理员可以写,危险分子没有任何权限
[/]
*=r
@admin=rw
dangerman=
#允许开发人员可以完全访问他们的项目版本库
[proj1:
/]
@devteam1=rw
[proj2:
/]
@devteam2=rw
[bigproj:
/]
@devteam1=rw
@devteam2=rw
trevor=rw
#文档编写人员对所有的docs目录有写权限
[/trunk/doc]
@docs=rw
#培训人员可以完全访问培训版本库
[TrainingRepos:
/]
@training=rw
2.4.使用SSL来保护你的服务器
因为美国出口限制,默认安装的Apache服务器不支持SSL。
但是你自己可以很容易地在其它地方下载到所需要的模块,然后安装它。
首先你需要SSL的必需文件。
你可以
或这里找到相应的软件包(或者下载本主题的附件1:
附件:
mod_ssl_etc.rar(2006-10-1615:
30,595.45K)
该附件被下载次数110
)。
然后只要将包解开将其中的mod_ssl.so拷到Apache的modules目录、openssl.exe、libeay32.dll、ssleay32.dll拷到bin目录、
conf/ssl.conf拷到conf目录。
在Apache的conf目录中用文本编辑器打开ssl.conf。
将下面这些行用#注释掉:
CODE:
DocumentRoot"c:
/apache/htdocs"
ServerName
:
443
ServerAdmin
you@
ErrorLoglogs/error_log
TransferLoglogs/access_log
修改
CODE:
SSLCertificateFileconf/ssl.crt/server.crt
为
CODE:
SSLCertificateFileconf/ssl/my-server.cert
修改
CODE:
SSLCertificateKeyFileconf/ssl.key/server.key
为
CODE:
SSLCertificateKeyFileconf/ssl/my-server.key
修改
CODE:
SSLMutexfile:
logs/ssl_mutex
为
CODE:
SSLMutexdefault
删除以下两行(如果有,我认为有错,删掉之后apache无法启动):
CODE:
打开Apache配置文件(httpd.conf),去掉这行的注释
CODE:
#LoadModulessl_modulemodules/mod_ssl.so
Openssl需要一个配置文件。
你可以从这里下载一个可工作的版本
http:
//tud.at/programm/f
(或者本主题附件2:
附件:
f.rar(2006-9-1019:
11,1.21K)
该附件被下载次数84
)。
将它保存到bin/f。
下面你要创建一个SSL证书。
你可以打开一个命令行窗口,然后cd到Apache安装目录(比如C:
\programfiles\apachegroup\apache2),敲入
以下命令:
CODE:
bin\opensslreq-configbin\f-new-outmy-server.csr
你将被问及一句口令短语。
请注意,不要使用简单的几个词,而应该输入一整个句子,比如一篇诗词的一部份,越长越好。
同样,你还要输入
你的服务器URL。
然后其它的问题都是可选问答的,不过我建议你也将它们填充。
下一步,敲入以下命令:
CODE:
bin\opensslrsa-inprivkey.pem-outmy-server.key
以及(注意,只有一行)
CODE:
bin\opensslx509-inmy-server.csr-outmy-server.cert-req-signkeymy-server.key-days4000
这样将创建一个4000天后才过期的证书。
最后敲入:
CODE:
bin\opensslx509-inmy-server.cert-outmy-server.der.crt-outformDER
这些命令在Apache目录下创建了一些文件(my-server.der.crt,my-server.csr,my-server.key,.rnd,privkey.pem,my-server.cert)。
将这些文件拷贝到目录conf/ssl
(比如C:
\programfiles\apachegroup\apache2\conf\ssl),如果目录ssl不存在,你必须先创建一个。
重启Apache服务。
现在可以用类似这样的url来访问你的版本库了
https:
//servername/svn/project
QUOTE:
强制通过SSL来访问
当你配置了SSL来提高版本库安全时,你可能想禁用无SSL的http访问方式,而只允许通过https访问。
要达到这种效果,你要在块加
入另外一个指示器SSLRequireSSL。
一个示例块可能像这样:
DAVsvn
SVNParentPathD:
\SVN
SSLRequireSSL
AuthTypeBasic
AuthName"Subversionrepositories"
AuthUserFilepasswd
#AuthzSVNAccessFilesvnaccessfile
Requirevalid-user
以上介绍的配置为Apache多库方式,即一个location可以同时为多个版本库服务,
假设你的ip为192.168.0.1,在D:
\SVN目录下建了两个版本库,proj1和proj2
可以分别用下面两个url来访问你的版本库
CODE:
http:
//192.168.0.1/svn/proj1
CODE:
http:
//192.168.0.1/svn/proj1
还有一种配置方式为Apache单库方式,即一个location只能为一个版本库服务,
配置时只要将上面的SVNParentPath改为SVNPath,同时将后面的路径由版本库的父目录改为版本库的目录
如:
CODE:
SVNPathD:
\SVN\proj1
AuthTypeBasic
AuthName"Subversionrepositories"
AuthUserFileD:
\passwd
#AuthzSVNAccessFileD:
\svnaccessfile
Requirevalid-user
postedon2007-02-2611:
49
用mod_authz_svn进行目录访问控制
首先需要让Apache将mod_authz_svn模块加载进来。
在Subversion的安装目录中找到mod_auth_svn模块,将其拷贝到Apache安装目录的modules子目录下。
修改httpd.conf文件,找到
LoadModuledav_svn_modulemodules/mod_dav_svn.so
在其后面加上
LoadModuleauthz_svn_modulemodules/mod_authz_svn.so
现在可以在Location标签中使用authz的功能了。
一个基本的authz配置如下:
DAVsvn
SVNPath/etc/svn/repos
AuthTypeBasic
AuthName"svnrepos"
AuthUserFile/etc/svn/passwd
AuthzSVNAccessFile/etc/svn/accesspolicy
SatisfyAny
Requirevalid-user
AuthzSVNAccessFile指向的是authz的策略文件,详细的权限控制可以在这个策略文件中指定,如:
#两个分组:
committers,developers
[groups]
committers=paulexrichard
developers=jimmymichelsparksean\
steventonyrobert
#在根目录下指定所有的用户有读权限
[/]
*=r
#追加committers组用户有读写权限
@committers=rw
#在branches/dev目录下指定developers组的用户有读写权限
[/branches/dev]
@developers=rw
#在/tags组下给予用户tony读写权限
[/tags]
tony=rw
#禁止所有用户访问/private目录
[/private]
*=
#给committers组用户读权限
@committers=r
使用SVNParentPath代替SVNPath来指定多个版本库的父目录时,其中所有的版本库都将按照这个策略文件配置。
例如上例中tony将对所有版本库里的/tags目录具有读写权限。
如果要对具体每个版本库配置,用如下的语法:
[groups]
project1_committers=paulexrichard
project2_committers=jimmymichelsparksean\
steventonyrobert
[repos1:
/]
*=r
@project1_committer=rw
[repos2:
/]
*=r
@project2_committer=rw
这样项目1的committer组只能对repos1版本库下的文件具有写权限而不能修改版本库repos2,同样项目2的commiter也不能修改repos1版本库的文件。
用MySQL代替文件形式存放密码
到目前为止我们的用户名密码文件还是以文本文件形式存放在文件系统中的,出于安全性的需要或者单点登陆等可扩展性的考虑,文本文件的管理方式都不能
满足需求了。
通过Apache的module_auth_mysql模块,我们可以用MySQL来保存用户信息。
该模块的主页在
,你也可以在
http:
//modules.apache.org/
找到它的发行版本。
安装方法同上述Apache的模块一样,拷贝至modules目录并在httpd.conf文件中添加如下语句:
LoadModulemysql_auth_modulemodules/mod_auth_mysql.so
相应的Location区域改写为:
AuthName"MySQLauth"
AuthTypeBasic
AuthMySQLHostlocalhost
AuthMySQLCryptedPasswordsOff
AuthMySQLUserroot
AuthMySQLDBsvn
AuthMySQLUserTableusers
requirevalid-user
然后在mysql中添加名为svn的数据库,并建立users数据表:
createdatabasesvn;
usesvn;
CREATETABLEusers(
user_nameCHAR(30)NOTNULL,
user_passwdCHAR(20)NOTNULL,
user_groupCHAR(10),
PRIMARYKEY(user_name)
);
在users表中插入用户信息
insertintousersvalues('username','password','group');
重新启动Apache,在访问版本库的时候Apache就会用mysql数据表中的用户信息来验证了。
用SSL实现安全的网络传输
通过Apache
的网络链接,版本库中的代码和数据可以在互联网上传输,为了避免数据的明文传输,实现安全的版本控制,需要对数据的传输进行加密。
Apache
提供了基于SSL的数据传输加密模块mod_ssl,有了它,用户就可以用https协议访问版本库,从而实现数据的加密传输了。
SSL
协议及其实现方式,是一个非常复杂的话题,本文只是介绍Apache提供的最基本的SSL配置方法,更加详细的介绍内容,请参考
http:
//httpd.apache.org/docs-2.0/ssl/
上的文档。
开始配置前,我们需要一个实现Apache中SSL模块的动态程序库,通常名为mod_ssl.so,及其配置文件,通常名为
ssl.conf。
这个实现是跟Apache的版本相关的,不匹配的版本是不能用的;而且,并不是每一个Apache
的版本都自带了相关实现文件,很多情况下,我们需要自己去搜寻相关文件。
另外,我们还需要OpenSSL
软件及其配置文件,来生成加密密钥和数字证书。
这里,我们可以使用一些免费网站,如
上提供的集成版本的Apache。
有了相关的工具和文件,我们就可以开始生成SSL的证书和密钥了。
首先,我们需要找到openssl程序及其配置文件f,运行如下命令来生成128位的RSA私有密钥文件
my-server.key:
opensslgenrsa-des3-outmy-server.key1024
Loading'screen'intorandomstate-done
GeneratingRSAprivatekey,1024bitlongmodulus
.....++++++
........++++++
eis65537(0x10001)
Enterpassphraseforserver.key:
********
Verifying-Enterpassphraseforserver.key:
********
命令运行期间需要