我们有一个 nginx 服务器,它代理 Apache+SVN 的标准设置。nginx 设置是一个非常简单的代理:
server {
server_name svn.ourdomain.tld;
location / {
proxy_pass http://localhost:8080;
}
}
Apache 设置如下:
<Location />
DAV svn
SVNParentPath /var/svn
AuthType Basic
AuthName "Authentication Required"
AuthUserFile /var/svn/.auth
Require valid-user
</Location>
...这允许我们使用类似的东西来访问存储库http://svn.ourdomain.tld/repo
。我们已经运行这个设置大约 2 年了,没有出现问题。
最近我们发现需要将其中一个存储库检出到服务器本身,但每次我们这样做时,存储库似乎都会被破坏。从那时起,它只会响应错误301 Moved Permanently
。
我们尝试过:
svn co file:///path/to/repo
svn co svn://localhost/repo
svn co svn://svn.ourdomain.tld/repo
svn co svn+ssh://localhost/repo
svn co svn+ssh://svn.ourdomain.tld/repo
svn co http://localhost/repo
svn co http://svn.ourdomain.tld/repo
也尝试绕过 nginx,但出现同样的错误:
svn co http://localhost:8080/repo
svn co http://svn.ourdomain.tld:8080/repo
从另一台机器签出按预期进行直到我们尝试在服务器上检查,但之后它因同样的301
错误而拒绝。
更令人困惑的是,这个存储库服务器还托管了我们的哈德森CI 服务器,每小时都会拉取和构建我们的项目。这让我们怀疑是 svn 客户端导致了通信错误。
这也非常令人困惑,删除然后重新创建 reposvnadmin
不会重置错误 - repo 是仍然不可用,尽管它是“新的”!重新启动 apache 和 subversion (svnserve) 对此或原始错误没有影响。
版本信息:
- 操作系统:64位CentOS 4.2,2.6.27内核
- svn 客户端:1.4.2(服务器和远程客户端相同)
- svn服务器:1.4.2
- httpd: 2.2.3
更新:
在 repo 服务器上运行时也会发生这种情况svn export
。从任何其他盒子/客户端运行,都没有问题。以下是工作流程,以帮助澄清错误:
[~repo-server~]# svnadmin create {repo}; chown -Rf www:www {repo}
[remote-client]# svn checkout http://svn.ourdomain.tld/repo
[remote-client]# svn add file; svn ci -m ''
[~repo-server~]# cd /var/www; svn export file:///path/to/repo/trunk ourproject
[remote-client]# svn update
失败并出现 301 错误
我还可以确认盒子的主机名在这里没有效果,这很奇怪:无论是否svn.ourdomain.tld
添加到/etc/hosts
它仍然会中断 - 我们认为这可能是本地主机路由的问题,但事实似乎并非如此。
我们是否遗漏了文档中的某些内容,即当服务器位于同一台机器上时,您无法签出存储库?我们如何在本地签出时防止存储库损坏?
答案1
svn 不处理 HTTP 重定向(这就是 301 错误),查看重定向指向的位置(wget、wireshark),从那里检出。
这也是 apache 特有的问题,虚拟主机配置可能会破坏它。