Документация
VPS

nginx как reverse proxy

Проксирование одного или нескольких приложений (Node/Python/Go) за nginx с HTTPS.

5 мин

nginx как reverse proxy

Ваше приложение (Node.js, Python/Gunicorn, Go) слушает localhost:3000. nginx стоит перед ним — принимает HTTPS-трафик, кэширует статику, балансирует. Классическая схема.

Установка

apt update && apt install nginx -y
systemctl enable --now nginx

Проверьте: curl -I http://localhost — должен быть 200 OK и заголовок Server: nginx.

Минимальный proxy-конфиг

Создайте /etc/nginx/sites-available/myapp.conf:

server {
    listen 80;
    server_name myapp.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;

        # WebSocket / SSE
        proxy_set_header Upgrade    $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Тайм-ауты — увеличить для долгих запросов
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}

Активируйте:

ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

Проксирование нескольких приложений

Два сайта на одном VPS — по отдельному server {} блоку на каждый домен:

server {
    listen 80;
    server_name api.example.com;
    location / { proxy_pass http://127.0.0.1:4000; }
}

server {
    listen 80;
    server_name web.example.com;
    location / { proxy_pass http://127.0.0.1:3000; }
}

nginx выберет нужный по Host-заголовку.

HTTPS через Let's Encrypt

Следующий шаг после того, как HTTP работает: SSL от Let's Encrypt для nginx.

Кэш статики

Для файлов из public-папки — отдавайте напрямую через nginx, не через приложение:

location /_next/static/ {
    alias /var/www/myapp/.next/static/;
    expires 1y;
    add_header Cache-Control "public, immutable";
}

Ошибки: как читать

  • 502 Bad Gateway — приложение упало или не слушает порт. Проверьте systemctl status myapp и ss -tlnp | grep 3000.
  • 504 Gateway Timeout — приложение медленное. Увеличьте proxy_read_timeout или ускорьте backend.
  • 413 Request Entity Too Large — upload больше client_max_body_size (по умолчанию 1MB).

Что дальше