【问题标题】:Proxying Multiple Subversion Repos with nginx使用 nginx 代理多个 Subversion 存储库
【发布时间】:2012-05-14 05:35:29
【问题描述】:

我目前有一个老化的 subversion 1.4.2 服务器,其中包含多个我想要升级的存储库。我想做几件事:

  • 移至更新版本 (1.7+) 的颠覆
  • 将存储库拆分到不同的机器上
  • 更改主机名(我稍后会解释)
  • 更改为使用 FQDN 而不是 URL 上的路径(

但是,我想要的停机时间非常短,并且我希望逐步做到这一点,并且(在很大程度上)无缝地为我们的用户服务。

因此,服务器当前被解析为:svn.svr.mycompany.co.uk 我希望用户切换到使用:svn.mycompanyglobal.net

该新名称将由 DNS 路由到适当的服务器,具体取决于用户所在的大陆。这行得通。

这指向具有标准类型的 svn DAV 访问权限的 Apache2 安装:

<VirtualHost 10.11.22.33>
  Servername svn.svr.mycompany.co.uk

  <Location /main>
    DAV svn
    SVNPath /home/svnrepo/main
    [... Some regular auth stuff ...]
    SVNIndexXSLT /svnindex.xsl
  </Location>

  <Location /data>
    DAV svn
    SVNPath /home/svnrepo/data
    [... Some regular auth stuff ...]
    SVNIndexXSLT /svnindex.xsl
  </Location>
</VirtualHost>

有一些与文档根和模块相关的常见内容,但这是它的症结所在。

所以,目前我可以查看以下代码:http://svn.svr.mycompany.co.uk/data/Core/Blah

现在我在前面放了一个 nginx 反向代理。它具有全局主机名,我可以通过以下 URL浏览代码:http://data.svn.mycompanyglobal.net/Core/Blah注意我已经移动了 “数据”从路径到主机名)。我通过添加以下配置在 nginx 中实现了这一点:

server {
  listen 80;

  server_name data.svn.mycompanyglobal.net;

  proxy_set_header  Host svn.svr.mycompany.co.uk;

  location = /svnindex.xsl {
    proxy_pass http://svn.svr.mycompany.co.uk/svnindex.xsl;
  }

  location /data/ {
    proxy_pass http://svn.svr.mycompany.co.uk/data/;
  }

  location / {
    proxy_pass http://svn.svr.mycompany.co.uk/;
    rewrite ^(.*)$ /data$1 break;
  }
}

这一切都有效。我可以在 Web 浏览器中浏览代码,也可以通过 TortoiseSVN 中的 repo 浏览器或命令行“svn ls”浏览代码。所有这些都通过代理完成。

但是,当我尝试检查代码时,我得到了错误

Unusable URI: it does not refer to this repository

我得出的结论是,这是客户做出此决定(即提出错误)。查看 SVNKit 源代码,很明显 svn 客户端会将它请求的路径与服务器返回的路径进行比较——我不知道为什么,但这就是它的样子(参见DavUtils)。

我可以通过将我结帐的 URL 更改为这个来解决这个问题(某种程度上):

http://data.svn.mycompanyglobal.net/data

[ 即我将存储库的名称添加到末尾]

这可能是因为我在上面添加的 "/data/" 路由。

有没有人设法做这样的事情?我可以在 Subversion 服务器或代理上做些什么来改变 Subversion 客户端的路径呈现方式吗?

我知道,一旦我将它安装到不同的服务器上,它就不会成为问题,因为每台服务器只会列出一个“位置”(根),但我目前还没有这种奢侈。

另外,您可能应该记住,这个盒子已经存在了很多年,并且有很多硬编码的引用。这就是为什么我需要代理它,以便我可以逐步将所有引用移动到新的 URL 格式。

我很感激这是一个很长的问题,但我希望我已经明确了我想要实现的目标。随意告诉我我疯了 - 感觉就像我已经接近让它工作了:)。

【问题讨论】:

    标签: svn configuration nginx reverse-proxy


    【解决方案1】:

    我可能正确理解您的上下文。我确定您知道这一点,但 SVN 也在不同的端口上运行,所以您可能会遇到问题 :)

    关于 nginx 中的 location 参数,您必须记住,它只是定义您在配置中设置的服务器名称的位置。因此,对于上面定义为data.svn.company.com 的唯一服务器名称,您正在为该子域定义每个位置。我认为您实际上是在尝试定义多个子域。

    因此,如果是这种情况,您将不得不设置多个服务器名称,例如 main.svn.company.comdata.svn.company.com,而不是定义位置 URI。

    希望有帮助:)

    【讨论】:

    • 谢谢!我实际上已经想出了如何做到这一点 - 我已经用我的解决方案做出了回应。
    • 很酷没有问题。如果答案是可能的解决方案,请通过“检查”让我知道,这样我就知道我的魔力仍然有效;)
    【解决方案2】:

    所以我最终通过编辑端点服务器(即我要离开的那个)来在两个不同的位置拥有相同的存储库:

    <VirtualHost 10.11.22.33>
      Servername svn.svr.mycompany.co.uk
    
      <Location /data>
        DAV svn
        SVNPath /home/svnrepo/data
        [... Some regular auth stuff ...]
      </Location>
    </VirtualHost>
    
    <VirtualHost 10.11.22.33>
      Servername data.svn.svr.mycompany.co.uk
    
      <Location />
        DAV svn
        SVNPath /home/svnrepo/data
        [... Some regular auth stuff ...]
      </Location>
    </VirtualHost>
    

    事实证明,subversion 处理得很好。然后我的代理变得微不足道。显然,我在这里不需要代理,但是当我开始破坏端点服务器时我会这样做。

    现在我可以结帐、浏览和签到:

    http://data.svn.mycompanyglobal.net/
    http://data.svn.svr.mycompany.co.uk/
    http://svn.svr.mycompany.co.uk/data
    

    第一个将路由到代理服务器并代理到第二个。第二个和第三个(如果直接连接)将直接路由到旧服务器。

    作为参考,我的 nginx 代理条目现在如下所示:

    server {
      listen 80;
      listen 443 ssl;
    
      server_name data.svn.mycompanyglobal.net;
    
      proxy_set_header     Host data.svn.svr.mycompany.co.uk;
    
      location / {
        proxy_pass http://data.svn.svr.mycompany.co.uk/;
      }
    }
    

    每个存储库都会有一个(在我上面的示例中为“数据”和“主”)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      相关资源
      最近更新 更多