Назад | Перейти на главную страницу

Apache 2.2: RewriteMap, интерполяция ProxyPass и Keep-Alive

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

Для этого я использую RewriteMap и RewriteRule с участием [P] флаг включен. Все нормально работает.

Однако теперь мне нужно постоянное соединение между обратным прокси и сервером. Я прекрасно понимаю, что keep-alive не работает с RewriteRuleс [P] (http://httpd.apache.org/docs/current/en/rewrite/flags.html#flag_p - предупреждение о производительности), поэтому я попытался использовать 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 поднимает ту же проблему и предлагает патч, который может решить мою проблему.

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

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

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

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

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

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

<Proxy *>
    ProxySet keepalive=on
</Proxy>