Я столкнулся со следующей проблемой:
tldr;
При динамической перезаписи заголовка HTTP Host с http-send-name-header Host
haproxy, похоже, испортил заголовки HTTP-ответа. Это нормально работает при использовании nginx и proxy_set_header Host $upstream_addr;
Что мне нужно, чтобы добраться до target-machine: 1234, это: Host: target-machine:1234
вместо того Host: balancer:1234
Длинная версия
У нас есть клиентская установка, в которой можно запускать только 32-битные JVM, поэтому мы создаем n экземпляров одного и того же приложения на n разных портах:
target-machine:8766
target-machine:8767
target-machine:8768
target-machine:8769
И у нас есть балансировщик, работающий на выделенном balancer
машина. Клиенты иметь быть сбалансированным на основе IP (устаревшая проблема программного обеспечения, которое мы используем).
Теперь мы подошли к самому неприятному: приложение, которое мы собираемся использовать, полагается на HTTP Host
поле заголовка, так как некоторые операции вызывают отправку внутреннего запроса. В нашей текущей настройке этот внутренний запрос поступает на балансировщик нагрузки, который, в свою очередь, отправляет его на одну из целевых машин, но обязательно на целевую машину, с которой он был создан.
Я использовал nginx с Модуль Upstream раньше (но мы больше не можем, как другой должен для этого программного обеспечения заключается в том, что сообщения HTTP не должны кэшироваться прокси-сервером, поскольку его индикатор выполнения загрузки зависит от этого (вздох...)) и может решить эту проблему, добавив: proxy_set_header Host $upstream_addr;
, но nginx не поддерживает потоковую загрузку.
Я обнаружил http-send-name-header Host
который, вероятно, делает именно то, что мне нужно (см. мой haproxy.cfg здесь), но приводит к другой проблеме, которая немедленно исчезает, когда я меняю строку на http-send-name-header $AnythingButHost
Директива добавляет правильное имя сервера в заголовок, но, похоже, мешает проксируемым запросам, поскольку причал преждевременно закрывает потоки и бросает org.mortbay.jetty.EofException
так же как . Мне нужен заголовок Host, например:
Host: target-machine:8766
вместо того
Host: balancer:8181
Для обозревателя эта проблема отображается следующим образом Скриншот (размер отправленного содержимого отличается от почти полного до нескольких КБ).
Он сразу работает, если я не меняю заголовок хоста, но он работает, если я изменяю заголовок хоста на то же значение, но использую nginx.
Это действительно меня озадачивает. Если я могу помочь вам с дополнительной информацией, дайте мне знать.
Это ошибка HAProxy, исправленная в версии 1.4.23. Увидеть журнал изменений и искать http-send-name-header
чтобы увидеть исправление. Мне не удалось найти веб-страницу с ошибкой, но есть дальнейшее обсуждение в списке рассылки.
Также есть патч для 1.4.