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>
Другие вопросы по тегам