2016-08-11 9 views
0

У меня есть HaProxy, завершающий SSL и передающий запросы обратно в лак, который затем обслуживает кэшированную страницу или запросы от Nginx. Тем не менее, Varnish, похоже, обрабатывает запрос от HaProxy как HTTP/1, а не HTTP/2 и не может служить.Использовать протокол прокси-протокола 1

я могу видеть в Nginx входит следующее, когда я пытаюсь попасть на страницу:

" while reading PROXY protocol, client: 127.0.0.1, server: 127.0.0.1:8181 
2016/08/11 06:53:31 [error] 5682#0: *1 broken header: "GET/HTTP/1.1 
Host: www.example.com 
User-Agent: curl/7.50.2-DEV 
Accept: */* 
X-Forwarded-For: IP_Removed 
Accept-Encoding: gzip 
X-Varnish: 32777 

Я нашел то, что относится к этому here в котором говорится, что причиной этого является то, что Nginx не работать с v2 PROXY только v1. Таким образом, в результате этого я принудительно использовал протокол 1 в HaProxy, используя переключатель send-proxy, а не send-proxy-v2. Но когда он доходит до Лака, я думаю, что Varnish каким-то образом преобразует это в протокол 2, который заставляет его некорректно общаться с Nginx.

Я удалил Лак из уравнения и связал HaProxy напрямую с Nginx, и он отлично работает через HTTP/2. Проблема заключается в том, что что-то происходит в стеке Varnish, и вероятным подозреваемым является прокси-протокол v2, используемый лаком.

Итак, чтобы сократить длинную историю, как я могу заставить Лак придерживаться PROXY1, а не протокола PROXY2? Я попытался добавить PROXY1 в параметры запуска, но Varnish этого не примет. Любая помощь приветствуется. Благодаря!

UPDATE - Я проверил HaProxy> Nginx с переключателем send-proxy-v2 на бэкэнд HaProxy, и это вызывает ту же проблему, когда в стек попадает Varnish. Проблема с возвратом в send-proxy на HaProxy устраняет проблему. Итак, я убежден, что проблема заключается в использовании лака с использованием протокола 2, а не протокола 1. Но как сказать это не так?

+0

Вы уверены, что вы говорите о HTTP/2? Это не связано с протоколом PROXY v2. Лак не говорит HTTP/2, это будет в Varnish 5.x. –

+0

Возможно, я запутался, но я понимаю, что HaProxy работает как TCP не HTTP при работе с HTTP/2, поэтому необходимо использовать send-proxy с бэкэнд. Nginx настроен на получение этого с помощью переключателя proxy_protocol. Я понимаю, что Varnish не HTTP/2 или не SSL, но он должен передавать протокол обратно, как и Nginx no? – d1ch0t0my

ответ

1

Я понимаю, что Лак не является HTTP/2 или SSL, но он должен передавать протокол так же, как Nginx no?

No.

Но первый, давайте проясним. Протоколы HTTP/2 и Proxy V2 не имеют абсолютно никакого отношения друг к другу. Удалите HTTP/2 из своего ума, так как это не применимо здесь ни в каком смысле.

Ваш вопрос, по сути, это:

Если HAProxy посылает прокси-протокол V1 лакировать и Nginx настроен за Varnish ожидать прокси-протокола V1, почему Nginx жалуются на сломанные заголовки? Не поддерживает ли Varnish протокол прокси-протокола V1 на бэкэнд? По какой-то причине отправляет Proxy Protocol V2?

И ответ на этот вопрос заключается в том, что Лак не посылает ни один. Ни V1, ни V2.

Единственное, что вам нужно для протокола прокси-протокола, это то, что компонент, поддерживающий HTTP, может получать IP-адрес (и порт) клиента от компонента, не относящегося к HTTP-протоколу, например HAProxy, с использованием mode tcp или Amazon ELB с прослушивателем в режиме TCP, любой из которых обычно выполняет разгрузку SSL для вас, а не маршрутизацию HTTP-запросов, поэтому ему нужен альтернативный механизм передачи адреса клиента.

Первый компонент, поддерживающий HTTP-интерфейс, может принимать этот адрес и устанавливать его в заголовке HTTP, обычно X-Forwarded-For, в интересах остальных компонентов в стеке. Таким образом, нет никаких оснований для того, чтобы Varnish пересылал протокол Proxy.Это не делает этого в вашем примере, и нет очевидной причины, по которой Varnish будет даже способен пересылать протокол Proxy. ¹

И это приводит нас к ошибке. Вы неправильно определяете проблему, о которой сообщает Nginx. Поврежденная ошибка заголовка означает, что Nginx получает что-то другое, кроме протокола V1 прокси. С помощью лака в цикле нет заголовка протокола Proxy ², присутствующего вообще в запросе Nginx, и когда слушатель настроен на ожидание заголовка протокола Proxy, этот заголовок обязательно.

Если компонент настроен на ожидающий прокси-протокол V1 и его нет, то есть всегда. Но «нет» означает именно это. Заголовок V1 отсутствует. Это не значит, что V2 есть. Это не так.

Итак, я убежден, что этот вопрос Varnish с использованием протокола 2, а не протокол 1.

Вы убедили себя неправильно. Proxy V2 в Nginx - как вы пробовали с HAProxy - это ошибка, и ни один прокси-протокол прокси-сервера вообще - как вы видите из Varnish - это ошибка, как объяснялось выше. Оба являются неправильными конфигурациями, хотя и другого типа. То, что вы здесь сделали, дублирует ошибку, но по совершенно другой причине.

Если вы отправляете все запросы через Varnish, тогда настройте Larnish для установки X-Forwarded-For в перенаправленном запросе, используя информацию, которую он узнает из входящего протокола прокси-протокола mesaage. Удалите протокол прокси из конфигурации Nginx.

Или настройте HAProxy для работы в режиме HTTP и пусть он вставляет заголовок, используя option forwardfor.


¹ Очевидно, что от ошибки, Varnish просто посылая обычные HTTP заголовки - ничего, что выглядит как протокол прокси. Я не думаю, что он даже поддерживает возможность отправки протокола Proxy на исходный сервер, но кто-то говорит что-то, если я упустил эту возможность.

² Я бы сказал, что заголовок протокола прокси-сервера неправильно называется заголовком, учитывая то, что это подразумевает. Это преамбула, а не заголовок, хотя, к сожалению, он был назван «заголовком» в стандарте. Это, безусловно, не заголовок HTTP.

0

При обновлении Varnish до 5.0 может отправить PROXY протокол версии 1 к NGINX, установив».proxy_header = 1"

Смежные вопросы