У меня есть куча вопросов относительно ssl, локальных сессий и балансировки нагрузки, которые кажутся взаимосвязанными, поэтому я заранее прошу прощения за длительность этого вопроса.
У меня есть веб-сайт, который использует файловые сессии. Характер сайта заключается в том, что большинство из них http, но некоторые разделы являются ssl. В настоящее время из-за файловых сеансов необходимо, чтобы любые ssl-запросы попадали на тот же сервер, что и предыдущие HTTP-запросы.
Из-за нехватки времени я хочу сделать как можно проще, чтобы сбалансировать нагрузку и увеличить трафик http и ssl.
Кажется, есть 2 варианта алгоритмов балансировки нагрузки:
- на основе IP
- на основе куки
Решение на основе ip, вероятно, будет работать, но алгоритм хеширования потенциально изменит сервер, к которому пользователь обращается, когда сервер отключается или добавляется, что нежелательно при текущей настройке сеанса на основе файлов. Я также предполагаю, что технически возможно, что пользователь законно меняет ips при просмотре веб-сайта.
Алгоритм, основанный на cookie, кажется лучше, но неспособность проверить cookie, когда он зашифрован с помощью ssl, по-видимому, создает свои собственные проблемы.
Я гуглил примеры того, как балансировать нагрузку ssl, и я не могу найти какие-либо явные примеры установок, которые могут выполнять балансировку нагрузки на основе файлов cookie и которые могут справиться с увеличением нагрузки ssl, добавив еще один ssl-декодер.
Большинство явных примеров, которые я видел, имеют ssl-декодер (обычно аппаратный, apache_mod_ssl или nginx), расположенный между клиентом браузера и балансировщиком нагрузки. Обычно в примерах, похоже, что-то вроде этого (изменено с http://haproxy.1wt.eu/download/1.3/doc/architecture.txt ):
192.168.1.1 192.168.1.11-192.168.1.14 ------- + ----------- + ----- + ----- + ----- + | | | | | + - + - + + - + - + + - + - + + - + - + + - + - + | LB1 | | A | | Б | | C | | D | + ----- + + --- + + --- + + --- + + --- + Apache 4 дешевые веб-серверы mod_ssl HAProxy
Компонент ssl-декодирования в вышеприведенном примере представляется потенциальным узким местом, которое не масштабируется по горизонтали.
Я посмотрел на haproxy, и у него, кажется, есть опция 'mode tcp', которая позволит что-то вроде этого, что позволит вам иметь несколько ssl-декодеров:
HAProxy | ------------- | | ssl-decoder-1 ssl-decoder2 | | ------------------- | | | web1 web2 web3
Однако в такой настройке кажется, что вы потеряете ip клиента, потому что haproxy не декодирует ssl: https://cloud-support.engineyard.com/discussions/problems/335-haproxy-not-passing-x-forwarded -за
Я также посмотрел на nginx, и я также не вижу явных примеров горизонтально масштабируемых ssl-декодеров. Кажется, есть много примеров людей, имеющих nginx в качестве потенциального узкого места. И, по крайней мере, эта ссылка, по-видимому, предполагает, что nginx даже не имеет опции настройки, подобной haproxy, где вы потеряете ip, говоря, что nginx «не поддерживает прозрачную передачу TCP-подключений к бэкэнду» Как передать Apache SSL трафик через прокси nginx? ,
Вопросов:
- Почему, кажется, нет большего количества примеров установок, добавляющих больше ssl-декодеров, чтобы справиться с увеличенным трафиком?
- Не потому ли, что этап декодирования ssl является лишь теоретическим узким местом, и, фактически, одного декодера, по сути, будет достаточно, за исключением сайтов с нелепым трафиком?
- Другое возможное решение, которое приходит на ум, - возможно, у кого-либо с такими повышенными потребностями в ssl также есть централизованное хранилище сеансов, поэтому не имеет значения, какой веб-сервер клиент использует для последовательных запросов. Затем вы можете включить mod_ssl или его эквивалент на каждом веб-сервере.
- Решение haproxy, упомянутое выше, похоже, работает (помимо проблемы с IP-адресом клиента), но кто-нибудь сталкивался с программным балансировщиком нагрузки на основе липких cookie-файлов, который работал бы за счет увеличения числа декодеров при сохранении IP-адреса клиента, или, возможно, технически не возможно (потому что вы должны декодировать запрос, чтобы получить IP-адрес клиента, в этом случае мы имеем узкое место декодера).
Предполагая, что все, что я сказал, верно, это, кажется, мои варианты:
- использовать хеширование ip (плохо для пользователей, которые могут законно изменять ips, а также для сценариев добавления и удаления серверов)
- используйте nginx или mod_ssl в качестве 1-й программы, касающейся запроса ssl, это может стать потенциальным узким местом для декодирования ssl
- используйте haproxy в качестве 1-й программы, касающейся ssl-запроса, получая горизонтальную ssl-масштабируемость, но работайте без ips, зарегистрированных на уровне веб-сервера для ssl-запросов (вероятно, временно нормально)
- в долгосрочной перспективе перейдите к мобильному или централизованному хранилищу сессий, делая ненужные липкие сеансы
источник
Ответы:
Самая простая вещь, если серьезно, - это перейти в централизованное хранилище сеансов. Вы должны настроить всю эту систему с помощью балансировщиков нагрузки, haproxy, SSL и всего остального, когда каждый бит кода обработки сеанса, который я когда-либо видел, делает почти тривиальным подключение различных механизмов хранения, поэтому немного кода и очень, очень маленькая дополнительная сложность решает все ваши проблемы.
источник
Womble прав насчет общего хранилища сессий, что делает все намного проще. В дополнение к его ответу я могу немного подробнее остановиться на частях вопроса о балансировке нагрузки:
Современные многоядерные ПК могут выполнять несколько тысяч SSL-транзакций в секунду. И если это становится узким местом, то выделенное устройство от F5 , Citrix, Cisco или тому подобное может быть еще быстрее. Таким образом, большинство сайтов никогда не перерастает хорошее решение для SSL и балансировки нагрузки для одного устройства.
Существуют варианты горизонтального масштабирования дешифрования SSL, если вам это нужно.
Общий подход заключается в использовании DNS Round Robin для высокодоступных пар ускорителей SSL, то есть публикации нескольких IP-адресов для домена, причем каждый IP-адрес указывает на пару ускорителей SSL.
В этом случае вы можете беспокоиться об истечении времени ожидания TTL DNS в середине сеанса пользователя, что приводит к тому, что пользователь переходит на другой сервер приложений. Это не должно быть обычным явлением, но это может произойти. Общее хранилище сеансов является распространенным решением, но оно может быть обработано другими способами.
В качестве одного примера вы можете отделить расшифровку SSL от балансировки сервера приложений. Обработка SSL требует больше ресурсов процессора, чем базовая балансировка нагрузки, поэтому один балансировщик нагрузки должен уметь насыщать пару ускорителей SSL. Нравится:
Internet --> DNS round robin to multiple SSL accelerators --> plain HTTP to a single HTTP load balancer --> plain HTTP to multiple application servers
Как уже упоминалось в начале, общее хранилище сеансов упрощает многие вещи и почти наверняка является лучшим долгосрочным решением, чем сложность на уровне SSL / балансировки нагрузки.
источник
Интересно отвечать на 2-летние вопросы, подобные этому, когда появляются новые продукты. В настоящее время haproxy поддерживает протокол PROXY, который позволяет ему передавать IP-адрес клиента на следующий переход даже в режиме чистого TCP. Он также поддерживает собственный SSL, а также привязку к SSL, если вы хотите использовать его в качестве первого слоя перед фермой SSL (возможно, сделанной из серверов haproxy). Таким образом, кажется, что ваш запрос был немного опередил время и что реализации догнали :-)
источник
Я согласен с Womble и Джеспер здесь. Самый простой / лучший маршрут - это исправить код. Конечно, как системные администраторы, у нас часто нет такой возможности, но даже в этом случае есть достаточно хитростей, которые вы можете использовать, чтобы получить относительно дешевое современное оборудование для масштабирования достаточно далеко, хотя и не на самом деле горизонтально.
Я просто хотел опубликовать, чтобы прокомментировать, где вы обеспокоены потерей IP-адреса клиента. В любом из основных решений L7 / proxy вы можете вставить в запрос заголовок X-Forwarded-For (или как вам угодно). Затем на внутреннем веб-сервере, получающем запрос, вы можете изменить формат файла журнала, чтобы записать это значение в то же пространство в файле, которое использовалось для регистрации ip клиента layer3. Таким образом, любое программное обеспечение для синтаксического анализа журналов не видит различий (как и вы, когда следите).
Есть компромиссы во всем, и мы недостаточно слышали о вашей настройке, чтобы знать, но с трио ha-proxy, nginx и лаком «вы не ошибетесь», вероятно, хорошая идея перенести балансировку нагрузки к инструменту прокси-слоя. Это решит вашу проблему с ssl, а также предоставит вам множество новых опций, таких как кеширование, переключение контента и манипулирование заголовками.
источник
Несколько случайных мыслей;)
Сначала стреляйте в человека, который решил использовать данные сеанса на основе файлов. Нет никакого способа, которым чтение / запись данных из файловой системы будет быстрее, чем просто возврат к источнику для извлечения необходимых данных. Это о худшем способе сделать это.
Лично я никогда не видел ситуации, когда хранение данных в сеансе было бы лучше, чем просто извлечение их из базы данных по мере необходимости. Тем не менее, я видел, где использование memcache или подобных стратегий кэширования может помочь масштабировать сайт до миллионов пользователей, но это даже не в том же парке, что и при использовании сессий.
Во-вторых, вы только что нашли причину номер один, чтобы вообще не использовать сессии: балансировка нагрузки. К вашему сведению - Липкий не означает, что застрял. Даже с включенными Sticky-сессиями у вас есть реальная возможность переместить пользователя на другой сервер во время использования вашего приложения. Это произойдет в самые неподходящие времена. Придерживайтесь просто означает, что балансировщик нагрузки будет пытаться подтолкнуть пользователя обратно на сервер, на котором он начал, но это ни в коем случае не гарантия.
Этот момент обычно приводит к тому, что люди сохраняют сессию обратно в базу данных ... Я считаю, что это полный провал . Чтобы сессия работала, она должна быть загружена и записана на каждой странице запроса. Когда оно хранится в базе данных (необходимо для серверов с балансировкой нагрузки), для этого требуются два серверных запроса: первый для получения данных, второй для записи любых обновлений.
Отказ состоит в том, что люди обычно используют сеансы, поэтому им не нужно возвращаться в базу данных, чтобы извлекать такие вещи, как имя пользователя ... Но если страница должна запросить базу данных, чтобы загрузить сеанс, тогда ... ну, Вы должны увидеть здесь проблему логики.
Только хуже с сессиями ... потому что процессор страниц должен записывать данные сессий обратно в базу данных в конце жизненного цикла страницы ... на случай, если что-то изменилось. Это означает, что вместо одного запроса, чтобы получить имя этого пользователя, вы получите два. Для каждой загрузки страницы. Кроме того, это означает сериализацию и десериализацию данных, что влияет на производительность.
Моя точка зрения такова: сессия - это зло, и вам обычно лучше без нее. Сайты с низким трафиком, которые работают только на одном веб-сервере, не нуждаются в повышении производительности; и сайты с высоким трафиком, работающие на веб-ферме, ограничены в масштабировании из-за этого.
источник
Вместо использования Haproxy на передней панели вы можете использовать циклический DNS для грубой балансировки между несколькими SSL-декодерами, а затем передать его haproxy для правильной балансировки нагрузки.
источник