====== 2.1 Создайте конфиги nginx ====== Создаем директорию для конфигов nginx mkdir nginx Файл nginx/nginx1.conf: nano nginx/nginx1.conf Содержимое: # ============================================================ # Конфигурация NGINX сервера #1 # Роль: Публичная точка входа, может маршрутизировать на другие прокси # ============================================================ server { # Слушаем порт 80 внутри контейнера listen 80; # Имя сервера (используется для виртуальных хостов) server_name nginx1; # ============================================================ # Основной location - прямая проксирация на приложение # ============================================================ location / { # Адрес бэкенда - приложение в контейнере app на порту 8000 proxy_pass http://app:8000; # КРИТИЧЕСКИ ВАЖНО: перезаписываем заголовок X-Forwarded-For # $proxy_add_x_forwarded_for - специальная переменная NGINX: # - Берёт существующий заголовок X-Forwarded-For (если есть) # - Добавляет через запятую IP адрес клиента ($remote_addr) # - ВАЖНО: Если клиент подделал заголовок, NGINX его игнорирует # и использует только реальный IP подключения proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Передаём оригинальный Host для корректной работы приложения proxy_set_header Host $host; # Дополнительный заголовок с реальным IP (альтернативный метод) proxy_set_header X-Real-IP $remote_addr; } # ============================================================ # Маршрут через NGINX 2 # Демонстрирует цепочку: пользователь -> nginx1 -> nginx2 -> app # ============================================================ location /via2 { # Проксируем на nginx2 (корневой путь) proxy_pass http://nginx2/; # Важно: также перезаписываем X-Forwarded-For и для этого запроса # Теперь $remote_addr будет IP адресом nginx1 (или клиента, если прямой запрос) proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; } # ============================================================ # Маршрут через NGINX 3 # Цепочка: пользователь -> nginx1 -> nginx3 -> app # ============================================================ location /via3 { proxy_pass http://nginx3/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; } # ============================================================ # Маршрут через NGINX 2 и затем NGINX 3 # Полная цепочка из трёх прокси: # пользователь -> nginx1 -> nginx2 -> nginx3 -> app # ============================================================ location /via2-3 { # Проксируем на специальный location в nginx2 # nginx2/via3 в свою очередь проксирует на nginx3 proxy_pass http://nginx2/via3; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; } } Файл nginx/nginx2.conf: nano nginx/nginx2.conf Содержимое: # ============================================================================ # КОНФИГУРАЦИЯ NGINX #2 - ПРОМЕЖУТОЧНЫЙ ПРОКСИ # ============================================================================ # Роль: Добавляет свой IP в цепочку и передаёт запрос дальше # ============================================================================ server { listen 80; server_name nginx2; # ------------------------------------------------------------------------ # ОСНОВНОЙ LOCATION - ПРОКСИРАЦИЯ НА ПРИЛОЖЕНИЕ # ------------------------------------------------------------------------ location / { proxy_pass http://app:8000; # ==================================================================== # ФОРМИРУЕМ ЦЕПОЧКУ X-Forwarded-For # ==================================================================== # $http_x_forwarded_for - входящий заголовок (уже есть IP клиента) # $remote_addr - IP адрес, с которого пришёл запрос (предыдущий прокси) # Результат: "IP_клиента, IP_предыдущего_прокси" # ==================================================================== proxy_set_header X-Forwarded-For "$http_x_forwarded_for, $remote_addr"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; } # ------------------------------------------------------------------------ # МАРШРУТ НА NGINX 3 (ДЛЯ СОЗДАНИЯ БОЛЕЕ ДЛИННЫХ ЦЕПОЧЕК) # ------------------------------------------------------------------------ location /via3/ { proxy_pass http://nginx3/; # Передаём накопленную цепочку дальше # $http_x_forwarded_for уже содержит IP клиента и nginx1 # Добавляем свой IP ($remote_addr) proxy_set_header X-Forwarded-For "$http_x_forwarded_for, $remote_addr"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } Файл nginx/nginx3.conf: nano nginx/nginx3.conf Содержимое: # ============================================================================ # КОНФИГУРАЦИЯ NGINX #3 - ПОСЛЕДНИЙ ПРОКСИ # ============================================================================ # Роль: Конечный прокси, формирует финальный заголовок для приложения # ============================================================================ server { listen 80; server_name nginx3; # ------------------------------------------------------------------------ # ЕДИНСТВЕННЫЙ LOCATION - ВСЕ ЗАПРОСЫ НА ПРИЛОЖЕНИЕ # ------------------------------------------------------------------------ location / { proxy_pass http://app:8000; # ==================================================================== # ФОРМИРУЕМ ФИНАЛЬНУЮ ЦЕПОЧКУ # ==================================================================== # $http_x_forwarded_for - цепочка от предыдущих прокси # $remote_addr - IP предыдущего прокси в цепочке # Приложение получит полный список всех IP # ==================================================================== proxy_set_header X-Forwarded-For "$http_x_forwarded_for, $remote_addr"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; # Дополнительные заголовки для приложения proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; } }