Я настраиваю веб-приложение, которое использует SSL для всех запросов. Он должен иметь место для масштабирования и быть высокодоступным. Похоже, что «рекомендуемый» способ справиться с этим - установить пару балансировщиков нагрузки уровня 4 для HA, которые проходят через ферму серверов для дешифрования SSL, которые затем отправляются на ферму балансировщиков нагрузки уровня 7, а затем наконец, к веб-серверам. (Видеть: http://1wt.eu/articles/2006_lb/index_09.html)
Раньше я использовал HAProxy, поэтому попробовал с такой настройкой. В основном у меня было HAProxy in TCP mode => STunnel => HAProxy in HTTP mode => Apache
. Когда я это сделал, для apache был доступен клиентский IP-адрес 2-го сервера HAProxy. Я мог бы немного улучшить это, добавив в STunnel заголовок X-Forwarded-For, но это дало мне только IP-адрес 1-го сервера HAProxy. Мне не удалось найти способ сообщить Apache исходный IP-адрес клиента.
Основываясь на документации, которую я прочитал, я не думаю, что HAProxy может проходить через исходный IP-адрес клиента в режиме tcp. Это правильно? Если да, существуют ли какие-либо программные балансировщики нагрузки с открытым исходным кодом, которые могут это сделать? Если нет, существуют ли коммерческие / аппаратные балансировщики нагрузки, которые могут?
Думаю, я должен также отметить, что этот балансировщик нагрузки, строго говоря, не обязательно должен быть балансировщиком нагрузки уровня 4. Мне просто нужно иметь возможность передавать SSL-трафик в STunnel (или что-то еще, что я использую для расшифровки SSL).
В качестве примечания я попытался настроить его без балансировщика нагрузки уровня 4 (т.е. STunnel - первая часть цепочки). Это решило проблему IP клиента. Однако, как и предполагалось в статье выше, узким местом был STunnel. Он начал терять запросы где-то между 500 и 600 запросами в секунду. И, конечно, это не может масштабироваться (при сохранении высокой доступности), просто добавляя больше блоков. Исходя из требований, которые мне были предъявлены, это приложение должен уметь обрабатывать пиковый трафик 1000-5000 запросов в секунду.
Я очень рекомендую заглянуть в LVS. http://www.linuxvirtualserver.org/
Он имеет возможность выполнять обычную маршрутизацию NAT, а также IP-туннелирование и прямую маршрутизацию, которые отправляются напрямую обратно клиенту.
BigIP от F5 - коммерческое решение, которое работает очень хорошо. X-Forwarded-For реализован как опция профиля http. Но это не дешево.
Apache TrafficServer можно настроить для вставки заголовка X-Forwarded-For, и это ничего не стоит. Я никогда не использовал его, но у него есть переменная конфигурации: proxy.config.http.append_xforwards_header
Вы смотрели: http://httpd.apache.org/docs/2.3/mod/mod_remoteip.html который перезапишет IP на основе заголовка X-Forwarded-for for.