Proxying Multiple Subversion Repos con nginx

Actualmente tengo un server subversion 1.4.2 envejecido con varios repos que quiero actualizar. Quiero hacer algunas cosas:

  • Pasar a una versión más reciente (1.7+) de subversión
  • Divida los repositorys en diferentes máquinas
  • Cambiar los nombres de los hosts (lo explicaré en un segundo)
  • Cambiar para usar un FQDN en lugar de una ruta en la URL (<- Este es el problema que tengo)

Sin embargo, quiero muy poco time de inactividad y quiero hacer esto progresivamente y (en gran medida) a la perfección a nuestros usuarios.

Entonces, el server se resuelve actualmente por: svn.svr.mycompany.co.uk Quiero que los usuarios cambien a usar: svn.mycompanyglobal.net

Ese nombre nuevo será enrutado por DNS a un server apropiado dependiendo de en qué continente esté el usuario. Esto funciona.

Esto apunta a una installation de Apache2 con acceso svn DAV del tipo estándar:

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

Están las cosas habituales relacionadas con las raíces y los modules de los documentos, pero este es el quid de la cuestión.

Por lo tanto, en este momento puedo consultar el código de: http://svn.svr.mycompany.co.uk/data/Core/Blah

Ahora he puesto un proxy inverso nginx en frente de esto. Tiene el nombre de host global y puedo navegar por el código a través de la URL: http://data.svn.mycompanyglobal.net/Core/Blah ( Tenga en count que he movido los "datos" de la ruta al nombre del host ) Lo he logrado en nginx agregando la siguiente configuration:

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

Todo esto funciona Puedo search el código en un browser web y a través del browser repo en TortoiseSVN o a través de la línea de command "svn ls". Todo esto a través del proxy.

Sin embargo, cuando bash consultar el código, obtengo el error

 Unusable URI: it does not refer to this repository 

Llegué a la conclusión de que este es el cliente que toma esta decisión (es decir, que plantea el error). Al mirar el código fuente de SVNKit, está claro que el cliente svn compara la ruta que solicitó con la ruta que devolvió el server; no estoy seguro de por qué, pero así es como se ve (vea DavUtils ).

Puedo resolver este problema (más o less) cambiando la URL que pago de esto a:

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

[es decir, agrego el nombre del repository hasta el final]

Esto probablemente funciona debido a la ruta "/ data /" que he agregado anteriormente.

¿Alguien ha logrado hacer algo como esto? ¿Hay algo que pueda hacer en el server de Subversion o en el proxy que cambie la presentación de la ruta al cliente de subversión?

Sé que una vez que tenga esto en serveres separados dejará de ser un problema porque cada server solo tendrá una "Ubicación" en la list (la raíz), pero no tengo el lujo de esto en este momento.

Además, probablemente debas tener en count que este recuadro ha existido durante los años de burro y hay muchas references rígidas al respecto. Es por eso que debo usar un proxy para poder mover progresivamente todas las references al nuevo formatting de URL.

Aprecio que esta es una pregunta larga, pero espero haber dejado en claro lo que quiero lograr. Siéntete libre de decirme que estoy loca, solo siento que estoy tan cerca de hacer que funcione :).

Puedo entender tu context correctamente. Estoy seguro de que eres consciente de esto, pero SVN también se ejecuta en diferentes puertos, por lo que puedes tener un problema allí 🙂

Con respecto al parámetro de location en nginx, debes tener en count que solo está definiendo la location del nombre del server que configuraste en tu configuration. Por lo tanto, para el único nombre de server que usted definió como data.svn.company.com , está definiendo cada location para ese subdominio. Creo que en realidad estás tratando de definir múltiples subdominios.

Entonces, si ese es el caso, tendrá que configurar varios nombres de server como main.svn.company.com y data.svn.company.com lugar de definir el URI de location.

Espero que ayude 🙂

Así que terminé haciendo esto editando el server de punto final (es decir, el que me estoy alejando) para tener el mismo repository en dos ubicaciones diferentes:

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

Resulta que la subversión maneja esto muy bien. Mi proxy se vuelve trivial. Claramente, no necesito el proxy aquí, pero lo haré cuando empiece a romper el server de punto final.

Ahora puedo pagar, navegar y registrarme en:

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

El primero dirigirá al server proxy y al proxy hasta el segundo. El segundo y el tercero (si está conectado directamente) se dirigirán directamente al server anterior.

Como reference, mi input proxy nginx ahora se ve así:

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

Habrá uno de estos para cada uno de los repos ("datos" y "principal" en mi ejemplo anterior).