haproxy + stunnel + keep-alive?
Я хотел бы поставить stunnel перед haproxy 1.4 для обработки трафика HTTPS. Мне также нужен stunnel для добавления заголовка X-Forwarded-For. Это может быть достигнуто с помощью патчей stunnel-4.xx-xforwarded-for.diff с веб-сайта haproxy.
Тем не менее, описание упоминает:
Обратите внимание, что этот патч не работает с keep-alive,...
Мой вопрос: что это будет означать на практике для меня? Я не уверен,
- если речь идет о поддержании жизни между
- клиент и stunnel
- Stunnel и haproxy
- или хакрокси и бэкэнд сервер?
- что это означает для производительности: если у меня есть 100 значков на веб-странице, придется ли браузеру согласовывать 100 полных соединений SSL или он может повторно использовать соединение SSL, просто создавая новые соединения TCP?
4 ответа
Это касается поддержки HTTP, которая позволяет нескольким запросам ресурсов проходить через один сеанс TCP (и, с SSL, один сеанс SSL). Это очень важно для производительности сайта SSL, так как без поддержки активности для каждого запрашиваемого ресурса потребуется рукопожатие SSL.
Таким образом, проблема заключается в одном большом сеансе поддержки активности от клиента до внутреннего сервера. Это важно для производительности, и, разумеется, для современных HTTP-серверов, но этот патч говорит, что не поддерживает его. Давайте посмотрим, почему..
Сеанс keep-alive - это просто больше запросов один за другим - как только сервер заканчивает свой ответ на один запрос, сервер не отправляет FIN
пакет для завершения сеанса TCP; клиент может просто отправить другую партию заголовков.
Чтобы понять, что делает этот патч, вот пример поддерживающего разговора:
Клиент:
GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...
Сервер:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>
Вот где прервется не поддерживающая связь связь. Но keep-alive позволяет клиенту просто запустить другой:
GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...
Для идентификатора клиента в прокси, некоторые обратные прокси могут добавить в X-Forwarded-For
заголовок в каждом клиентском запросе. Это сообщает вышестоящему серверу, откуда поступает запрос (вместо каждого запроса, инициируемого с IP-адреса обратного прокси-сервера), для обеспечения безопасности при ведении журнала и других потребностях приложений.
X-Forwarded-For
заголовок должен быть введен в каждый запрос ресурса клиента, отправляемый через соединение keep-alive, поскольку полные заголовки отправляются каждый раз; обработка X-Forwarded-For
заголовок и перевод в него, являющийся "реальным" запросом IP, делается для каждого запроса, а не для каждого TCP-keep-alive-session. И, может быть, есть какое-то отличное программное обеспечение обратного прокси, которое использует один сеанс keep-alive для обслуживания запросов от нескольких клиентов.
Вот где этот патч не работает.
Патч на этом сайте отслеживает буфер сеанса TCP для конца первого набора заголовков HTTP в потоке и вставляет новый заголовок в поток после окончания этого первого набора заголовков. После того, как это сделано, он считает X-Forwarded-For
задание выполнено, и прекращается сканирование для конца новых наборов заголовков. Этот метод не знает о всех будущих заголовках, поступающих через последующие запросы.
Не могу их винить; Stunnel на самом деле не был создан для обработки и перевода содержимого своих потоков.
Эффект, который это будет иметь в вашей системе, заключается в том, что первый запрос потока поддержки активности получит X-Forwarded-For
заголовок введен правильно, и все последующие запросы будут работать нормально, но у них не будет заголовка.
Если не существует другого патча для внедрения заголовка, который может обрабатывать несколько клиентских запросов на соединение (или его можно настроить с помощью наших друзей в Stack Overflow), вам, возможно, придется поискать другие варианты для завершения SSL.
STunnel 4.45 исправляет это должным образом, используя некоторые новые возможности (протокол прокси), поставляемые с HAProxy 1.15
- http://stunnel.mirt.net/pipermail/stunnel-announce/2011-October/000062.html
- http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt
Это также исправляет проблемы с предыдущими исправлениями и Keep Alive
Подобно тому, что я опубликовал в другой теме, HAProxy поддерживает собственный SSL с обеих сторон, начиная с 1.5-dev12. Таким образом, имея X-Forwarded-For, HTTP keep-alive, а также заголовок, сообщающий серверу о том, что соединение было установлено через SSL, так просто:
listen front
bind :80
bind :443 ssl crt /etc/haproxy/haproxy.pem
mode http
option http-server-close
option forwardfor
reqadd X-Forwarded-Proto:\ https if { is_ssl }
server srv1 1.1.1.1:80 check ...
...
Это намного проще, чем исправление stunnel, и намного лучше, чем отказ от поддержки.
Расширяя отличный ответ от Шейна, вы можете использовать Nginx в качестве терминатора SSL перед HAproxy. Он правильно обрабатывает keep-alive между клиентом и nginx, который является наиболее чувствительной к задержке стороной, и создает новое соединение с бэкендом для каждого клиентского запроса, отправляя X-FORWARDED-FOR в каждом из них.