Назад | Перейти на главную страницу

Балансировка нагрузки с помощью haproxy и хоста http-send-name-header

Я столкнулся со следующей проблемой:

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.