2010-03-19 2 views
7

Nginx 프록시 뒤에 SSL을 사용하여 Apache + Subversion을 실행하는 데 문제가 있습니다. 누군가 답변을 얻길 기대합니다. 나는 내 문제에 대한 해답을 찾는 몇 시간 동안 구글을 샅샅이 뒤졌고 그것을 이해하지 못한 것처럼 보였다. 내가보고있는 것은 "502 (잘못된 게이트웨이)"오류입니다. 전복을 사용하여 이동하거나 복사하려고하면 오류가 발생합니다. 그러나 체크 아웃과 커밋은 잘 작동합니다.502 잘못된 게이트웨이 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; 
     } 
} 

아파치

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> 

: 여기에 관련 부분 (내가 생각하는)의의 nginx와 아파치 설정 문제의 파일은 이 문제는 서버 이름이 apache 서버와 nginx 서버에서 일치해야합니다. 또한이 문제는 http 만 사용하도록 구성을 변경하더라도 해결되지 않는 것처럼 보입니다.

답변

1

내 문제의 원인은 nginx와 apache 사이의 프록시가 아니라 Apache 자체의 문제임을 알게되었습니다.

원래 질문에서 언급하지 않은 내용은 # Some config omitted에 있었던 내용이었습니다. 이 블록에는 다음이 포함되어 있습니다.

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

suberversion의 경우, Redmine's 인증 처리기를 사용하여 사용자 액세스를 제어하고 있습니다. 옵션을 켜고 끄고 문제의 범위를 좁히고 나면, 그 인증 모듈이 스레드로부터 안전하지 않다는 것을 알게되었습니다. 아파치가 Worker MPM을 사용했기 때문에 오류가 발생했습니다. Prefork MPM (우분투의 sudo aptitude install apache2-mpm-prefork)으로 전환하면 문제가 해결되었습니다.

이전 솔루션은 나를 위해 작동하지 않았다
8

오늘이 정확한 문제에 직면했습니다.

추가하여 아파치 구성 다음 것은 고정 :

RequestHeader edit Destination ^https http early

건배
  이그나 M


자료 :

+0

내가 시도했다 그 과거에,하지만 생각 그것은 다시 한 번 가치가 있었다. 불행히도 나를 위해, 그 트릭을하지 않았다. –

+0

'sudo a2enmod headers'를 실행해야만했습니다. –

+0

이 줄을 추가했지만 몇 년 동안 작동하지 않습니다. 오늘 나는이 줄을 제거하고 지금 작동한다 – marstone

7

, 나는 proxy_pass 지시하기 전에, 상기 location 블록에서 다음의 nginx 구성을 변경하고 추가했다 :

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

이것은 작동하지만이 코드가 실제로하는 일을 설명해 주시겠습니까? – bviktor

+0

대상 헤더는 COPY 및 MOVE 메서드 (https://tools.ietf.org/html/rfc2518#page-54)에 사용됩니다. nginx를 사용하여 SSL/TLS를 제공하고 mod_dav_svn과 함께 Apache를 백엔드로 사용하는 경우 후자는 https : // URI에 대해 알지 못합니다. 이 스 니펫을 사용하여 Apache/Subversion이 제공하는 것과 일치하도록 대상 헤더의 https에서 s를 제거합니다. Host 헤더는 클라이언트의 원래 HTTP_HOST 값으로 설정됩니다. – Clemens

+0

고맙습니다. – bviktor

관련 문제