2010-03-19 22 views
7

Sto riscontrando un problema con Apache + Subversion con SSL dietro un proxy Nginx e spero che qualcuno possa avere la risposta. Ho setacciato Google per ore cercando la risposta al mio problema e non riesco a capirlo. Quello che vedo sono gli errori "502 (Bad Gateway)" quando si prova a MOVE o COPY usando subversion; tuttavia, checkout e commit funzionano bene. Qui ci sono le parti pertinenti (credo) dei file nginx e configurazione di Apache in questione:502 Bad Gateway con nginx + apache + subversion + ssl (SVN COPY)

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> 

Da quanto ho potuto vedere durante la ricerca questo problema, il nome del server deve corrispondere sia sul server Apache che sul server nginx, cosa che ho fatto. Inoltre, questo problema sembra aggirarsi anche se cambio la configurazione per utilizzare solo http.

risposta

1

Ho scoperto che la causa del mio problema non era il proxy tra nginx e apache, ma piuttosto un problema con Apache stesso.

Quello che non ho menzionato nella domanda iniziale era quello che era nello # Some config omitted. Questo blocco conteneva la seguente: l'accesso degli utenti

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

Per suberversion, sto controllando utilizzando Redmine's gestore di autenticazione. Dopo aver attivato e disattivato le opzioni e ridotto il problema, ho appreso che il loro modulo di autenticazione non è thread-safe. Stavo correndo nell'errore perché Apache stava usando l'MPM Worker. Il passaggio al prefork MPM (sudo aptitude install apache2-mpm-prefork in Ubuntu) ha risolto il problema.

8

Ho affrontato questo problema esatto oggi.

aggiunta dei seguenti nella configurazione apache2 risolto:

RequestHeader edit Destination ^https http early

Salute,
  Ignace M


Fonte:

+0

avevo provato che in passato, ma figurati valeva la pena sparare ancora. Sfortunatamente per me, questo non ha funzionato. –

+0

Ho dovuto eseguire 'sudo a2enmod headers', quindi ha funzionato alla grande! –

+0

ho aggiunto questa riga ma non funziona per anni. oggi ho rimosso questa linea e ora funziona – marstone

7

Le soluzioni precedenti non ha funzionato per me, ho dovuto cambiare la configurazione di nginx e aggiungere il seguente nel blocco location, prima che la direttiva proxy_pass:

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

Funziona, ma potresti spiegare cosa fa effettivamente questo codice? – bviktor

+0

L'intestazione Destinazione viene utilizzata per i metodi COPY e MOVE (https://tools.ietf.org/html/rfc2518#page-54). Se serviamo SSL/TLS con nginx e usiamo Apache con mod_dav_svn come backend, quest'ultimo non sa dell'URI https: //. Con questo snippet, eliminiamo le s dall'https nell'intestazione Destination per far corrispondere ciò che Apache/Subversion sta servendo. L'intestazione Host è impostata sul valore HTTP_HOST originale del client. – Clemens

+0

Grazie amico – bviktor

Problemi correlati