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

mod_rewrite + прокси закрывает подключения к бэкэнду (keepalive)

У нас довольно типичная настройка: клиент <-> 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.