Nginx Reverse Proxy Pass: проброс порта 80 на Node.js (порт 3000)
Зачем нужен Reverse Proxy (обратный прокси)?
Современные бэкенд-приложения на Node.js, Python (Django/FastAPI) или Go по умолчанию слушают локальные порты (например, http://127.0.0.1:3000 или 8000). Запускать приложение напрямую на стандартном HTTP-порту 80 небезопасно и неэффективно: бэкенд плохо справляется с отдачей статических файлов (CSS/JS), не умеет автоматически подключать бесплатные SSL-сертификаты Let's Encrypt и не держит высокие нагрузки. Nginx принимает весь внешний трафик на порту 80/443 и прозрачно проксирует запросы во внутреннее приложение.
Схема движения трафика:
Пользователь (Браузер) ---> HTTP/HTTPS (Порт 80/443) ---> [ Nginx Proxy ] ---> (127.0.0.1:3000) ---> [ Node.js App ] Пошаговая настройка Nginx Reverse Proxy
Шаг 1. Создаем конфигурационный файл виртуального хоста
sudo nano /etc/nginx/sites-available/my_app.confШаг 2. Заполняем конфигурацию proxy_pass
Вставьте следующий готовый блок настроек, заменив
example.comна ваш домен или IP-адрес:server { listen 80; server_name example.com www.example.com; location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; # Передаем реальные заголовки и IP посетителя: proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; 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; } }Шаг 3. Активируем конфигурацию через символическую ссылку
sudo ln -s /etc/nginx/sites-available/my_app.conf /etc/nginx/sites-enabled/Шаг 4. Проверяем синтаксис и перезапускаем Nginx
# Тестируем конфигурацию на отсутствие опечаток: sudo nginx -t # Если тест пройден успешно (syntax is ok), перезапускаем службу: sudo systemctl restart nginx
Частые вопросы (FAQ)
Почему при обращении к сайту выдается ошибка 502 Bad Gateway?
Ошибка 502 означает, что сам Nginx работает, но ваше Node.js приложение на порту 3000 выключено или зависло. Убедитесь, что бэкенд запущен через команду curl http://127.0.0.1:3000.
Зачем нужны строки с X-Real-IP и X-Forwarded-For?
Без этих заголовков ваше приложение Node.js будет думать, что абсолютно все посетители сайта приходят с IP-адреса 127.0.0.1 (локального Nginx), что сломает аналитику и логику банов.
Как добавить поддержку WebSockets в proxy_pass?
В представленной выше конфигурации строки Upgrade и Connection уже включены — они обеспечивают полноценную работу постоянных WebSocket соединений (например, для Socket.io).
Как повесить бесплатный SSL-сертификат HTTPS на этот конфиг?
Установите утилиту certbot и выполните одну команду: sudo certbot --nginx -d example.com. Certbot сам автоматически допишет все необходимые SSL-директивы в конфиг Nginx.