2012-05-04 3 views
1

У меня в настоящее время есть сервер подвешивания с чередованием 1.4.2 с несколькими репозициями, которые я хочу обновить. Я хочу сделать несколько вещей:Proxying Multiple Subversion Repos с nginx

  • Перехода к более поздней версии (1.7+) подрывной
  • Split хранилища на разные машины
  • Изменения имен хостов (я объясню это в секунде)
  • Изменение на использование доменного имени, а не путь по URL (< - Это проблема, у меня есть)

Однако, я хочу, очень мало времени простоя и я хочу сделать это постепенно и (в в значительной степени) шов меньше для наших пользователей.

Таким образом, сервер в данный момент решен: svn.svr.mycompany.co.uk Я хочу, чтобы пользователи, чтобы перейти к использованию: svn.mycompanyglobal.net

Это новое имя будет перенаправлен на DNS в соответствующий сервер, в зависимости от того, на каком континенте он включен. Это работает.

что указывает на Apache2 установить с SVN DAV доступа стандартного типа:

<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 обратный прокси перед этим. Он имеет глобальное имя хоста и я могу просматривать код по адресу: 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; 
    } 
} 

Это все работает. Я могу просматривать код в веб-браузере и через браузер репо в TortoiseSVN или через командную строку «svn ls». Все это через прокси.

Однако, когда я пытаюсь проверить код, я получаю ошибку

Unusable URI: it does not refer to this repository 

Я пришел к выводу, что это клиент делает это решение (т.е. поднять ошибку). Глядя на исходный код SVNKit, ясно, что клиент svn сравнивает запрошенный путь к пути, возвращаемому сервером - я не уверен, почему, но это то, на что это похоже (см. DavUtils).

я могу решить эту проблему (вроде), изменив URL я в кассу от этого:

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

[т.е. я добавить имя хранилища до конца]

Это, вероятно, работает из-за «/ data /» маршрут, который я добавил выше.

Неужели кому-нибудь удалось сделать что-нибудь подобное? Есть ли что-то, что я могу сделать на сервере Subversion или прокси-сервере, который изменяет представление пути к клиенту подрывной деятельности?

Я знаю, что как только я получу это на отдельных серверах, он перестанет быть проблемой, потому что на каждом сервере будет только одно «местоположение» (корень), но в данный момент у меня нет роскоши этого ,

Кроме того, вы должны, вероятно, помнить, что этот ящик был предназначен для ослов, и есть много жестко закодированных ссылок на него. Вот почему мне нужно проксировать его, чтобы я мог постепенно переместить все ссылки на новый формат URL.

Я ценю, что это длинный вопрос, но я надеюсь, что я дал понять, чего я хочу достичь. Не стесняйтесь сказать мне, что я просто сумасшедший - мне просто кажется, что я так близок к тому, чтобы заставить его работать :).

ответ

0

Возможно, вы правильно поняли ваш контекст. Я уверен, что вы знаете об этом, но SVN также работает на разных портах, поэтому у вас может быть проблема :)

Что касается параметра location в nginx, вам нужно иметь в виду, что это только определяя местоположение имени сервера, которое вы установили в своей конфигурации. Таким образом, для единственного имени сервера, которое вы определили как data.svn.company.com, вы определяете каждое местоположение для этого поддомена. Я думаю, вы на самом деле пытаетесь определить несколько поддоменов.

Так что если это так, вам нужно будет установить несколько имен серверов, таких как main.svn.company.com и data.svn.company.com, вместо определения URI местоположения.

Надежда, что помогает :)

+0

Спасибо! Я действительно разработал, как это сделать - я ответил своим решением. –

+0

Прохладный без проблем. если ответ был возможным решением, пожалуйста, сообщите мне, «проверив» его, чтобы я знал, что мое моджо все еще работает;) – crockpotveggies

0

Так что я в конечном итоге делает это путем редактирования сервера конечной точки (т.е. один я отходя от), чтобы иметь один и тот же репозиторий в двух разных местах:

<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> 

Оказалось, что подрывная деятельность отлично справляется с этим. Тогда мой прокси становится тривиальным. Очевидно, мне здесь не нужен прокси-сервер, но я буду, когда начну разорвать конечный сервер.

Теперь я могу оформить с, просматривать и проверить, чтобы:

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/; 
    } 
} 

Там будет один из них для каждого из репозиториев («данных» и «главных» в моем примере выше).

Смежные вопросы