かなり典型的なセットアップがあります:クライアント<-> Apache2(2.2.22)<->バックエンド(*)。
最初は、最も単純な形式で[P]フラグを指定してmod_rewriteを使用していました。
<VirtualHost *:80>
RewriteEngine On
ProxyPreserveHost On
RewriteRule ^(.*)$ http://localhost:8081$1 [P,L]
</VirtualHost>
ただし、この設定を使用すると、クライアントがキープアライブ接続を使用し、Apacheへの1つのtcp接続を使用して複数のhttp要求を送信していた場合でも、Apacheはリーチ要求のためにバックエンドへの新しいtcp接続を作成していました。
代わりに、mod_proxyを直接使用してみることにしました。
ProxyPreserveHost On
ProxyPass / http://localhost:8081/
そして驚いたことに、Apacheとバックエンド間のtcp接続が再利用されました(これが私の最初の目標でした)。
何故ですか?キープアライブバックエンド接続を有効にするように構成するmod_rewriteに何かがありますか?
(*)バックエンドは実際にはhaproxy <->複数のアプリサーバーですが、ここでは重要ではないと思います。
mod_proxy
接続プーリングを行います。 mod_rewrite
しません。
書き換えによってリバースプロキシを実行する場合でも、canは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
http://www.gossamer-threads.com/lists/Apache/users/33674 で説明されているように、ダミーのProxyPassディレクティブのペアを使用すると、RewriteRuleで接続プールを使用できます。