У меня есть 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 поднимает тот же вопрос, и предложите патч, который может решить мою проблему.
Однако я хотел знать, была ли у кого-либо идея решить это различным/лучше способом.
При использовании флага [P] в RewriteRule
для прокси-сервера вы обычно можете использовать директиву ProxySet
для установки опций, обычно настраиваемых через ProxyPass
.
Но в этом случае у вас нет конкретного URL прокси-сервера, который нужно сконфигурировать. Если вы только проксируете учетные записи пользователей, вы можете сделать что-то вроде:
ProxyPassMatch /\w+/ http://$1.myhostname.com/ keeplive=on
Хотя из вашего примера кажется, что возможно используются разные домены (отсюда и использование RewriteMap
).
Или же, другая мысль, которая только что возникла, может сработать, используя следующее (непроверенное):
<Proxy *>
ProxySet keepalive=on
</Proxy>