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).