Apache 2.2: RewriteMap, интерполяция ProxyPass и Активный

У меня есть Apache httpd используемый в качестве frontend прокси реверса SSL для большого количества бэкендов. Я вычисляю название бэкенда от пути, данного пользователем. например: https://myhostname.com/myaccount переводит в http://myaccount.myhostname.com

Для этого я использую a RewriteMap и RewriteRule с [P] флаг на. Все хорошо работает.

Однако мне теперь нужно постоянное соединение между обратным прокси и бэкендом. Я хорошо знаю, что активный не работает с RewriteRule [P] (http://httpd.apache.org/docs/current/en/rewrite/flags.html#flag_p - производительность, предупреждающая) поэтому, я пытался использовать ProxyPass и интерполяция переменной среды, чтобы сделать работу. Я получил a RewriteRule это не делает ничего кроме сохранения результата карты в переменную среды и затем звонит ProxyPass использование этой переменной.

RewriteMap mymap prg:/path/to/my/map
RewriteCond %{REQUEST_URI} ^/([^/]+)/?.*$
RewriteCond ${mymap:%1} ^http://([^/]+/)$
RewriteRule ^/([^/]+)/?$ - [L,E=original:$1,E=rewritten:%1]

ProxyPassInterpolateEnv On
ProxyPassReverse /${original}/ http://${rewritten} interpolate

Этот результат в том же поведении как RewriteRule с [P]: проксирование в порядке, но не делайте использования http активный.

Я попробовал это трудно кодированным именем хоста вместо использования ${rewritten} (но хранение ${original}) и наблюдаемый, что это - часть, которые делают Apache, создающий новое соединение вместо того, чтобы снова использовать существующее.

Эта ошибка: https://issues.apache.org/bugzilla/show_bug.cgi? id=43308 поднимает тот же вопрос, и предложите патч, который может решить мою проблему.

Однако я хотел знать, была ли у кого-либо идея решить это различным/лучше способом.

2
задан 30 January 2013 в 16:26
1 ответ

При использовании флага [P] в RewriteRule для прокси-сервера вы обычно можете использовать директиву ProxySet для установки опций, обычно настраиваемых через ProxyPass.

Но в этом случае у вас нет конкретного URL прокси-сервера, который нужно сконфигурировать. Если вы только проксируете учетные записи пользователей, вы можете сделать что-то вроде:

ProxyPassMatch /\w+/ http://$1.myhostname.com/ keeplive=on

Хотя из вашего примера кажется, что возможно используются разные домены (отсюда и использование RewriteMap).

Или же, другая мысль, которая только что возникла, может сработать, используя следующее (непроверенное):

<Proxy *>
    ProxySet keepalive=on
</Proxy>
0
ответ дан 3 December 2019 в 15:32

Теги

Похожие вопросы