У нас есть сервер 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
ошибка.
Что еще более сбивает с толку, так это то, что на этом сервере репозитория также размещаются наши HudsonCI-сервер, который ежечасно загружает и строит наши проекты. Это заставляет нас подозревать, что именно клиент svn вызывает ошибку связи.
Также очень сбивает с толку, что удаление, а затем повторное создание репо с использованием svnadmin
не сбрасывает ошибку - репо по-прежнему недоступен, даже если он «новый»! Перезапуск apache и subversion (svnserve) не влияет ни на эту ошибку, ни на исходную ошибку.
Информация о версии:
ОБНОВИТЬ:
Это также происходит с 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
он все еще ломается - мы думали, что это может быть проблема с маршрутизацией localhost, но похоже, что это не так.
Нам не хватает чего-то в документации, в котором говорится, что вы не можете оформить заказ на репо, когда сервер находится в том же ящике? Как мы можем предотвратить повреждение репозиториев при локальном оформлении заказа?
svn не обрабатывает перенаправления HTTP (вот что такое ошибка 301), посмотрите, где перенаправления указывают на (wget, wirehark), проверьте оттуда.
Также это проблема, специфичная для apache, конфигурация виртуального хоста может нарушить ее.