В чем разница между proxy (прямым прокси) и reverse proxy (обратным прокси)?

«В чем разница между proxy (прямым прокси) и reverse proxy (обратным прокси)?» — вопрос из категории Веб-серверы и балансировка, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основное отличие лежит в направлении работы и стороне, интересы которой представляет прокси-сервер.

Прямой прокси (Forward Proxy)

  • Работает на стороне клиента.
  • Назначение: Представляет интересы клиента или группы клиентов внутри внутренней сети. Клиенты настраивают свои приложения (браузер, ОС) для использования этого прокси.
  • Типичные use-cases:
    1. Контроль доступа и фильтрация: Корпоративные прокси, блокирующие доступ к соцсетям.
    2. Кэширование контента: Ускорение доступа к часто запрашиваемым ресурсам (Squid).
    3. Анонимизация: Сокрытие реального IP-адреса клиента от целевого сервера.
  • С точки зрения сервера: Запрос приходит от прокси, а не от реального клиента.

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

  • Работает на стороне сервера.
  • Назначение: Представляет интересы одного или нескольких серверов приложений (бэкендов). Клиенты обращаются к нему, не зная о существовании внутренней архитектуры.
  • Типичные use-cases в DevOps:
    1. Балансировка нагрузки (Load Balancing): Распределение входящего трафика между пулом бэкенд-серверов (Nginx, HAProxy).
    2. Терминация SSL/TLS: Снятие шифрования на прокси, чтобы разгрузить бэкенд-серверы.
    3. Кэширование статики и сжатие: Выдача статических файлов (CSS, JS, изображения) непосредственно с прокси.
    4. Защита (WAF): Фильтрация вредоносных запросов до их попадания на бэкенд.
    5. Консолидация доступа: Предоставление единой точки входа для нескольких микросервисов (API Gateway).
  • С точки зрения клиента: Обратный прокси и есть конечный сервер.

Наглядное сравнение:

# Прямой прокси
[Клиент] --> (Настроен использовать) --> [Прямой Прокси] --> [Интернет / Целевой Сервер]
          (Запрос: "Дай мне google.com")                (Запрос от имени клиента)

# Обратный прокси
[Клиент] --> [Обратный Прокси] --> [Внутренний Сервер 1]
          (Запрос: "Дай мне myapp.com")   [Внутренний Сервер 2]
          (Клиент думает, что говорит с самим приложением)

Пример конфигурации Nginx как обратного прокси:

http {
    upstream backend {
        server app1.example.com:8080;
        server app2.example.com:8080;
    }

    server {
        listen 443 ssl;
        server_name myapp.com;

        ssl_certificate /etc/ssl/certs/myapp.crt;
        ssl_certificate_key /etc/ssl/private/myapp.key;

        location / {
            proxy_pass http://backend; # Перенаправление трафика в upstream
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location /static/ {
            root /var/www/myapp; # Обслуживание статики напрямую
            expires 30d;
        }
    }
}

В DevOps обратный прокси — это краеугольный камень архитектуры, обеспечивающий безопасность, производительность и отказоустойчивость.