Какие reverse proxy существуют
Что проверяют
Понимаете ли вы, что стоит перед вашим Go-сервисом и где проходит граница ответственности прокси. Следом обычно спрашивают, чем reverse proxy отличается от forward proxy, или просят набросать простой прокси на стандартной библиотеке.
Как отвечать
Начните с определения: reverse proxy принимает запросы клиентов от имени бэкендов, клиент видит только его. Типичные задачи: TLS-терминация, балансировка, кеширование, сжатие, лимиты, маршрутизация по хосту и пути. Затем решения с назначением:
- Nginx: самый распространённый, статика, кеш,
proxy_passиupstreamс балансировкой; - HAProxy: балансировщик L4 и L7, гибкие проверки здоровья узлов, stick tables, подробная статистика;
- Envoy: на C++, конфигурируется динамически через xDS API, основа Istio и многих API-шлюзов;
- Traefik: написан на Go, сам находит сервисы в Docker и Kubernetes по меткам и CRD, умеет выпускать сертификаты по ACME;
- Caddy: тоже на Go, HTTPS включён по умолчанию, конфиг в коротком
Caddyfile; - Ingress-контроллеры и облачные балансировщики: в Kubernetes чаще всего именно они и есть этот слой.
Сильный ход для Go-разработчика: упомянуть httputil.ReverseProxy из net/http/httputil. Это готовый прокси, которому задают Rewrite (в старом коде Director) для изменения запроса, ModifyResponse и свой Transport. Деталь, которую ценят: при Rewrite заголовки X-Forwarded-* сами не проставляются, их добавляет вызов SetXForwarded().
Закончите критерием выбора: для статики и кеша чаще берут Nginx, в динамическом окружении Kubernetes Traefik или Envoy, для одного сервера с HTTPS без ручной настройки Caddy.
Где спотыкаются
Путают reverse proxy с forward proxy. Forward стоит на стороне клиента и ходит в сеть от его имени, reverse стоит перед серверами.
Забывают про реальный адрес клиента. За прокси сервис видит IP прокси, настоящий приходит в X-Forwarded-For или X-Real-IP, и доверять этим заголовкам можно только от своего прокси.
Приписывают прокси «безопасность из коробки». Скрытый IP бэкенда не заменяет авторизацию и лимиты, а ошибка в конфиге сама открывает внутренние маршруты наружу.