Apache与SVN的集成
按照网上的资料配置SVN,无法提交代码,错误如下:
svn ci -m "test"
svn: Commit failed (details follow):
svn: Can't create directory '/home/pub/svn/repos/db/transactions/1-1.txn': Permission denied
解决办法:
sudo chmod 777 /home/pub/svn
sudo chmod 777 /home/pub/svn/repos
sudo chmod 777 /home/pub/svn/repos/db
sudo chmod 777 /home/pub/svn/repos/dav
sudo chown -R apache:apache /home/pub/svn
同时apache是以Group apache, User apache运行的。
...
4、修改Apache的配置文件 httpd.conf 如下:
在LoadModule cgi_module modules/mod_cgi.so这一行(大概是第83行)后边增加如下内容
# For SVN
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
或者在模块加载列表找到以下语句:#LoadModule dav_module modules/mod_dav.so和#LoadModule dav_fs_module modules/mod_dav_fs.so。去掉前面的“#”号,启用加载这两个模块。然后再在模块加载语句最后添加以下两行:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_modulemodules/mod_authz_svn.so
5、拷贝解压後的SVN目录下bin文件夹(对应本例即为 C:/Subversion Server/bin)下的mod_authz_svn.so和mod_dav_svn.so这两个文件,到Apache安装目录下的modules文件(本例即为目录 C:/Apache Software Foundation/Apache2.2/modules)下。
解压後的SVN目录下bin文件夹(对应本例即为 C:/Subversion Server/bin)下的libdb44.dll、libeay32.dll、ssleay32.dll到Apache安装目录下的bin文件夹(即目录(本例即为目录 C:/Apache Software Foundation/Apache2.2/bin)下。
6、设置环境变量,必不可少的一步:APR_ICONV_PATH=SVN解压目录/iconv,并增加Path变量SVN解压目录/bin,对应本例,设置如下:(环境变量的设置方法略)
APR_ICONV_PATH=C:/Subversion Server/iconv
在Path变量中增加C:/Subversion Server/bin
7、创建了版本库以后,修改Apache配置文件httpd.conf,根据需要创建服务器。
不带有任何权限控制的SVN服务器:
在文件最后追加如下内容:#SVN
<Location /svn>
DAV svn
SVNListParentPath on #使用SVN版本库列表功能
SVNParentPath D:/SVN #SVN版本库根目录
</Location>
较完备的SVN服务器:(在httpd.conf后追加如下内容)#SVN
<Location /svn/>
DAV svn
SVNListParentPath on
SVNParentPath D:/SVN #SVN版本库根目录
#认证的类型
AuthType Basic
#认证的名称,显示于登录提示框
AuthName "Subversion repositories!Login needed!"
#Which password file to use for authentication 存储用户登录信息的文件
AuthUserFile D:/SVN/passwd
#Location of the Access file for paths inside a Subversion repository!存储SVN服务器的访问控制策略
AuthzSVNAccessFile D:/SVN/svnaccessfile.txt
#For any operations other than these, require an authenticated user.匿名用户只有读权限 登录用户有写权限
#在使用AcessFile时如允许匿名访问仍需这样写
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user #Only valid users are allowed to access the URL
</LimitExcept>
</Location>
重启Apche服务器即可,在浏览器输入:http://localhost/svn/ 验证配置。
注意:这样的配置目前还不能用Apache Monitor去启动服务,必须去命令行只Apache安装目录,输入httpd命令才能正常启动~
SVN的使用可以参看我的另外一篇文章:
SVN 使用心得 !期待支持Apache 2.2.4 的Exe版本的SVN的发布。
另外,给大家推荐一个很好的学习和使用SVN的网站:我用Subversion - Subversion中文论坛。是我目前见到的国内的学习SVN最好的网站,相信使用SVN碰到的大部分问题在其中都可以找到合适的解决方法的。尤其推荐:TortoiseSVN中文帮助手册 ,里边有非常详细的SVN的安装配置以及使用说明。
http://www.blogjava.net/xfcy2003/archive/2007/02/26/100715.html
2上面的配置使用了passwd文件将你所有的版本库作为一个单元来限定访问权限。如果你想获得更多的控制,如限定某个用户可以访问版本库中
的哪个目录,可以把下面这行的#去掉:
CODE:
#AuthzSVNAccessFile D:/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的必需文件。你可以http://hunter.campbus.com/ 或这里找到相应的软件包(或者下载本主题的附件1:
附件: mod_ssl_etc.rar (2006-10-16 15:30, 595.45 K)
该附件被下载次数 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 www.example.com:443
ServerAdmin you@example.com
ErrorLog logs/error_log
TransferLog logs/access_log
修改
CODE:
SSLCertificateFile conf/ssl.crt/server.crt
为
CODE:
SSLCertificateFile conf/ssl/my-server.cert
修改
CODE:
SSLCertificateKeyFile conf/ssl.key/server.key
为
CODE:
SSLCertificateKeyFile conf/ssl/my-server.key
修改
CODE:
SSLMutex file:logs/ssl_mutex
为
CODE:
SSLMutex default
删除以下两行(如果有,我认为有错,删掉之后apache无法启动):
CODE:
<IfDefine SSL>
</IfDefine>
打开Apache配置文件(httpd.conf),去掉这行的注释
CODE:
#LoadModule ssl_module modules/mod_ssl.so
Openssl需要一个配置文件。你可以从这里下载一个可工作的版本http://tud.at/programm/openssl.cnf (或者本主题附件2:
附件: openssl.cnf.rar (2006-9-10 19:11, 1.21 K)
该附件被下载次数 84
)。将它保存到bin/openssl.cnf。
下面你要创建一个SSL证书。你可以打开一个命令行窗口,然后cd到Apache安装目录(比如C:/program files/apache group/apache2),敲入
以下命令:
CODE:
bin/openssl req -config bin/openssl.cnf -new -out my-server.csr
你将被问及一句口令短语。请注意,不要使用简单的几个词,而应该输入一整个句子,比如一篇诗词的一部份,越长越好。同样,你还要输入
你的服务器URL。然后其它的问题都是可选问答的,不过我建议你也将它们填充。
下一步,敲入以下命令:
CODE:
bin/openssl rsa -in privkey.pem -out my-server.key
以及(注意,只有一行)
CODE:
bin/openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000
这样将创建一个4000天后才过期的证书。最后敲入:
CODE:
bin/openssl x509 -in my-server.cert -out my-server.der.crt -outform DER
这些命令在Apache目录下创建了一些文件(my-server.der.crt, my-server.csr, my-server.key, .rnd, privkey.pem, my-server.cert)。
将这些文件拷贝到目录conf/ssl
(比如C:/program files/apache group/apache2/conf/ssl),如果目录ssl不存在,你必须先创建一个。
重启Apache服务。
现在可以用类似这样的url来访问你的版本库了https://servername/svn/project
QUOTE:
强制通过SSL来访问
当你配置了SSL来提高版本库安全时,你可能想禁用无SSL的http访问方式,而只允许通过https访问。要达到这种效果,你要在<Location>块加
入另外一个指示器SSLRequireSSL。
一个示例<Location>块可能像这样:
<Location /svn>
DAV svn
SVNParentPath D:/SVN
SSLRequireSSL
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile passwd
#AuthzSVNAccessFile svnaccessfile
Require valid-user
</Location>
以上介绍的配置为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:
<Location /svn>
SVNPath D:/SVN/proj1
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile D:/passwd
#AuthzSVNAccessFile D:/svnaccessfile
Require valid-user
</Location>