У меня есть четыре сервера Windows, на которых запущен Server 2012 R2, на каждом из которых запущен Apache 2.4. Они разделены на две пары веб-серверов с балансировкой нагрузки, первая пара обращена к Интернету, а вторая пара - к локальной сети. Существует правило входящего брандмауэра, разрешающее трафик порта 80 с первого на второй для запросов API.
Я также запускаю программное обеспечение визуализации Tableau Server в локальной сети, и моя текущая задача - проксировать трафик через два набора веб-серверы в Tableau. Я использую эти правила на внешнем веб-сервере:
/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
. Само проксирование работает; например, запрос изображения может передаваться из Интернета, отскакивать от двух веб-серверов, попадать на Tableau, а затем передаваться обратно пользователю в виде данных PNG.
Последние 5% этой проблемы заключаются в перезаписи HTML-ссылок, возвращаемых из Tableau, так что префикс подкаталога прокси восстанавливается. Это на стороне LAN / внутренних веб-серверах. Я использую следующее правило:
/ -> /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 *
Это, похоже, не имеет значения, и в результате:
Информация: Получена кодировка utf-8 из заголовков HTTP
Ошибка: недопустимый аргумент: [клиент: IP] AH01427: xml2enc: Кодировка utf-8 не поддерживается
(Что, не t поддерживает UTF-8?)
Я пробовал экспериментировать с разными типами HTML-документов, опять же без изменений:
ProxyHTMLDoctype XHTML Legacy
Я пробовал добавить прокси-модуль HTML в качестве фильтра, на случай, если он сделает что-то большее, чем ProxyHTMLEnable На
, снова безрезультатно:
SetOutputFilter proxy-html
Я видел в сети отдельные спорадические сообщения о других людях, испытывающих эту проблему, и некоторые из дополнительных элементов выше представляют собой мои попытки некоторых предлагаемых решений, но пустая страница сохраняется. Что я могу попробовать дальше?
Я нашел решение. Пакет Tableau использует Apache для обслуживания контента, поэтому он может извлечь выгоду из определения того, какие форматы кодирования приемлемы для клиента. Коллега предположил, что, возможно, при перезаписи HTML-ссылок сжатый контент задыхался, и это оказалось правильным.
Поэтому я использовал mod_headers
, чтобы отключить сжатие, таким образом:
RequestHeader set Accept-Encoding identity
Я считаю, что это не проблема Tableau; Я думаю, что проблема в прокси-сервере Apache, который задыхается от сжатого содержимого. Я видел в другом месте в Интернете, что некоторые люди добавляют фильтры распаковки-изменения-повторного сжатия в свою конфигурацию прокси, предположительно для решения именно этой проблемы, но это не сработало для меня (по общему признанию, я не настаивал на этой линии запроса в течение длительного времени.
Итак, это обходной путь, хотя и очень приемлемый для нас. Возможно, я попытаюсь вернуться к этому, чтобы сжатие снова заработало.