带有nginx + apache + subversion + ssl的502 Bad Gateway(SVN COPY)

时间:2010-03-19 17:33:16

标签: svn apache ssl nginx

我在使用Nginx代理后面的SSL运行Apache + Subversion时出现问题,我希望有人可能有答案。我已经搜索谷歌几个小时寻找我的问题的答案,似乎无法搞清楚。我在使用subversion尝试移动或复制时看到的是“502(Bad Gateway)”错误;但是,结帐和提交工作正常。以下是有问题的nginx和apache配置文件的相关部分(我认为):

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>

从研究这个问题我可以看出,服务器名称必须在apache服务器和nginx服务器上匹配,我已经完成了。此外,即使我将配置更改为仅使用http,此问题似乎仍然存在。

4 个答案:

答案 0 :(得分:8)

我今天遇到了这个问题。

在apache2配置中添加以下内容修复它:

RequestHeader edit Destination ^https http early

干杯,
Ignace M


来源:

答案 1 :(得分:7)

之前的解决方案对我不起作用,我必须更改nginx配置并在location块中添加以下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;

答案 2 :(得分: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身份验证处理程序控制用户访问。在打开和关闭选项并缩小问题范围后,我了解到他们的身份验证模块不是线程安全的。我遇到了错误,因为Apache正在使用Worker MPM。切换到Prefork MPM(Ubuntu中的sudo aptitude install apache2-mpm-prefork)解决了这个问题。

答案 3 :(得分:0)

在我的情况下,我使用的是 RouixSVN ,我只需清除计算机上的SVN 身份验证数据,然后再次登录并有效。希望对别人有帮助。