cp.lv — VPS, выделенные и облачные серверы

cp.lv (LANGMARKET LLP) — хостинг-провайдер: VPS, выделенные и облачные серверы на NVMe с выбором ОС, полным root-доступом и поддержкой 24/7. Тест-период до оплаты: выделенные серверы — 5 дней, VPS и облако — 5 часов.

Contact Info
LANGMARKET LLP
Rīga, Latvija

+371 00 000 000

Follow Us

Личный кабинет

Язык

Настройка Nginx как reverse proxy: пошаговое руководство

Настройка Nginx как reverse proxy: пошаговое руководство

Reverse proxy на Nginx принимает запросы на 80/443 порту и перенаправляет их приложению на локальном порту (например 127.0.0.1:3000), добавляя нужные заголовки. Так вы получаете единую точку входа, HTTPS и балансировку. Ниже — рабочий конфиг с проксированием, заголовками, TLS и WebSocket.

Что делает reverse proxy

  • Принимает внешние HTTP/HTTPS-запросы и передаёт их бэкенду (Node.js, Python, PHP-FPM и т.п.).
  • Терминирует TLS: приложение работает по HTTP, шифрование берёт на себя Nginx.
  • Скрывает внутреннюю структуру и порты приложений за одним доменом.
  • Позволяет балансировать нагрузку между несколькими бэкендами.

Шаг 1. Установите Nginx

sudo apt update
sudo apt install nginx
sudo systemctl enable --now nginx

Шаг 2. Создайте конфиг сайта

Создайте файл виртуального хоста:

sudo nano /etc/nginx/sites-available/app.conf

Базовый reverse proxy к приложению на порту 3000:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        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;
    }
}

Зачем заголовки: без X-Forwarded-For и X-Real-IP приложение будет видеть IP 127.0.0.1 вместо реального клиента, а X-Forwarded-Proto сообщает бэкенду об исходном HTTPS.

Шаг 3. Активируйте конфиг

sudo ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Команда nginx -t проверяет синтаксис до перезагрузки — не пропускайте её.

Шаг 4. Поддержка WebSocket

Если приложение использует WebSocket (чаты, live-обновления), добавьте в location проброс заголовков Upgrade:

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Шаг 5. Включите HTTPS

Установите certbot и получите сертификат Let’s Encrypt — он сам пропишет TLS в конфиг:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com

После этого Nginx будет слушать 443 с сертификатом, а запросы с 80 порта перенаправятся на HTTPS.

Балансировка нескольких бэкендов

Для распределения нагрузки опишите группу upstream:

upstream backend {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Таймауты и размер загружаемых файлов

По умолчанию Nginx ограничивает тело запроса 1 МБ и разрывает медленные ответы бэкенда. Для приложений с загрузкой файлов и долгими операциями увеличьте лимиты в блоке server или location:

client_max_body_size 50m;
proxy_connect_timeout 60s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;

Директива client_max_body_size задаёт максимальный размер загрузки, а тайм-ауты proxy_* — сколько ждать соединения и ответа бэкенда, прежде чем вернуть 504 Gateway Timeout.

Проксирование по пути

Один домен можно распределить между несколькими приложениями по префиксу URL. Например, /api/ — на бэкенд, остальное — на фронтенд:

location /api/ {
    proxy_pass http://127.0.0.1:4000/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location / {
    proxy_pass http://127.0.0.1:3000;
}

Обратите внимание на завершающий слэш в proxy_pass http://127.0.0.1:4000/ — он отсекает префикс /api/, и бэкенд получает путь без него.

Ключевые директивы

Директива Назначение
proxy_pass адрес бэкенда
proxy_set_header передача заголовков приложению
proxy_http_version 1.1 нужна для keep-alive и WebSocket
upstream группа серверов для балансировки

Частые вопросы

Ошибка 502 Bad Gateway — в чём причина? Nginx не смог соединиться с бэкендом: приложение не запущено, слушает другой порт или упало. Проверьте ss -tulpn | grep 3000 и логи приложения.

Приложение видит IP 127.0.0.1 вместо клиента — почему? Не проброшены заголовки. Добавьте X-Forwarded-For и X-Real-IP и настройте приложение доверять этим заголовкам.

Как проверить конфиг перед применением? Выполните sudo nginx -t — он покажет синтаксические ошибки без перезагрузки сервиса.

Нужно ли открывать порт бэкенда наружу? Нет. Бэкенд слушает 127.0.0.1, наружу открыты только 80/443 у Nginx. Так безопаснее.

Как обновлять TLS-сертификат? certbot ставит таймер автообновления. Проверить: sudo certbot renew --dry-run.

Нужен сервер для размещения Nginx и ваших приложений? Разверните VPS на Linux в разделе аренда VPS или закажите настройку через Администрирование серверов.

Инга Витола

Инга Витола

Руководитель поддержки. Возглавляет команду поддержки и следит, чтобы клиенты получали живые ответы по делу в любое время.