У нас довольно типичная настройка: клиент <-> apache2 (2.2.22) <-> backend (*).
Изначально мы использовали mod_rewrite с флагом [P] в простейшей форме:
<VirtualHost *:80>
RewriteEngine On
ProxyPreserveHost On
RewriteRule ^(.*)$ http://localhost:8081$1 [P,L]
</VirtualHost>
Однако при использовании этой настройки, даже когда клиенты использовали соединения keep-alive и отправляли несколько HTTP-запросов, используя одно TCP-соединение с apache, apache создавал новое TCP-соединение с серверной частью для запроса охвата.
Я решил попробовать вместо этого напрямую использовать mod_proxy:
ProxyPreserveHost On
ProxyPass / http://localhost:8081/
И, к моему удивлению, теперь повторно используются TCP-соединения между apache и серверной частью (что было моей первоначальной целью).
Это почему? Есть ли что-то в mod_rewrite для настройки для включения соединений с поддержкой поддержки активности?
(*) Бэкэнд на самом деле представляет собой haproxy <-> несколько серверов приложений, но я не думаю, что здесь это имеет значение.
mod_proxy
делает пул соединений. mod_rewrite
нет.
Вы жестяная банка используйте http keep alive, даже если вы выполняете обратный прокси-сервер с помощью перезаписи, вам просто нужно установить keepalive
к On
через ProxySet
директива вроде этой:
<Proxy "http://backend">
ProxySet keepalive=On
</Proxy>
Источник: https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxyset
Использование пары фиктивных директив ProxyPass, как описано в http://www.gossamer-threads.com/lists/apache/users/336740 позволяет использовать пул соединений с RewriteRule.