У меня есть куча вопросов относительно 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-запросов (вероятно, временно нормально)
- в долгосрочной перспективе перейдите к мобильному или централизованному хранилищу сессий, делая ненужные липкие сеансы