背景
我有四台 Windows 服务器,运行 Server 2012 R2,每台运行 Apache 2.4。它们被安排成两对负载平衡的 Web 服务器,第一对面向 Internet,第二对位于 LAN 内。有一个传入防火墙规则允许从第一个到第二个的端口 80 流量用于 API 请求。
我也在局域网中运行 Tableau Server 可视化软件,我目前的任务是将通过两组 Web 服务器的流量代理到 Tableau。我在外部 Web 服务器上使用这些规则:
/tableau-proxy/* : proxy to the inner web server
/* : run a web app that carries Tableau content
在内部网络服务器上,我使用这些规则:
/tableau-proxy/* : proxy to Tableau and strip off the /tableau-proxy prefix
/* : run an API app
对于这两组规则,我使用mod_proxy
,mod_proxy_http
和mod_rewrite
. 代理本身正在工作;例如,图像请求可以从 Internet 一路传输,从两个 Web 服务器反弹,登陆 Tableau,然后以 PNG 数据的形式传回给用户。
内容重写问题
这个问题的最后 5% 是重写从 Tableau 返回的 HTML 链接,以便恢复代理子目录前缀。这是在 LAN 端/内部 Web 服务器上。我使用的规则是这样的:
/ -> /tableau-proxy
我正在尝试使用mod_proxy_html
它,但是使用我正在使用的配置,我得到一个空白页。有趣的是,它的响应代码为 200,因此调试起来有点困难。
配置
我正在使用的配置是这样的:
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule xml2enc_module modules/mod_xml2enc.so
Include conf/extra/proxy-html.conf
<Directory "C:\Apache24\htdocs\public\tableau-proxy">
LogLevel alert rewrite:trace2 proxy_html:trace2
# Proxy requests to the Tableau LB
RewriteEngine on
# Here is a test Tableau server
RewriteRule (.*) http://tabtest/$1 [P]
# Don't make the x-forwarded-for header a list of proxy hops!
# That will break redirects in Tableau
ProxyAddHeaders Off
ProxyHTMLExtended Off
xml2EncDefault utf-8
LogLevel debug
ProxyHTMLEnable On
ProxyHTMLURLMap / /tableau-proxy
</Directory>
我还尝试在文档返回代理路径时保留文档的字符集:
ProxyHTMLCharsetOut *
这似乎没有什么区别,并导致:
信息:从 HTTP 标头获取字符集 utf-8
错误:无效参数:[客户端:IP] AH01427:xml2enc:不支持字符集 utf-8
(什么,它不支持 UTF-8?)
我尝试过使用不同的 HTML 文档类型,同样没有任何变化:
ProxyHTMLDoctype XHTML Legacy
我尝试将代理 HTML 模块添加为过滤器,以防万一这比ProxyHTMLEnable On
, 再次无济于事:
SetOutputFilter proxy-html
我在网上看到了一些零星的报告,其他人遇到了这个问题,上面的一些额外项目代表我尝试了一些建议的解决方案,但空白页仍然存在。接下来我可以尝试什么?
我发现了一个解决方案。Tableau 包使用 Apache 来提供内容,因此它能够从检测客户端可接受的编码格式中受益。一位同事建议,可能是 HTML 链接重写在压缩内容上令人窒息,事实证明这是正确的。
因此,我曾经
mod_headers
关闭压缩,因此:我的感觉是,这不是 Tableau 的问题。我认为问题出在 Apache 代理中,并且压缩内容令人窒息。我在网络上的其他地方看到有些人正在将 decompress-modify-recompress 过滤器添加到他们的代理配置中,大概是为了处理这个确切的问题,但这对我不起作用(诚然,我并没有长时间坚持这一查询)。
因此,这是一种解决方法,尽管对我们来说是一个非常可接受的解决方法。我可能会尝试重新审视这一点以使压缩再次起作用。