Apache 2.2: RewriteMap, интерполяция ProxyPass и Keep-Alive
У меня есть Apache httpd, используемый в качестве интерфейса обратного прокси-сервера SSL для многих бэкэндов. Я вычисляю имя бэкэнда по пути, указанному пользователем. например: https://myhostname.com/myaccount
переводит на http://myaccount.myhostname.com
Для этого я использую RewriteMap
а также RewriteRule
с [P]
флаг включен. Все отлично работает
Однако теперь мне нужно постоянное соединение между обратным прокси и бэкэндом. Я хорошо знаю, что поддержка активности не работает с RewriteRule
"s [P]
( http://httpd.apache.org/docs/current/en/rewrite/flags.html - предупреждение о производительности), поэтому я попытался использовать ProxyPass
и интерполяция переменных среды для выполнения работы. Я получил 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 keep-alive.
Я попробовал это с жестко заданным именем хоста вместо ${rewritten}
(но сохраняя ${original}
) и заметил, что это та часть, которая заставляет Apache создавать новое соединение вместо повторного использования существующего.
Эта ошибка: https://issues.apache.org/bugzilla/show_bug.cgi?id=43308 поднимает ту же проблему и предлагает патч, который может решить мою проблему.
Тем не менее, я хотел знать, есть ли у кого-нибудь идея решить эту проблему другим / лучшим способом.
1 ответ
При использовании флага [P] в RewriteRule
для прокси, вы обычно сможете использовать ProxySet
директива для установки параметров, обычно настраиваемых через ProxyPass
,
Но в этом случае у вас нет конкретного URL прокси для настройки. Если вы используете только прокси-серверы, вы можете сделать что-то вроде:
ProxyPassMatch /\w+/ http://$1.myhostname.com/ keeplive=on
Хотя из вашего примера кажется, что могут использоваться разные домены (следовательно, использование RewriteMap
).
В качестве альтернативы, еще одна мысль, которая только что возникла, может работать следующим образом (не проверено):
<Proxy *>
ProxySet keepalive=on
</Proxy>