Reverse Proxy

Базовый System Design
≈ 2 мин чтения

Прокси принимает запрос от имени внутренних серверов

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

client -> reverse proxy -> application

Слово reverse отличает его от forward proxy, который представляет клиента перед внешними ресурсами. Reverse proxy, наоборот, представляет один или несколько серверов перед клиентом.

Что удобно вынести на этот слой

Поскольку множество запросов проходит через одну входную точку, здесь удобно выполнять общие инфраструктурные задачи, которые не относятся к бизнес-логике приложения.

  • завершать TLS-соединение и централизованно управлять сертификатами;
  • маршрутизировать запросы по домену или пути;
  • добавлять или нормализовать технические заголовки;
  • применять ограничения на размер запроса, таймауты или базовые правила фильтрации;
  • сжимать подходящие ответы и обслуживать некоторые статические данные.

Например, один внешний адрес может направлять /api в приложение, а /static — в отдельный обработчик статического контента. Клиенту не нужно знать, что за этими путями находятся разные внутренние компоненты.

Reverse Proxy и Load Balancer — не одно и то же

Один продукт действительно может выполнять обе роли, поэтому названия часто смешивают. Но задачи различаются: reverse proxy прежде всего является посредником и внешней точкой входа, а load balancer отвечает за распределение нагрузки между несколькими подходящими экземплярами.

В простой системе один reverse proxy может отправлять запросы в единственный application server. Когда экземпляров становится несколько, тот же слой может дополнительно выполнять балансировку или передавать запрос отдельному балансировщику.

Каждый промежуточный слой должен быть оправдан. Reverse proxy упрощает централизованные инфраструктурные задачи, но одновременно становится частью критического пути запроса и должен проектироваться как надёжный компонент.