Обратный прокси (Reverse Proxy)

Сервер-посредник перед приложениями: принимает запросы из интернета, передает их нужному серверу и возвращает ответ, скрывая внутреннее устройство.

Обратный прокси — сервер, который стоит перед одним или несколькими приложениями и принимает все запросы из интернета вместо них. Он решает, какому внутреннему серверу передать запрос, получает от него ответ и отдает посетителю. Снаружи виден только прокси; адреса и устройство серверов приложений остаются скрытыми.

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

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

Что он делает

  • Шифрование. Принимает HTTPS-соединения, хранит сертификаты TLS и передает приложениям уже расшифрованные запросы по внутренней сети.
  • Маршрутизация. /api/ — на серверы API, /admin/ — на админку, остальное — на сайт. Несколько микросервисов выглядят снаружи как один сайт.
  • Балансировка нагрузки между несколькими копиями приложения.
  • Кэширование и сжатие — повторяющиеся ответы отдаются без обращения к приложению.
  • Защита. Ограничение частоты запросов, фильтрация подозрительных обращений, межсетевой экран для веб-приложений (WAF), поглощение части атак DDoS.

Пример

location /api/ {
    proxy_pass http://api-servers;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Фрагмент настройки Nginx передает все запросы к /api/ группе серверов API. Заголовки X-Real-IP и X-Forwarded-Proto сообщают приложению настоящий адрес посетителя и то, что он пришел по HTTPS, — иначе приложение увидело бы адрес прокси.

Инструменты

Самые распространенные — Nginx и его российский форк Angie, HAProxy, а в контейнерных средах — Traefik и Envoy. В Kubernetes роль обратного прокси выполняет Ingress-контроллер.

Важные детали

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