Обратный прокси (Reverse Proxy) — это сервер, который принимает запросы от клиентов, перенаправляет их на один или несколько внутренних серверов, обрабатывает ответы этих серверов и возвращает их клиенту, действуя как посредник между внешним миром и внутренней инфраструктурой.
Что такое обратный прокси?
В отличие от прямого прокси, который используется клиентом для доступа к внешним ресурсам, обратный прокси располагается перед одним или несколькими веб-серверами (origin servers) и перехватывает все входящие запросы к ним. Клиент взаимодействует только с обратным прокси, не зная о существовании и расположении внутренних серверов. Обратный прокси обрабатывает запрос, направляет его на соответствующий внутренний сервер, получает ответ, при необходимости модифицирует его и отправляет обратно клиенту.
Принцип работы
Процесс работы обратного прокси включает следующие шаги:
- Запрос клиента: Клиент отправляет HTTP/S-запрос на доменное имя, ассоциированное с обратным прокси-сервером.
- Перехват запроса: Обратный прокси принимает запрос от клиента.
- Маршрутизация: На основе настроенных правил (например, URL-путь, заголовки, доменное имя), обратный прокси определяет, на какой из внутренних серверов следует перенаправить запрос.
- Пересылка запроса: Прокси-сервер отправляет запрос выбранному внутреннему серверу.
- Получение ответа: Внутренний сервер обрабатывает запрос и отправляет ответ обратно прокси-серверу.
- Обработка ответа: Прокси-сервер может выполнить дополнительные действия с ответом (например, кэширование, сжатие, модификация заголовков).
- Отправка ответа клиенту: Прокси-сервер отправляет окончательный ответ клиенту, который воспринимает его как ответ от целевого сервера.
Основные функции и преимущества
Обратные прокси используются для решения ряда задач, связанных с производительностью, безопасностью и управлением сетевым трафиком.
Балансировка нагрузки
Обратный прокси может распределять входящие запросы между несколькими внутренними серверами. Это повышает доступность и масштабируемость приложений, предотвращая перегрузку одного сервера. Методы балансировки включают:
* Round Robin: Последовательное распределение запросов по серверам.
* Least Connections: Направление запроса на сервер с наименьшим количеством активных соединений.
* IP Hash: Распределение запросов на основе хеша IP-адреса клиента, что обеспечивает привязку к сессии (sticky sessions).
* Weighted Load Balancing: Присвоение весов серверам для приоритетного направления трафика на более мощные.
Повышение безопасности
Обратный прокси действует как первый уровень защиты для внутренних серверов:
* Скрытие внутренних IP-адресов: Клиенты не знают реальных IP-адресов внутренних серверов, что затрудняет прямые атаки.
* Защита от DDoS-атак: Прокси может фильтровать вредоносный трафик и поглощать часть нагрузки, не допуская её до внутренних серверов.
* Межсетевой экран веб-приложений (WAF): Некоторые обратные прокси интегрируются с WAF для обнаружения и блокировки атак на уровне приложений (SQL-инъекции, XSS).
* Централизованная аутентификация/авторизация: Прокси может обрабатывать аутентификацию до того, как запрос достигнет внутренних серверов.
SSL/TLS-терминация
Обратный прокси может обрабатывать SSL/TLS-шифрование, снимая эту нагрузку с внутренних серверов. Это позволяет внутренним серверам обмениваться данными по HTTP (или другому протоколу без шифрования) в рамках защищенной внутренней сети, что упрощает их конфигурацию и снижает вычислительные затраты.
Кэширование контента
Прокси-сервер может кэшировать статический и динамический контент, такой как изображения, CSS, JavaScript-файлы или результаты API-запросов. При повторных запросах к этому контенту прокси возвращает его из кэша, не обращаясь к внутреннему серверу. Это снижает нагрузку на бэкенд и ускоряет доставку контента клиентам.
Сжатие данных
Обратный прокси может сжимать ответы от внутренних серверов (например, с использованием Gzip или Brotli) перед отправкой клиенту. Это уменьшает объем передаваемых данных, что сокращает время загрузки и экономит пропускную способность.
A/B-тестирование и маршрутизация
Прокси может направлять часть трафика на альтернативные версии приложения для A/B-тестирования или выпуска новых функций для ограниченной аудитории. Также он может маршрутизировать запросы к различным бэкендам на основе URL-путей, заголовков или других параметров, что полезно в архитектурах микросервисов.
Единая точка входа и API Gateway
Для сложных систем с множеством микросервисов или различных приложений обратный прокси служит единой точкой входа. Он может выполнять функции API Gateway, управляя маршрутизацией запросов к различным API, обеспечивая аутентификацию, ограничение скорости запросов (rate limiting) и преобразование протоколов.
Отличия от прямого прокси
| Характеристика | Обратный прокси | Прямой прокси |
|---|---|---|
| Цель | Защита и оптимизация работы внутренних серверов | Доступ клиента к внешним ресурсам, обход ограничений, анонимность |
| Кто использует | Владельцы серверов/инфраструктуры | Конечные пользователи/клиенты |
| Расположение | Перед серверами (origin servers) | Между клиентом и интернетом |
| Кому известен | Клиенту известен только IP прокси, внутренние скрыты | Серверам известен IP прокси, клиент скрыт |
| Контроль | Под контролем владельца сервера | Под контролем клиента или стороннего сервиса |
| Примеры функций | Балансировка нагрузки, SSL-терминация, кэширование, WAF | Обход цензуры, фильтрация контента, кэширование для клиента, анонимность |
Популярные реализации
На рынке существует несколько мощных и широко используемых решений для обратного прокси:
Nginx
Nginx является одним из самых популярных веб-серверов и обратных прокси. Он известен своей высокой производительностью, низким потреблением ресурсов и способностью обрабатывать большое количество одновременных соединений. Nginx часто используется для балансировки нагрузки, SSL-терминации, кэширования и маршрутизации запросов.
HAProxy
HAProxy (High Availability Proxy) — это высокопроизводительный, надежный балансировщик нагрузки и прокси-сервер для TCP и HTTP-приложений. Он специализируется на балансировке нагрузки и обеспечивает высокую доступность, предлагая расширенные алгоритмы распределения трафика и проверки состояния серверов.
Apache (mod_proxy)
Веб-сервер Apache HTTP Server также может функционировать как обратный прокси с помощью модуля mod_proxy. Хотя он может быть менее производительным для некоторых сценариев с высокой нагрузкой по сравнению с Nginx или HAProxy, он является гибким решением для многих задач, особенно в уже существующих Apache-инфраструктурах.
Caddy
Caddy — это современный веб-сервер с автоматическим HTTPS. Он прост в настройке и использовании, автоматически получает и продлевает SSL/TLS-сертификаты от Let's Encrypt. Caddy может использоваться как обратный прокси, предлагая балансировку нагрузки и другие функции.
Varnish Cache
Varnish Cache — это специализированный HTTP-акселератор, который используется как обратный прокси для кэширования контента. Он значительно ускоряет веб-сайты, сохраняя часто запрашиваемые страницы в оперативной памяти и доставляя их клиентам без обращения к бэкенд-серверу. Varnish часто используется в связке с Nginx или Apache.
Примеры конфигурации (Nginx)
Базовая балансировка нагрузки
Пример конфигурации Nginx для распределения запросов между двумя внутренними серверами:
http {
upstream backend_servers {
server backend1.example.com:8080;
server backend2.example.com:8080;
}
server {
listen 80;
server_name myapp.example.com;
location / {
proxy_pass http://backend_servers;
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;
}
}
}
В этом примере upstream backend_servers определяет группу серверов. proxy_pass http://backend_servers; направляет все запросы из location / на эту группу. Заголовки X-Real-IP, X-Forwarded-For и X-Forwarded-Proto передают информацию о реальном IP-адресе клиента и используемом протоколе внутреннему серверу.
SSL/TLS-терминация
Конфигурация Nginx, терминирующая SSL/TLS и перенаправляющая запросы по HTTP на внутренний сервер:
http {
upstream backend_app {
server 127.0.0.1:8080; # Внутренний HTTP-сервер
}
server {
listen 80;
server_name myapp.example.com;
return 301 https://$host$request_uri; # Перенаправление HTTP на HTTPS
}
server {
listen 443 ssl;
server_name myapp.example.com;
ssl_certificate /etc/nginx/ssl/myapp.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/myapp.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://backend_app;
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;
}
}
}
Здесь Nginx прослушивает порты 80 (для перенаправления на HTTPS) и 443 (для HTTPS). Он обрабатывает SSL-сертификаты и ключи, а затем передает запросы внутреннему серверу по незашифрованному HTTP.
Кэширование контента
Пример настройки Nginx для кэширования статического контента:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;
server {
listen 80;
server_name myapp.example.com;
location /static/ {
proxy_cache my_cache;
proxy_cache_valid 200 30m; # Кэшировать успешные ответы на 30 минут
proxy_cache_key "$scheme$host$request_uri";
add_header X-Proxy-Cache $upstream_cache_status; # Добавляет заголовок для отладки
proxy_pass http://backend_app; # backend_app должен быть определен как в предыдущих примерах
}
location / {
proxy_pass http://backend_app;
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_cache_path определяет местоположение кэша на диске, его размер и время неактивности. В location /static/ активируется кэширование для всех запросов, начинающихся с /static/. Nginx будет сохранять ответы от backend_app в кэше и отдавать их при повторных запросах, пока кэш не устареет.