![mod_rewrite+proxy 关闭与后端的连接(keepalive)](https://linux22.com/image/594724/mod_rewrite%2Bproxy%20%E5%85%B3%E9%97%AD%E4%B8%8E%E5%90%8E%E7%AB%AF%E7%9A%84%E8%BF%9E%E6%8E%A5%EF%BC%88keepalive%EF%BC%89.png)
我们有一个相当典型的设置:客户端<-> apache2(2.2.22)<-> 后端(*)。
最初我们以最简单的形式使用带有 [P] 标志的 mod_rewrite:
<VirtualHost *:80>
RewriteEngine On
ProxyPreserveHost On
RewriteRule ^(.*)$ http://localhost:8081$1 [P,L]
</VirtualHost>
但是使用这种设置,即使客户端使用保持活动连接并使用一个 tcp 连接向 apache 发送多个 http 请求,apache 也会创建一个到后端的新 tcp 连接以接收请求。
我决定尝试直接使用 mod_proxy:
ProxyPreserveHost On
ProxyPass / http://localhost:8081/
令我惊讶的是,现在 apache 和后端之间的 tcp 连接被重新使用了(这是我最初的目标)。
这是为什么?mod_rewrite 中是否有可以配置的内容来启用 keepalive 后端连接?
(*) 后端实际上是 haproxy <-> 多个应用服务器,但我认为这里并不重要。
答案1
mod_proxy
是否有连接池。mod_rewrite
否。
答案2
你能即使通过重写进行反向代理,也使用 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
答案3
使用一对虚拟 ProxyPass 指令,如中所述http://www.gossamer-threads.com/lists/apache/users/336740允许使用带有 RewriteRule 的连接池。