Назад | Перейти на главную страницу

Попытки настроить обратный прокси

Мы запускаем несколько веб-приложений, некоторые только внутренние, некоторые внутренние / внешние. Я составляю предложение о том, чтобы мы использовали обратные прокси-серверы для изоляции исходных серверов, обеспечения завершения SSL и (когда это возможно) обеспечения балансировки нагрузки. Я уверен, что для большей части нашей установки она будет работать нормально, но у нас есть несколько менее известных проприетарных приложений, которые могут нуждаться в особом обращении, когда мы будем двигаться вперед с обратным проксированием.

Какие типы ловушек обычно вызывают проблемы при перемещении исходного сервера с переднего края на прокси-сервер? (Например, я могу представить себе проблемы, если приложению необходимо знать IP-адрес входящих запросов.)

Наиболее частой ошибкой являются перенаправления, сгенерированные в приложении, которые вам придется переписать в обратном прокси, проблема с IP-адресом клиента, о которой вы уже говорили, при использовании завершения ssl, возможно, сервер хочет проверить сертификат клиента или получить от него информацию о пользователе. Для правильного кэширования обратного прокси на стороне края могут потребоваться модификации приложения (правильные заголовки с истекающим сроком действия, отключенные ненужные файлы cookie и т. Д.). Если вы используете встроенную аутентификацию Windows, это может быть недостижимым или настоящим кошмаром

Тогда у вас могут возникнуть проблемы с настройкой, но я думаю, что их будет намного легче решить. Мой предпочтительный набор инструментов для этой задачи:

  • Nginx на внешнем уровне для управления виртуальным хостом и сопоставления местоположения, сжатия, ssl, регистрации доступа
  • лак для кеширования
  • haproxy для организации очереди запросов, балансировки нагрузки и проверки серверной части.
  • Если вам нужна высокая доступность для обратных прокси-серверов, keepalived сделает свою работу

Проблемы, которые могут возникнуть с приложениями за обратным прокси:

  1. Если язык или приложение использует IP-адреса для ведения сеансов, единственным IP-адресом, доступным приложению, будет прокси. С помощью nginx и varnish вы можете добавить X-Forwarded-for заголовок с исходным IP-адресом и заставит приложение его распознать.
  2. Обработка сеанса в средах с балансировкой нагрузки - непростая задача. Вы должны использовать общий ресурс для серверов, чтобы хранить информацию об их сеансе, чтобы зарегистрированный пользователь мог подключиться к любому из бэкэндов приложений с балансировкой нагрузки и сохранить свой сеанс. Базы данных и Memcached - популярные варианты совместного использования сеанса.
  3. Если приложение с обратным прокси-сервером использует абсолютные URL-адреса в своих ответах, они могут нарушить перезапись на прокси. Т.е. приложение, которое выполняет 302 редиректа на URL, отличный от прокси.

Я сейчас использую nginx на фронтенде и лак за ним, чтобы выполнять прокси и балансировку нагрузки / проверку бэкэнда. В качестве единой точки отказа очень важно использовать кластерное решение на обратном прокси-сервере / балансировщике нагрузки.

я использую corosync / кардиостимулятор (Linux HA, самая последняя версия) для балансировки нагрузки балансировщиков нагрузки: три балансировщика нагрузки, каждый с внешним IP-адресом, балансировка RR с использованием DNS (одно имя указывает на три IP-адреса). Если одна из машин не работает, назначенный ей IP-адрес перемещается с помощью corosync на одну из двух других оставшихся машин. Также, если я добавлю больше машин / IP-адресов, они автоматически сбалансируются, и если все машины, кроме одной, не работают, все IP-адреса будут на том, который активен. Вы можете использовать corosync для настройки активно-активного, активно-пассивного и многих других конфигураций кластера.

Распространенный (и дешевый) способ сделать это - использовать squid в качестве обратного прокси ... вам следует взглянуть на их FAQ, где они обсуждают общие проблемы .. Squid revers Proxy FAQ

Вы также можете столкнуться с проблемами с внутренними перенаправлениями: прокси заставит приложение «думать», что оно находится в одном URL-адресе, который, очевидно, отличается от реального (внешнего) URL-адреса.

В Linux / BSD и некоторых других операционных системах прокси-сервер вполне может маскироваться под IP-адрес клиента, чтобы вы не теряли видимость (при этом используются сетевые функции ОС - iptables / ipfw, а не прокси).

Если вы используете проверку подлинности сертификата клиента в одном из приложений, вам будет сложно переместить точку завершения SSL и обеспечить безопасность.

Балансировка нагрузки может быть сложной задачей - для http-приложений вам нужно либо реплицировать состояние в реальном времени по кластеру, либо использовать `` липкие сеансы '', что скорее подрывает принцип отказоустойчивости (гибридный подход с использованием ограниченной репликации / отработки отказа определенного сеанса обычно наиболее практичное решение).