Subversion(有缩写SVN的,她的执行程序也命名为SVN)是开源的内容管理系统,现在被广泛应用于软件开发的版本控制系统。在其他领域(比如备份)也得到很多应用。原来我开发用VB的,代码管理自然就是SourceSafe,后来转向Java,经过CVS和SVN的比较决定采用SVN(Subversion)。以下的内容是我在安装的时候的心得,因当时也在网上搜了很多资料,发现有些资料说得不太清楚,所以自己也写一些。补充一些其他没有的内容而已。
1.安装openssl 0.9.8d 安装到默认目录 c:/openssl(Win32OpenSSL-0_9_8d.exe)
2.安装apache ,安装成service,把它安装到 c:/apache (apache_2.0.59-win32-x86-no_ssl.msi)
3.安装subversion,安装到 c:/subversion (下载svn-1.4.0-setup.exe)
4.打开防火墙的80,443端口
5.apache的默认windows二进制安装包不带mod_ssl.so模块,需要自己编译,所以下载apache的原码包自己编译.以下是编译步骤
5.1解压缩apche原码包到一个目录,d:/httpd2 ,我下载的是2.0.59的版本.
5.2下载openssl的原码包,并解压缩到D:/httpd2/srclib/openssl ,我下载的是0.9.8d的版本(http://www.slproweb.com/products/Win32OpenSSL.html )
5.3下载并安装perl执行环境,我下载的是ActivePerl-5.8.8.819-MSWin32-x86-267479.zip,解压缩后执行install.bat即可,因为按照apche的说明档内的说明,安装完后可能需要重新启动windows,以使环境变量生效。为了避免openssl里面使用的专利算法,需要执行下面的脚本来去除这些算法(mdc2, RC5,IDEA),而这些脚本是perl的,所以才要安装perl,当然有高手能把这些脚本转成批处理的话,就不用perl了.
5.4 执行脚本
perl Configure VC-WIN32
perl util/mkfiles.pl >MINFO
perl util/mk1mf.pl dll no-asm no-mdc2 no-rc5 no-idea VC-WIN32 >makefile.rel
perl util/mk1mf.pl dll debug no-asm no-mdc2 no-rc5 no-idea VC-WIN32 >makefile.dbg
perl util/mkdef.pl 32 libeay no-asm no-mdc2 no-rc5 no-idea >ms/libeay32.def
perl util/mkdef.pl 32 ssleay no-asm no-mdc2 no-rc5 no-idea >ms/ssleay32.def
nmake -f makefile.rel
nmake -f makefile.dbg
可以做成一个Perl批处理,在httpd2/srclib/openssl目录下执行即可,一般不会有错误.
5.5编译apache很简单,我的编译环境是VC6,直接打开httpd2下面的Apache.dsw即可.
5.6编译前需要下载awk95.exe,放到VC6的bin目录下最方便.下载地址http://cm.bell-labs.com/cm/cs/who/bwk/awk95.exe
5.7选择活动项目是BuildBin-win32 release.
5.8选择build apache.exe即可等待VC6帮你编译程序了.
5.9编译结束可以看到build窗口显示编译成功,一般来说会有些警告,但不应该出现错误.反正我们需要的是mod_ssl.so,如果不影响到这个模块的编译就随它去吧.
5.10到D:/httpd2/modules/ssl/Release下可以看到mod_ssl.so已经建立.
6.复制编译好的mod_ssl.so到C:/Apache/Apache2/modules目录下.
7.下面需要建立网站数字证书和私钥
7.1用下面的命令建立一个128位服务器私钥,会要求输入密码
openssl genrsa -des3 -out my-server.key 1024
7.2我们只是内部使用的话,不需要去申请CA认证,用下面的命令产生一个自签名的证书,会要求输入一些证书相关的信息.一般只要common name输入域名和apache的httpd.conf里面的域名一致就可以了,当然不一致也可以的,apache启动的时候只会产生一些警告,不会影响apache运作.
openssl req -new -key my-server.key -x509 -out my-server.crt -config openssl.cnf -days 3650
7.3用下面的命令去除私钥的密码保护,这样利于apache启动.运行命令会要求输入创建私钥的时候设定的密码.
openssl rsa -in my-server.key -out my-server.key
8.把上一步生成的私钥和证书移动到c:/apache/apache2/conf/ssl目录,没有请自己建,当然也可以在别的目录,随个人喜好了.
其实做了这么多还只是准备工作,只是把需要的零部件准备好,后面的配置文件的设定很重要
9.首先我们先来测试和设置网站的SSL支持.
9.1修改httpd.conf,把LoadModule ssl_module modules/mod_ssl.so前的注释去掉.
9.2在httpd.conf的最后加上下面的条目
Listen 443
......
SSLMutex default
SSLRandomSeed startup builtin
SSLSessionCache none
......
ErrorLog logs/SSL.log
LogLevel info
<VirtualHost _default_:443>
SSLEngine on
SSLCertificateFile conf/ssl/my-server.crt
SSLCertificateKeyFile conf/ssl/my-server.key
</VirtualHost>
9.3这个时候在你的浏览器里面输入https://主机名 应该会弹出一个"安全报警"对话框,主要是你的服务器的证书的签发人未受信任,或者证书的网站名和你的网站名不匹配,你可以按Yes按钮接受这个证书,因为它就是你自己签发的,当然值得信任. 接受证书后,就能打开默认页面了.
9.4因为我们没有使用ssl.conf配置文件,所以需要象下面这样注释掉包含ssl.conf的内容
#<IfModule mod_ssl.c>
# Include conf/ssl.conf
#</IfModule>
10.在先安装apache,后安装subversion的情况下,subversion会修改httpd.conf档案,把以下2个加载模块的条目加入其中;
LoadModule dav_svn_module "C:/Subversion/bin/mod_dav_svn.so"
LoadModule authz_svn_module "C:/Subversion/bin/mod_authz_svn.so"
11.接下来要建立版本库,我们选择把所有版本库建立在同一个目录之下.目录名c:/repos,(因为我使用虚拟机,所以只设置了一个磁盘,一般版本库目录会放在D:或者其它磁盘上)
11.1建立目录c:/repos,这是所有版本库存放的目录
11.2建立一个版本库目录c:/repos/project1repos
11.2执行下面的命令创建版本库,也可以使用图形化客户端工具TortoiseSVN,这个工具用来很方便
C:/>svnadmin create --fs-type fsfs /repos/project1repos
11.3按照subversion推荐的方式建里版本库的目录结构.
在版本库目录之外建立一个临时目录,然后建立如下的目录结构.
-c:/ttmp
|-trunk
|-branches
|-tags
使用svn import 命令把目录树导入版本库
C:/>svn import /ttmp file:///c:/repos/project1repos -m "initial import"
11.4修改httpd.conf的设置,在文件的最后加入以下内容
<Location /repos>
DAV svn
SVNParentPath c:/repos
</Location>
重新启动apache然后用浏览器测试http://你计算机的IP/repos/project1repos/
应该可以看到刚才建的版本库的目录结构.用https://你计算机的IP/repos/project1repos/ 也应该可以才对.
12.接下来配置一下网站的访问控制,就是说每个访问网站的人我们都需要他的账号/密码.因为我们是配置Subversion,而大多数公司的项目不是open source的,所以会要求每个查看版本库的人有账号/密码.
12.1 用apache提供的工具htpasswd产生一个用户文件,可以在apache的安装目录下找到.
以下命令可以在文件中添加用户和密码(密码用MD5加密),
htpasswd c:/repos/passwordfile username
如果passwordfile不存在可以用 -c 参数新建一个
12.2修改httpd.conf,在location卷标中添加以下指令
AuthType Basic
AuthName "Subversion repository"
AuthUserFile c:/repos/passwordfile
Require valid-user
重新启动apache然后用浏览器测试http://你计算机的IP/repos/project1repos/会要求你输入账号/密码.账号/密码正确的话,就能正确浏览版本库目录了.
12.3为了更详细的权限控制,需要mod_authz_svn模块,在正确的安装顺序下,subverion安装程序会自动配置mod_authz_svn在httpd.conf的加载.只需要在<Location>卷标中修改配置如下即可.
<Location /repos>
DAV svn
SVNParentPath c:/repos
AuthType Basic
AuthName "Subversion repository"
AuthUserFile c:/repos/passwordfile
AuthzSVNAccessFile c:/repos/authz
Satisfy Any
Require valid-user
</Location>
在你新建的版本库的CONF目录下有个authz文件,是一个详细控制认证的模板,我们可以从它开始设置详细的控制权限.
Satisfy Any 项用于设置匿名用户有权打开版本库,
更详细的访问控制在authz档案中.可能需要参考svnbook
需要注意的是,指定用户对某个目录的权限会使得用户拥有对所有版本库某个目录的权限,如果要分别指定各个版本库下目录的权限,需要前面加上版本库限定指令如
[priject1repos:/]
或者
[priject1repos:/trunk]
13.如果要限定版本库只能通过https访问,可以在<Location>标签中加入SSLRequireSSL,如下
<Location /repos>
DAV svn
SVNParentPath c:/repos
AuthType Basic
AuthName "Subversion repository"
AuthUserFile c:/repos/passwordfile
AuthzSVNAccessFile c:/repos/authz
# Satisfy Any
Require valid-user
SSLRequireSSL
</Location>
在Satisfy Any和SSLRequireSSL指令同时生效的情况下,仍然可以不使用https:// 访问版本库,但是匿名用户无法访问,在仅有SSLRequireSSL指令生效的情况下,必须通过https:// 才可以访问版本库.
TODO : 使subversion支持ldap用户验证,需要配置apache的ldap模块
TODO : 升级apache到2.2.X版本,需要重新编译mod_ssl.
后记:现在SVN的新版本出来了,可以配合Apach 2.2.X版本了
参考资料
http://httpd.apache.org/docs/2.0/platform/win_compiling.html
http://www-128.ibm.com/developerworks/cn/java/j-lo-apache-subversion/index.html
http://www.openphp.cn/index.php/article/7/121/index.html
http://www.subversion.org.cn/svnbook/nightly/svn-book.html#svn.reposadmin.create