У меня есть 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>