2010-03-19 27 views
7

Tengo un problema al ejecutar Apache + Subversion con SSL detrás de un proxy Nginx y espero que alguien tenga la respuesta. Revisé google durante horas buscando la respuesta a mi problema y parece que no puedo resolverlo. Lo que veo son los errores "502 (Pasarela incorrecta)" al intentar MOVER o COPIAR usando subversión; sin embargo, los pagos y compromisos funcionan bien. Estas son las partes relevantes (creo) de los archivos de nginx y configuración de Apache en cuestión:502 Bad Gateway con nginx + apache + subversion + ssl (COPIA SVN)

Nginx

upstream subversion_hosts { 
    server 127.0.0.1:80; 
} 


server { 
     listen  x.x.x.x:80; 
     server_name hostname; 

     access_log /srv/log/nginx/http.access_log main; 
     error_log /srv/log/nginx/http.error_log info; 

     # redirect all requests to https 
     rewrite ^/(.*)$ https://hostname/$1 redirect; 
} 

# HTTPS server 
server { 
     listen  x.x.x.x:443; 
     server_name hostname; 

     passenger_enabled on; 
     root /path/to/rails/root; 

     access_log /srv/log/nginx/ssl.access_log main; 
     error_log /srv/log/nginx/ssl.error_log info; 

     ssl     on; 
     ssl_certificate  server.crt; 
     ssl_certificate_key server.key; 

     add_header Front-End-Https on; 

     location /svn { 
       proxy_set_header Host $host; 
       proxy_set_header X-Real-IP $remote_addr; 
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

       set $fixed_destination $http_destination; 
       if ($http_destination ~* ^https(.*)$) 
       { 
        set $fixed_destination http$1; 
       } 
       proxy_set_header Destination $fixed_destination; 

       proxy_pass http://subversion_hosts; 
     } 
} 

Apache

Listen 127.0.0.1:80 
<VirtualHost *:80> 
     # in order to support COPY and MOVE, etc - over https (443), 
     # ServerName _must_ be the same as the nginx servername 
     # http://trac.edgewall.org/wiki/TracNginxRecipe 
     ServerName hostname 
     UseCanonicalName on 

     <Location /svn> 
       DAV svn 
       SVNParentPath "/srv/svn" 
       Order deny,allow 
       Deny from all 
       Satisfy any 
       # Some config omitted ... 
     </Location> 

     ErrorLog /var/log/apache2/subversion_error.log 

     # Possible values include: debug, info, notice, warn, error, crit, 
     # alert, emerg. 
     LogLevel warn 

     CustomLog /var/log/apache2/subversion_access.log combined 
</VirtualHost> 

De lo que pude mientras que la investigación este problema, el nombre del servidor tiene que coincidir tanto en el servidor apache como en el servidor nginx, lo cual he hecho. Además, este problema parece mantenerse aunque cambie la configuración para usar solo http.

Respuesta

1

Descubrí que la causa de mi problema no era el proxy entre nginx y apache, sino que era un problema con Apache.

Lo que no mencioné en la pregunta original fue lo que estaba en el # Some config omitted. Este bloque contenía lo siguiente:

AuthType Basic 
AuthName "Redmine SVN Repository" 
Require valid-user 
PerlAccessHandler Apache::Authn::Redmine::access_handler 
PerlAuthenHandler Apache::Authn::Redmine::authen_handler 

Para suberversion, estoy controlando el acceso de usuarios utilizando Redmine's manejador de autenticación. Después de activar y desactivar las opciones y reducir el problema, me enteré de que su módulo de autenticación no es seguro para subprocesos. Me encontré con el error porque Apache estaba usando Worker MPM. El cambio a Prefork MPM (sudo aptitude install apache2-mpm-prefork en Ubuntu) resolvió el problema.

8

Hoy me enfrenté a este problema.

Agregando la siguiente en la configuración apache2 lo arreglen:

RequestHeader edit Destination ^https http early

Cheers,
  Ignace M


Fuente:

+0

Había probado que en el pasado, pero pensé valió la pena intentarlo de nuevo. Desafortunadamente para mí, eso no funcionó. –

+0

Tuve que ejecutar 'sudo a2enmod headers', ¡y funcionó muy bien! –

+0

agregué esta línea pero no funciona desde hace años. hoy eliminé esta línea y ahora funciona – marstone

7

Las soluciones anteriores no funcionan para mí, tuve que cambiar la configuración de nginx y añadir lo siguiente en el bloque location, antes de la proxy_pass Directiva:

set $fixed_destination $http_destination; 
if ($http_destination ~* ^https(.*)$) { 
    set $fixed_destination http$1; 
} 
proxy_set_header Destination $fixed_destination; 
proxy_set_header Host $http_host; 
+0

Esto funciona, pero ¿podría explicar qué hace realmente este código? – bviktor

+0

El encabezado Destination se usa para los métodos COPY y MOVE (https://tools.ietf.org/html/rfc2518#page-54). Si servimos SSL/TLS con nginx y usamos Apache con mod_dav_svn como backend, este último no conoce el https: // URI. Con este fragmento, eliminamos la s de https en el encabezado Destino para que coincida con el servicio de Apache/Subversion. El encabezado Host se establece en el valor HTTP_HOST original del cliente. – Clemens

+0

Muchas gracias amigo – bviktor

Cuestiones relacionadas