优化 Apache Subversion 配置 - 删除重复的配置块

优化 Apache Subversion 配置 - 删除重复的配置块

我的每个存储库都有一个重复的身份验证块,我想知道是否有办法重用该块并优化我们的设置。

此设置使我们能够浏览 code.domain.com 来查看所有存储库并浏览源代码(因为所有存储库都是开放的,可供读取)。

以下是我的当前配置:

<VirtualHost *:80>
    DocumentRoot /u01/subversion/repositories
    ServerName code.domain.com
    ServerAdmin [email protected]

    <Location />
        Options Indexes MultiViews FollowSymLinks IncludesNoExec
        Order allow,deny
        Allow from all      
    </Location>


    <Location /repoA>
        DAV svn
        SVNPath /u01/subversion/repositories/repoA
        SVNIndexXSLT "/share/svnxslt/svnindex.xsl"

        AuthzSVNAccessFile /u01/subversion/svnrepos.acl
        AuthName "Source Code Repository / Repertoire de code"

        AuthBasicProvider ldap
        AuthType Basic
        AuthzLDAPAuthoritative off
        AuthLDAPURL "ldap://domain.com?sAMAccountName" NONE
        AuthLDAPBindDN "bindDN"
        AuthLDAPBindPassword bindPwd
        Satisfy Any
        Require valid-user
    </Location>

    # duplicated Location for repoB, repoC, etc...

</VirtualHost>

我找到了这个(并实现了它),但是,我收到以下错误:

[2013 年 7 月 26 日星期五 14:41:37] [错误] [客户端 xxxx] (25) 设备的 ioctl 不适当:URI 不包含存储库的名称。[403,#190001]

配置文件:

<VirtualHost *:80>
    DocumentRoot /u01/subversion/repositories
    ServerName code.domain.com
    ServerAdmin [email protected]

    <Location />

        Options Indexes MultiViews FollowSymLinks IncludesNoExec
        Order allow,deny
        Allow from all

          DAV svn
          SVNParentPath /u01/subversion/repositories
          AuthBasicProvider ldap
          AuthzLDAPAuthoritative Off
          AuthLDAPURL "ldap://domain.com?sAMAccountName" NONE
          AuthLDAPBindDN "bindDN"
          AuthLDAPBindPassword "bindPwd"
          AuthType Basic
          AuthName "Use your sAMAccountName to connect. If you're unsure, write to [email protected]."
    </Location>

    <Location /repoA>
      SVNPath /u01/subversion/respositories/repoA
      Satisfy Any
      require valid-user
    </Location>

    # Other Locations for each repoB, repoC, etc...
</VirtualHost>

最坏的情况是,我想我会保留冗余配置。

更新 #1

快到了...但是无法浏览域的根目录 - 出现 401 错误...

<VirtualHost *:80>
    ServerName code.domain.com
    ServerAdmin [email protected]

    DocumentRoot /u01/subversion/repositories/
    <Directory /u01/subversion/repositories/>
        Options Indexes MultiViews FollowSymLinks IncludesNoExec
        Order allow,deny
        allow from all
    </Directory>

    <Location />
        AuthBasicProvider ldap
        AuthType Basic
        AuthzLDAPAuthoritative off
        AuthName "SVN Repository. Authorization required."
        AuthLDAPBindDN "bindDN"
        AuthLDAPBindPassword "bindPwd"
        AuthLDAPURL "ldap://domain.com?sAMAccountName" NONE
        AuthzSVNAccessFile /u01/subversion/svnrepos.acl
        SVNParentPath /u01/subversion/repositories

        Satisfy Any
        Require valid-user
    </Location>



    <Location /repoA>
        DAV svn
        SVNPath /u01/subversion/repositories/repoA
         SVNIndexXSLT /share/svnxslt/svnindex.xsl
    </Location>

    # Other Locations   


</VirtualHost>

更新 #2

当我仅浏览根目录时,出现此错误: Directory index forbidden by Options directive: /u01/subversion/repositories/

但是,我看到 Indexes 存在于 Directory 指令的 Option 声明中......

更新 #3(Lazy Badger 提出的解决方案)

当我访问根目录时,我看到的是 .xsl 和 .css 文件,而不是存储库。但是,/svn/ 将列出存储库,但最终目标是让 /svn/ 成为站点的根目录。

<VirtualHost *:80>
    ...

    # /u01/subversion-docs is where .xsl and .css reside
    DocumentRoot "/u01/subversion-docs"

    <Directory />
      Options Indexes MultiViews FollowSymLinks IncludesNoExec
      AllowOverride None
      Order allow,deny
      Allow from all

      RewriteEngine on
      RewriteCond %{REQUEST_URI} ^/svn$
      RewriteRule ^(.*/svn)$ %1/ [R=301,L]
    </Directory>

    <Location /svn/>
      DAV svn

      SVNListParentPath on
      SVNParentPath /u01/subversion/repositories
      SVNIndexXSLT "/svnindex.xsl"  

      ...

      Satisfy Any
      require valid-user

    </Location>

</VirtualHost>

答案1

我很抱歉,但是你必须阅读并记住一些 ABC更深入

  • <Location>罐处理任何Subversion 存储库的数量(如果它们是公共目录的子目录)
  • 单个 AuthzSVNAccessFile 可以处理任何这些存储库中的存储库和路径的数量
  • 如果没有明确重新定义,则容器中定义的指令<Location>将在位置的子路径中继承

如果你的业务任务确实

拥有一组具有常见 LPAD 身份验证和基于 XSLT 的 HTML 页面模板以及基于路径的授权的存储库

让我们将我的丑陋草稿(使用 VisualSVN 服务器默认配置,跳过不太重要的部分)转化为适合您案例的功能解决方案

...
ServerRoot SOME/PATH/TO/SERVER
...
DocumentRoot "htdocs"
...
<Directory />
  Options FollowSymLinks
  AllowOverride None

  RewriteEngine on
  RewriteCond %{REQUEST_URI} ^/svn$
  RewriteRule ^(.*/svn)$ %1/ [R=301,L]
</Directory>
...
<Location /svn/>
  DAV svn

  SVNListParentPath on
  SVNParentPath /PATH/TO/PARENT/OF/REPO/DIR
  SVNIndexXSLT "/svnindex.xsl"  
...
  AuthName 
  AuthType Basic
  AuthBasicProvider file
  AuthUserFile "...htpasswd"
  AuthzSVNAccessFile "...authz"

  Satisfy Any
  require valid-user

...
</Location>
...

笔记

  • 定义 ServerRoot 以便稍后使用相对路径
  • DocumentRoot 以后与 DAV 位置不相关,它是站点的普通部分(不是 WebDAV),其中包含 SVNIndexXSLT 指令的模板
  • WebDAV 位置已移出站点根目录,以便为普通 http 保留站点的“正常”部分

第一个变化:基本身份验证被 LDAP 身份验证取代

<Location /svn/>
  DAV svn

  SVNListParentPath on
  SVNParentPath /PATH/TO/PARENT/OF/REPO/DIR
  SVNIndexXSLT "/svnindex.xsl"  
...
  AuthBasicProvider ldap
  AuthType Basic
  AuthzLDAPAuthoritative off
  AuthName "SVN Repository. Authorization required."
  AuthLDAPBindDN "bindDN"
  AuthLDAPBindPassword "bindPwd"
  AuthLDAPURL "ldap://domain.com?sAMAccountName" NONE
  AuthzSVNAccessFile "...authz"
  Satisfy Any
  require valid-user    
...
</Location>

第二次改变:SVNParentPath

<Location /svn/>
  DAV svn

  SVNListParentPath on
  SVNParentPath /u01/subversion/repositories/
  SVNIndexXSLT "/svnindex.xsl"

第三次改变:ServerRoot+DocumentRoot

以某种方式定义这些根,不要忘记将 svnindex.xsl 和所有其他需要的文件放置在 DocumentRoot

第四次变革

将 ACL 添加到 AuthzSVNAccessFile,将路径写入 repo 集合中[REPO:/PATH/IN/REPO]

答案2

我在生产环境中使用以下配置

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName svn.example.net

    DocumentRoot /vhosts/svn.example.net/
    <Directory /vhosts/svn.example.net/>
        Options -Indexes
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    <Location />
        AuthBasicProvider ldap
        AuthType Basic
        AuthzLDAPAuthoritative on
        AuthName "SVN Repository. Authorization required."
        AuthLDAPGroupAttribute memberUid
        AuthLDAPGroupAttributeIsDN off
        AuthLDAPBindDN uid=w3-ldap_reader,ou=system,ou=users,dc=example,dc=net
        AuthLDAPBindPassword 7654321
        AuthLDAPURL ldap://127.0.0.1/dc=example,dc=net?uid?sub
        Require ldap-group cn=svn,ou=groups,dc=example,dc=net
    </Location>

    <Location /Soft>
        DAV svn
        SVNPath /svn/soft
        AuthzSVNAccessFile /etc/svn/svn-soft.conf
        SVNReposName "Software repository."
        SVNIndexXSLT "/svnindex.xsl"
    </Location>

    <Location /Education>
        DAV svn
        SVNPath /svn/education
        AuthzSVNAccessFile /etc/svn/svn-edu.conf
        SVNReposName "Education repository."
        SVNIndexXSLT "/svnindex.xsl"
    </Location>

    <Location /Vacation>
        DAV svn
        SVNPath /svn/vacation
        AuthzSVNAccessFile /etc/svn/svn-vacation.conf
        SVNReposName "Vacation repository."
        SVNIndexXSLT "/svnindex.xsl"
    </Location>

    <Location /NDA>
        DAV svn
        SVNPath /svn/NDA
        AuthzSVNAccessFile /etc/svn/svn-nda.conf
        SVNReposName "NDA repository."
        SVNIndexXSLT "/svnindex.xsl"
    </Location>
</VirtualHost>

答案3

您可能想要使用 Includes。虽然仍存在一些冗余,但可以让您的大部分配置都设置在一个文件中。

这实际上取决于您的目标以及您维护这些文件的频率。

看: http://httpd.apache.org/docs/current/mod/core.html#include

我使用过的一种技术是使用一个目录来保存所有位置。将此目录包含在主 apache 配置中。

Include /etc/httpd/conf/svn.d/*.conf

然后在 svn.d/*.conf 中为每个实例创建一个文件。例如,repoa.conf。

在 repoa.conf 中,我包含了另一个包含所有 repos 的标准节的文件。

要添加新的 repo,我只需将 repoa.conf 复制到 repob.conf,更新路径,然后重新启动。

虽然不漂亮,但是快速且简单。

相关内容