2010-03-19 41 views
7

Tôi đang gặp sự cố khi chạy Apache + Subversion với SSL phía sau proxy Nginx và tôi hy vọng ai đó có thể có câu trả lời. Tôi đã lùng sục google trong nhiều giờ tìm kiếm câu trả lời cho vấn đề của tôi và dường như không thể tìm ra câu trả lời. Những gì tôi thấy là lỗi "502 (Cổng xấu)" khi cố gắng MOVE hoặc COPY bằng cách sử dụng lật đổ; tuy nhiên, việc kiểm tra và cam kết hoạt động tốt. Sau đây là các bộ phận liên quan (tôi nghĩ) của nginx và apache cấu hình tập tin trong câu hỏi:502 Cổng xấu với 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> 

Từ những gì tôi có thể nói trong khi nghiên cứu vấn đề này, tên máy chủ phải phù hợp trên cả máy chủ apache cũng như máy chủ nginx, mà tôi đã thực hiện. Ngoài ra, vấn đề này dường như dính xung quanh ngay cả khi tôi thay đổi cấu hình để chỉ sử dụng http.

Trả lời

1

Tôi phát hiện ra rằng nguyên nhân của vấn đề của tôi không phải là proxy giữa nginx và apache, mà đúng hơn là một vấn đề với chính Apache.

Điều tôi không đề cập trong câu hỏi ban đầu là gì trong số # Some config omitted. Khối này chứa các thông tin sau:

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

Để lật đổ, tôi đang kiểm soát quyền truy cập của người dùng bằng cách sử dụng Redmine's trình xử lý xác thực. Sau khi bật và tắt các tùy chọn và thu hẹp sự cố, tôi đã biết rằng mô-đun xác thực của chúng không an toàn. Tôi đã chạy vào lỗi vì Apache đã sử dụng MPM của công nhân. Chuyển sang MPM Prefork (sudo aptitude install apache2-mpm-prefork trong Ubuntu) đã giải quyết được vấn đề.

8

Tôi đã gặp sự cố chính xác này ngay hôm nay.

Thêm sau trong cấu hình apache2 cố định nó:

RequestHeader edit Destination ^https http early

Chúc mừng,
  Ignace M


Nguồn:

+0

Tôi đã cố gắng rằng trong quá khứ, nhưng figured nó đáng giá một lần nữa. Thật không may cho tôi, điều đó đã không làm các trick. –

+0

Tôi đã phải chạy 'sudo a2enmod tiêu đề', sau đó nó đã làm việc tuyệt vời! –

+0

tôi đã thêm dòng này nhưng nó không hoạt động trong nhiều năm. hôm nay tôi loại bỏ dòng này và nó hoạt động ngay bây giờ – marstone

7

Các giải pháp trước đó không làm việc cho tôi, tôi đã phải thay đổi cấu hình nginx và thêm dòng sau trong khối location, trước khi proxy_pass chỉ:

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

Tính năng này hoạt động nhưng bạn vui lòng giải thích mã này thực sự làm gì không? – bviktor

+0

Tiêu đề Đích được sử dụng cho các phương thức COPY và MOVE (https://tools.ietf.org/html/rfc2518#page-54). Nếu chúng tôi phục vụ SSL/TLS với nginx và sử dụng Apache với mod_dav_svn làm phụ trợ, thì sau này không biết về https: // URI. Với đoạn mã này, chúng tôi tách các s khỏi https trong tiêu đề Đích để khớp với những gì Apache/Subversion đang phân phối. Tiêu đề Máy chủ được đặt thành giá trị HTTP_HOST ban đầu từ ứng dụng khách. – Clemens

+0

Cảm ơn bạn rất nhiều – bviktor

Các vấn đề liên quan