Определение простыми словами
Обратный прокси сидит «перед» вашими приложениями. Снаружи клиент видит только его — IP, порт, SSL-сертификат. Прокси разбирает запрос (URL, заголовки, куки), решает, какому внутреннему серверу его передать, и возвращает ответ обратно. Бэкенд при этом обычно не имеет публичного IP и доступен только из приватной сети.
В отличие от прямого (forward) прокси, который защищает клиента (например, корпоративный сквид для офисных пользователей), reverse-proxy защищает сервер. Самые популярные реализации — Nginx, HAProxy, Traefik, Caddy, Envoy.
Сравнение
| Решение | Сильная сторона | Где применяют |
|---|---|---|
| Nginx | Универсальность, кэш, статика | Веб-сайты, API-шлюзы |
| HAProxy | L4/L7-балансировка, метрики | Высоконагруженные TCP-сервисы, БД |
| Traefik | Автодискавери Docker/K8s | Микросервисы, контейнерные стенды |
| Caddy | Автоматический Let’s Encrypt | Простые сайты, dev-стенды |
| Envoy | gRPC, service mesh | Istio, Consul Connect |
Кейсы использования
- Один публичный IP — много сайтов: прокси разбирает Host-заголовок и направляет на нужный бэкенд.
- Терминация HTTPS: SSL-сертификат хранится только на прокси, бэкенд работает по чистому HTTP внутри приватной сети.
- Балансировка нагрузки между N экземплярами приложения с алгоритмами round-robin, least-conn или по хешу.
- Защитный слой: блокировка ботов, rate-limit, фильтрация по гео, интеграция с WAF (ModSecurity, Cloudflare).
- Канареечный деплой: 95% трафика на стабильную версию, 5% — на новую с мониторингом ошибок.
- Негатив: reverse-proxy — единая точка отказа. Без HA-схемы (keepalived + два узла) падение прокси означает падение всех сайтов за ним.
Технические детали
Минимальный конфиг Nginx как reverse-proxy с балансировкой и SSL.
# /etc/nginx/sites-available/app.conf
upstream backend {
least_conn;
server 10.0.0.10:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.11:8080 max_fails=3 fail_timeout=30s;
}
server {
listen 443 ssl http2;
server_name app.example.com;
ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 60s;
}
}
# Активировать сайт и перезагрузить
ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
Не забывайте передавать заголовки X-Real-IP и X-Forwarded-For, иначе на бэкенде в логах окажется только IP прокси.
🔥 Где это применяется
Частые вопросы
Чем reverse-proxy отличается от балансировщика нагрузки?
Балансировщик — частный случай reverse-proxy, специализированный на распределении трафика. Reverse-proxy шире: умеет кэшировать, переписывать URL, выдавать статику, терминировать SSL и применять политики безопасности.
Можно ли использовать один Nginx и для статики, и как reverse-proxy?
Да, это типовая схема: Nginx раздаёт картинки, JS, CSS из локальной папки и проксирует /api на backend-сервер. Это снижает нагрузку на приложение.
Как обеспечить отказоустойчивость reverse-proxy?
Поднять минимум два узла с keepalived и плавающим IP, либо использовать DNS-балансировку с round-robin и health-checks. На уровне бизнеса — облачный балансировщик типа AWS ALB.