window + svn + apache——全网第二好的配置方案

ubuntu+apache+subversion+LDAP:https://blog.csdn.net/qq_41566366/article/details/116701128

centos+apache+subversion+LDAP  : https://blog.csdn.net/qq_41566366/article/details/117356703

 

例行吐槽一下当前中文社区文档实在太糟糕了,配置apahce+subversion中间遇到的太多坑,很多文章省略了很多步骤,如果第一次配根本摸不着头脑。

首先我们应该有一个大概的地图,了解我们需要些什么:

方式一:

apache:2.2.2.5 (代理svn访问,搭配mod_dav_svn这个Module实现 )

subversion:1.8.1.7 (svn服务器)

svnadmin:3.0.5 (可选,svn图形化操作界面)

openLADP:2.4.44-x64(可选,配置ladp需要)

我的版本主选择主要来源于文章【LDAP落地】Windows环境下集成SVN,文章作者说因为版本选择的问题导致出错,感谢避坑。

优点:可以搭配ladp使用;缺点:配置繁琐,坑多

方式二:

visualSVN。优点:图形化界面,傻瓜式操作,不需要配置访问路径。缺点:想搭配ladp需要花钱,而且价格很贵。

visualSVN如果想要使用Active Directory,请移步地址https://www.visualsvn.com/server/features/windows-auth/ 中 Integrated Windows Authentication 部分。

 

环境:

windows server 2016 64核

 

安装apache 2.2.2.5 

下载apache,在http://archive.apache.org/dist/httpd/binaries/win32/下载 httpd-2.2.25-win32-x86-no_ssl.msi

在安装过程中,需要填写域名、邮箱,最后一项选择for All Users。

安装成功后,打开apache目录中的conf/httpd.conf,修改apache端口为8080

# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 8080

添加apache bin目录到环境变量。启动服务器,访问localhost:8080,如果出现It works!  说明成功了

 

apache基本配置

修改apache/conf/http.conf,其中端口修改为8080

# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 8080

在环境变量中添加apache/bin目录,检查subversion目录是否添加成功

subversion 1.8.1.7

https://sourceforge.net/projects/win32svn/files/中点击1.8.17,下载 Setup-Subversion-1.8.17.msi

这里也是一路下一步

 

subversion创建版本库

 创建SVN版本库。用svnadmin命令创建库。svn存储版本数据也有2种方式:BDB和FSFS。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。默认使用的存储方式也是FSFS方式。

>D:\svn>mkdir repos


# 运行创建版本库的命令,指定数据存储为 FSFS,如果要指定为 Berkeley DB,则将 fsfs 替换为 bdb
>D:\svn > svnadmin create --fs-type fsfs repos

>D:\svn>cd repos

>D:\svn\repos>dir
 驱动器 D 中的卷是 系统
 卷的序列号是 A934-A3CB

D:\svn\repos 的目录

2021/03/01  19:53    <DIR>          .
2021/03/01  19:53    <DIR>          ..
2021/03/01  19:53    <DIR>          conf
2021/03/01  19:53    <DIR>          db
2021/03/01  19:53                 2 format
2021/03/01  19:53    <DIR>          hooks
2021/03/01  19:53    <DIR>          locks
2021/03/01  19:53               251 README.txt

 

 

subversion添加项目

有了新建的版本库,就可以往里面添加项目了。不过,管理员必须考虑的问题是,应该将每一个项目分别放在不同的版本库里面,还是应该将它们放在统一的版本库里面。统一的版本库可以让管理员更加容易的升级和备份,不过,由于访问权限控制是针对整个版本库的,所以,统一的版本库也为不同项目配置不同的访问权限带来了麻烦。所以,管理员应该根据实际情况权衡考虑。

要做到这个,最好的办法就是用 svn import 命令导入已有的目录树。

--用 Apache 和 Subversion 搭建安全的版本控制环境

我们以统一版本库为例,先创建下面三个项目 

D:/svn

|——tmp1

|————project_1

|————project_2

|——tmp2

|————project_3

|——repos

 添加tmp1/project_1和tmp1/project_2。

坑一:这里tmp其实就是临时搭建一个目录结构,tmp目录import之后就可以删除了,import其实就是相当于初始化版本库。一开始我不知道,我以为import意思是把版本库下的项目结构指向tmp,可是修改tmp下的内容,版本库中没有任何更新,资料里面没有阐述这一点,导致我理解错误

>D:\svn\repos>cd ..

>D:\svn>svn import tmp1/  file:///d:/svn/repos/  --message "init"
正在增加       tmp1\project_1
正在增加       tmp1\project_2

提交后的版本为 1。

 添加tmp2/project_3

>D:\svn>svn import tmp2/  file:///d:/svn/repos/  --message "init"
正在增加       tmp2\project_3

提交后的版本为 2。

通过svn list 查看导入的项目

D:\svn>svn list --verbose file:///d:/svn/repos
      2 fibocom               3月 01 20:01 ./
      1 fibocom               3月 01 19:59 project_1/
      1 fibocom               3月 01 19:59 project_2/
      2 fibocom               3月 01 20:01 project_3/

通过svnlook查看树状结构,show-ids指定显示修改版本号

>D:\svn>svnlook tree repos
/
 project_1/
 project_2/
 project_3/

>D:\svn>svnlook tree repos --show-ids
/ <0.0.r2/187>
 project_1/ <0-1.0.r1/0>
 project_2/ <2-1.0.r1/67>
 project_3/ <0-2.0.r2/0>

 

 

配置apache与subversion

 

通过 Http 协议访问版本库是 Subversion 的亮点之一。使用 Http 协议意味着只需要打开浏览器,输入 URL 即可轻松的浏览整个版本库。灵活通常带来复杂性,Http 方式相对于 svnserve 方式来说需要更多的配置。

由于 Subversion 需要版本化的控制,因此标准的 Http 协议不能满足需求。要让 Apache 与 Subversion 协同工作,需要使用 WebDAV(Web 分布式创作和版本控制)。WebDAV 是 HTTP 1.1 的扩展,关于 WebDAV 的规范和工作原理,可以参考 IETF RFC 2518 。

为了使 Subversion 与 dav 模块通信,需要安装 mod_dav_svn 插件,可以在 Subversion 的安装目录中找到。将其拷贝到 Apache 安装目录的 modules 文件夹下。接下来就是配置 Apache 的 httpd.conf 文件,让 Apache 在启动的时候加载上述模块。

--用 Apache 和 Subversion 搭建安全的版本控制环境

Apache+SVN 配置成功后可以有两种方式:

1)单库方式:SVNPath 每个仓库单独配置各自的密码和权限文件。优点是各自分 开,互相不影响,维护方便。缺点是增加或删除仓库需要修改 apache 的 httpd.conf 后重 启。从 2.0 开始支持。

2)多库方式:SVNParentPath 指定一个父目录,所有仓库在这个父目录下,使用 一个密码文件和一个权限配置文件。优点是增加删除仓库不需要改 apache 的 httpd.conf, 不需要重启 Apache。缺点是项目多会很混乱。从 3.0 开始支持。

---svn ADMIN使用手册

 

mod_dav_svn 使subversion与dav通信

为了使apache能够使用subversion,需要让 Subversion 与 dav 模块通信,需要安装 mod_dav_svn 插件,可以在 Subversion 的安装目录中找到。将其拷贝到 Apache 安装目录的 modules 文件夹下。接下来就是配置 Apache 的 httpd.conf 文件,让 Apache 在启动的时候加载上述模块。

--用 Apache 和 Subversion 搭建安全的版本控制环境

下面两个模块的#去掉 

#LoadModule charset_lite_module modules/mod_charset_lite.so

LoadModule dav_module modules/mod_dav.so

LoadModule dav_fs_module modules/mod_dav_fs.so#目前没查这个模块是干嘛的,先打开

#LoadModule dav_lock_module modules/mod_dav_lock.so

增加下面的module,同时,把subversion安装目录中的/bin/下的mode_authz_svn mod_dav_svn加入到apache安装目录的module中

LoadModule dav_svn_module modules/mod_dav_svn.so

访问http://localhost:8080/repos/

多个版本库

如果想要指定多个版本库,可以用多个 Location 标签,也可以使用 SVNParentPath 代替 SVNPath,例如在 /etc/svn 下有多个版本库 repos1,repos2 等等,用如下方式指定:

D:/svn

|——tmp1

|——tmp2

|——repos

|——repos1

|——tmp3

|————project_4

>D:\svn>svnadmin create repos1
>D:\svn>svn import tmp3/  file:///d:/svn/repos1/  --message "init"
正在增加       tmp3\project_4

提交后的版本为 1。

httpd.conf最后增加Location,注意这里repos后面最好不要加‘/’ ,否则小乌龟可能会报错。


<Location /repos>
  DAV svn
  SVNParentPath  "D:/svn"
</Location>

那么访问刚才那个目录就访问不到了

这个时候需要访问地址更改为

 

 

配置账号密码

在D盘下新建svn目录svnRepo3。切换到新建目录下,新建userfile.txt,增加用户和密码(密码都是1)。当然切换到版本库下的conf目录,使用passwd代替userfile.txt也可以。

注意:-c参数表示创建一个用户帐号文件,下一次你再创建其它的帐号的时候就不需要这个参数了。

>D:\svn>htpasswd userfile.txt test1
new password: *
re-type new password:*


>D:\svn>htpasswd  passwd test2
New password: *
Re-type new password: *
Adding password for user test2

文件中

httpd.conf中增加后面四行

<Location /repos>
    DAV svn
    SVNParentPath  "D:/svn"
    AuthType Basic
    AuthName "svn repos"
    AuthUserFile   "D:/svn/passwd"
    Require valid-user
</Location>

重启apache,此时,访问http://localhost:8080/repos/repos/,弹出账号密码框,输入用户名密码后,就可以看到repos了,切换到repos1,同样可以看到

 

mod_authz_svn 目录访问控制

首先吧subversion中的模块mod_authz_svn复制移到apache中,修改httpd.conf,添加下面一行

LoadModule authz_svn_module modules/mod_authz_svn.so

同时修改Location,增加倒数二三行,AuthUserFile和AuthzSVNAccessFile 

<Location /repos>
    DAV svn
    SVNParentPath  "D:/svn"
    AuthType Basic
    AuthName "svn repos"
    AuthUserFile   "D:/svn/passwd"
    AuthzSVNAccessFile "D:/svn/accesspolicy"
    Require valid-user
</Location>

 

新建在D:/svn中新建accesspolicy,注意下面的 / tags  /branch等是导入的项目下一级目录而言的

坑二:这里要注意几点,有时候配置权限文件authz或者accesspolicy,怎么配置都不行,报错403,这个时候你最好看看你的log日志。说说我遇到的几个问题

1、authz中不能写x权限(这个是因为log日志中说有一个字符‘x’不允许)

2、权限前面最好不要有空格(https://stackoverflow.com/questions/39343899/subversion-svn-error-cant-parse-config/43491596#43491596 里提到空格可能会产生错误,导致出错)

3、目录前面没有加/ ,比如[/branch]写成[branch](https://askubuntu.com/questions/628456/svn-over-https-broken-after-12-04lts-upgrade-to-14-04lts 里提到,是否是缺少'/'引起的)

 

关于权限配置的方式,建议看看svn中authz配置文件总结里面写的很详细

注:权限是有继承关系的,例如admin组成员在根目录中已经有rw权限,那么在下面的子目录中,如果没有特别说明,都是有rw权限的。在子目录中要有权限,不管是r还是rw,在上一层的父目录中也一定要有r权限。http://www.360doc.com/content/13/0617/17/4550476_293525483.shtml 来源最后一段)

    #两个分组
    [groups]
    tester = test1
    developers = test2

    #在所有项目根目录下指定所有的用户有读权限
    [/]
    *= rw
    #追加 tester 组用户有读写权限
    @tester  = rw

     #在 所有项目/branch 指定 tester2 组的用户有读写权限
    [/branch]
    @tester2 = rw

    #在 所有项目/tag 下给予用户 tester1 读写执行权限
    [/tag]
    @tester1 = rx

重启服务器,访问localhost:8080/svn ,弹出框中输入账号密码

 

--------------------------------------------------------------------------------------------------------未完待续-------------------------------------------------------------------------------------------------------------

 

svnadmin 3.0.5

https://code.google.com/archive/p/jsvnadmin/downloads中下载 svnadmin-3.0.5.zip

 

openLADP

安装openLADP介绍:https://www.maxcrc.de/en/openldap-for-windows-installation-en/  注意图片中Database backend部分,我选择的是LADP

openLADP下载 https://www.maxcrc.de/en/download-en/

添加 E:\openLDAP 到环境变量

启动openLADP

安装完成后,打开cmd切换到安装目录,启动openLADP,按照网上介绍的方法slapd -d l 报错,找到一个11年的答案 https://bbs.csdn.net/topics/390412421?list=30729953

第一个方法——指明配置文件路径slapd.exe -d 1 -f ./slapd.conf

第二个方法——安装目录下面有个 run 目录, run 目录下面有个 run.cmd 直接双击运行;  

OpenLDAP默认监听的端口是389,下面我们来看下是不是389端口,如下:

 

配置ldap

mod_authnz_ldap.so、mod_ldap.so,

 

 

参考资料:

用 Apache 和 Subversion 搭建安全的版本控制环境 (非常详细,推荐)

Ubuntu上配置SVN,Apache服务以及常见问题解决方法(这篇也还不错,作者有心了)

Tortoise checkout时卡死的原因,论坛第二页说可能是网络问题,这种情况最好找一下公司的网管,他们知道怎么解决:https://bbs.csdn.net/topics/391992517?page=2

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值