NoteJS/NGINX_PROXY_SETUP.md
Fovway 0cb0b27f20 Улучшена функция получения IP-адреса клиента и добавлен тестовый эндпоинт
- Расширена логика получения IP-адреса с учетом новых заголовков, таких как CF-Connecting-IP и Forwarded.
- Добавлено детальное логирование заголовков для упрощения отладки.
- Внедрен тестовый эндпоинт для проверки извлечения IP-адресов и отображения заголовков запроса.
2025-10-26 15:20:04 +07:00

4.7 KiB
Raw Blame History

Настройка nginx Proxy Manager для корректной передачи IP-адресов

Проблема

При использовании nginx Proxy Manager в режиме bridge, реальный IP-адрес клиента может не передаваться корректно, и вместо него всегда показывается IP-адрес прокси-сервера (например, 90.189.198.107).

Решение

1. Настройка nginx Proxy Manager

В настройках прокси-хоста в nginx Proxy Manager добавьте следующие заголовки:

В разделе "Advanced" → "Custom Nginx Configuration":

# Передача реального IP-адреса клиента
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_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;

# Дополнительные заголовки для лучшей совместимости
proxy_set_header X-Client-IP $remote_addr;
proxy_set_header X-Forwarded $scheme://$host;

# Установка доверенного прокси
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Server $host;

Или в разделе "Custom Nginx Configuration" (если доступен):

location / {
    proxy_pass http://your-app-container:3000;

    # Передача реального IP-адреса
    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_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Client-IP $remote_addr;

    # Дополнительные настройки
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Server $host;

    # Таймауты
    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;

    # Буферизация
    proxy_buffering off;
    proxy_request_buffering off;
}

2. Настройка Docker Compose (если используется)

Если ваш nginx Proxy Manager работает в Docker, убедитесь, что в docker-compose.yml правильно настроена сеть:

version: "3.8"
services:
  nginx-proxy-manager:
    image: jc21/nginx-proxy-manager:latest
    container_name: nginx-proxy-manager
    ports:
      - "80:80"
      - "443:443"
      - "81:81"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - npm-network
    restart: unless-stopped

  your-app:
    image: your-app-image
    container_name: your-app
    networks:
      - npm-network
    restart: unless-stopped

networks:
  npm-network:
    driver: bridge

3. Проверка работы

После настройки используйте тестовый эндпоинт для проверки:

curl -H "X-Forwarded-For: 192.168.1.100" https://your-domain.com/api/debug/ip

Или откройте в браузере: https://your-domain.com/api/debug/ip

4. Ожидаемый результат

В ответе должно быть:

{
  "detected_ip": "192.168.1.100", // Реальный IP клиента
  "headers": {
    "x-forwarded-for": "192.168.1.100",
    "x-real-ip": "192.168.1.100",
    "x-client-ip": "192.168.1.100"
  }
}

5. Отладка

Если IP-адрес все еще неправильный:

  1. Проверьте логи nginx Proxy Manager
  2. Убедитесь, что заголовки передаются (используйте /api/debug/ip)
  3. Проверьте настройки сети Docker
  4. Убедитесь, что nginx Proxy Manager не находится за дополнительными прокси

6. Дополнительные настройки

Для Cloudflare

Если вы используете Cloudflare, добавьте:

proxy_set_header CF-Connecting-IP $http_cf_connecting_ip;

Для AWS Load Balancer

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;

Примечания

  • После изменения настроек nginx Proxy Manager перезапустите контейнер
  • Убедитесь, что ваш Node.js сервер настроен с app.set("trust proxy", true)
  • Тестовый эндпоинт /api/debug/ip можно удалить после настройки