У меня есть проблема рабочий Apache + Подверсия с SSL позади прокси Nginx, и я надеюсь, что у кого-то мог бы быть ответ. Я обыскивал Google в течение многих часов, ища решение моей проблемы и, может казаться, не понимаю это. Что я вижу, "502 (Недопустимый шлюз)" ошибки при попытке ПЕРЕМЕСТИТЬ или СКОПИРОВАТЬ подверсию использования; однако, контроль и фиксации хорошо работают. Вот соответствующие части (я думаю) nginx и апачских рассматриваемых файлов конфигурации:
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>
Из того, что я мог сказать при исследовании этой проблемы, имя сервера должно соответствовать на обоих апачскому серверу, а также nginx серверу, который я сделал. Кроме того, эта проблема, кажется, слоняется поблизости, даже если я изменяю конфигурацию для использования http только.
Я выяснил, что причиной моей проблемы был не прокси между 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
Для субверсии я контролирую доступ пользователей, используя обработчик аутентификации Redmine. После включения и выключения опций и сужения проблемы я узнал, что их модуль аутентификации не является потокобезопасным. Я столкнулся с этой ошибкой, потому что Apache использовал Worker MPM. Переключение на Prefork MPM (sudo aptitude install apache2-mpm-prefork
в Ubuntu) решило проблему.
Сегодня я столкнулся именно с этой проблемой.
Добавление следующего в конфигурацию apache2 исправило это:
RequestHeader edit Destination ^ https http early
Ура,
Ignace M
Источник: