我有一个 Apache httpd,用作许多后端的 SSL 反向代理前端。我从用户提供的路径计算后端的名称。例如:https://myhostname.com/myaccount
转换为http://myaccount.myhostname.com
为此,我使用了带有标志的RewriteMap
and 。一切正常。RewriteRule
[P]
但是我现在需要反向代理和后端之间的持久连接。我很清楚 keep-alive 不适用于RewriteRule
's [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提出了同样的问题并提出了可能解决我的问题的补丁。
不过,我想知道是否有人有想法以不同/更好的方式解决这个问题。
答案1
当在代理中使用 [P] 标志时RewriteRule
,您通常可以使用ProxySet
指令来设置通常通过配置的选项ProxyPass
。
但在这种情况下,您没有要配置的特定代理 URL。如果您仅有的代理用户帐户,你可以执行以下操作:
ProxyPassMatch /\w+/ http://$1.myhostname.com/ keeplive=on
尽管从您的例子来看,似乎可能使用了不同的域(因此使用RewriteMap
)。
或者,刚刚想到的另一种方法可能是使用以下内容(未经测试):
<Proxy *>
ProxySet keepalive=on
</Proxy>