【发布时间】: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