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 subversion+apache 配置 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 [email protected] 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> posted on 2007-02-26 11:49 用 mod_authz_svn 进行目录访问控制 首先需要让 Apache 将 mod_authz_svn 模块加载进来。在 Subversion 的安装目录中找到 mod_auth_svn 模块,将其拷贝到 Apache 安装目录的 modules 子目录下。修改 httpd.conf 文件,找到 LoadModule dav_svn_module modules/mod_dav_svn.so
| 在其后面加上 LoadModule authz_svn_module modules/mod_authz_svn.so
| 现在可以在 Location 标签中使用 authz 的功能了。一个基本的 authz 配置如下: <Location /repos>
DAV svn
SVNPath /etc/svn/repos
AuthType Basic
AuthName "svn repos"
AuthUserFile /etc/svn/passwd
AuthzSVNAccessFile /etc/svn/accesspolicy
Satisfy Any
Require valid-user
</Location>
| AuthzSVNAccessFile 指向的是 authz 的策略文件,详细的权限控制可以在这个策略文件中指定,如: #两个分组:committers,developers
[groups]
committers = paulex richard
developers = jimmy michel spark sean /
steven tony robert
#在根目录下指定所有的用户有读权限
[/]
* = 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 = paulex richard
project2_committers = jimmy michel spark sean /
steven tony robert
[repos1:/]
* = r
@ project1_committer = rw
[repos2:/]
* = r
@ project2_committer = rw
| 这样项目1的 committer 组只能对 repos1 版本库下的文件具有写权限而不能修改版本库 repos2,同样项目2的 commiter 也不能修改 repos1 版本库的文件。 用 MySQL 代替文件形式存放密码 到目前为止我们的用户名密码文件还是以文本文件形式存放在文件系统中的,出于安全性的需要或者单点登陆等可扩展性的考虑,文本文件的管理方式都不能满足需求了。通过 Apache 的 module_auth_mysql 模块,我们可以用 MySQL 来保存用户信息。该模块的主页在 http://modauthmysql.sourceforge.net/,你也可以在 http://modules.apache.org/ 找到它的发行版本。安装方法同上述 Apache 的模块一样,拷贝至 modules 目录并在 httpd.conf 文件中添加如下语句: LoadModule mysql_auth_module modules/mod_auth_mysql.so
| 相应的 Location 区域改写为: <Location /repos>
AuthName "MySQL auth"
AuthType Basic
AuthMySQLHost localhost
AuthMySQLCryptedPasswords Off
AuthMySQLUser root
AuthMySQLDB svn
AuthMySQLUserTable users
require valid-user
</Location>
| 然后在 mysql 中添加名为 svn 的数据库,并建立 users 数据表: create database svn;
use svn;
CREATE TABLE users (
user_name CHAR(30) NOT NULL,
user_passwd CHAR(20) NOT NULL,
user_group CHAR(10),
PRIMARY KEY (user_name)
);
| 在 users 表中插入用户信息 insert into users values('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 软件及其配置文件,来生成加密密钥和数字证书。这里,我们可以使用一些免费网站,如 http://hunter.campbus.com/ 上提供的集成版本的 Apache。 有了相关的工具和文件,我们就可以开始生成 SSL 的证书和密钥了。首先,我们需要找到 openssl 程序及其配置文件 openssl.cnf,运行如下命令来生成 128 位的 RSA 私有密钥文件 my-server.key:
openssl genrsa -des3 -out my-server.key 1024
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
.....++++++
........++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:********
Verifying - Enter pass phrase for server.key:********
| 命令运行期间需要用户输入并确认自己的密码。 现在,我们需要 SSL 的认证证书,证书是由 CA(certificate authority) 发放并且认证的。为此,我们可以用如下命令生成一个 CSR(Certificate Signing Request) 文件发给 CA,从而得到 CA 的认证: openssl req -new -key my-server.key -out my-s erver.csr -config openssl.cnf
| 当然,一般情况下,如果 Subversion 的用户不是太多,安全情况不是很复杂,我们也可以生成一个自签名的认证证书,从而省去了向 CA 申请认证的麻烦。如下命令: openssl req -new -key my-server.key -x509 -out my-server.crt -config openssl.cnf
| 以上两个命令都需要用户输入那个 key 文件的密码,以及一些网络设置信息,如域名,邮箱等等,这里输入的服务器域名应该与 Apache 配置文件当中的一致。现在,我们可以在 Apache 的 conf 目录下新建一个 ssl 目录,将 my-server.key 和 my-server.crt 文件都移动到 ssl 目录里面。然后修改 ssl.conf 文件,将 SSLCertificateKeyFile 和 SSLCertificateFile 项指向这两个文件。 如果 Apache 的 module 目录里面没有 mod_ssl.so 文件,可以将事先准备好的文件拷贝过去。然后,我们可以设置 Apache 的配置文件 httpd.conf,将 ssl 模块加入其中: LoadModule ssl_module modules/mod_ssl.so
| 然后,在配置文件的最后,加上如下 SSL 相关配置项: SSLMutex default
SSLRandomSeed startup builtin
SSLSessionCache none
ErrorLog logs/SSL.log
LogLevel info
<VirtualHost svntest.ut.cn.ibm.com:443>
SSLEngine On
SSLCertificateFile conf/ssl/my-server.crt
SSLCertificateKeyFile conf/ssl/my-server.key
</VirtualHost>
| 这样,基本的设置工作就完成了。重新启动 Apache 服务器,现在可以用 https 协议代替 http 协议来访问版本库了。如果要限定版本库只能用 https 访问,我们可以在 Apache 配置文件当中 Subversion 部分加上 “SSLRequireSSL”。如下: <Location /repos>
DAV svn
SVNPath /etc/svn/repos
………….#other items
SSLRequireSSL
</Location>
| 总结 Subversion 以其优良的版本控制功能,灵活的网络访问模型,以及与 Apache 服务器联合配置所带来的更强大的管理控制功能,逐渐在开源软件开发的实践当中得到广泛的应用。本文重点介绍了 Subversion 服务器端的配置以及与 Apache 服务器联合配置的基本步骤和简单应用,实现了简单的实例应用。读者如果想要进一步了解相关信息,请参考文章后面列出的相关资料。 |