Apache 2.2:RewriteMap、ProxyPass 插值和 Keep-Alive

Apache 2.2:RewriteMap、ProxyPass 插值和 Keep-Alive

我有一个 Apache httpd,用作许多后端的 SSL 反向代理前端。我从用户提供的路径计算后端的名称。例如:https://myhostname.com/myaccount转换为http://myaccount.myhostname.com

为此,我使用了带有标志的RewriteMapand 。一切正常。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>

相关内容