nginx как reverse proxy: проксируем приложение правильно
Ваше приложение слушает 127.0.0.1:3000, а наружу нужен домен с HTTPS на 443 порту. Задачу решает nginx в роли reverse proxy. Разберём рабочий конфиг, TLS-сертификат и частые ошибки.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Зачем reverse proxy
Приложение (Node, Python, Go) обычно слушает локальный порт. Выставлять его напрямую в интернет небезопасно и неудобно: нет HTTPS, нет балансировки, нет кэша статики.
nginx принимает запросы на 80/443, терминирует TLS и проксирует их на backend. Один сервер может обслуживать десятки приложений на разных доменах.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для веб-приложенияУстановка
apt update && apt install nginx -y
systemctl enable --now nginx
Проверьте, что стартовая страница открывается по IP сервера. Если нет — смотрите firewall: порт 80 должен быть открыт (ufw allow 80/tcp).
Конфиг reverse proxy
Создаём сайт в /etc/nginx/sites-available/app.conf:
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Заголовки Upgrade и Connection нужны для WebSocket — без них живые соединения будут рваться.
ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
HTTPS за одну команду
Бесплатный сертификат Let's Encrypt ставится через certbot, который сам правит конфиг nginx.
apt install certbot python3-certbot-nginx -y
certbot --nginx -d example.com
Certbot настроит редирект с HTTP на HTTPS и автопродление. Проверить продление: certbot renew --dry-run.
Gzip и частые ошибки
Включаем сжатие в /etc/nginx/nginx.conf для ускорения отдачи:
gzip on;
gzip_types text/plain text/css application/json application/javascript;
- 502 Bad Gateway — backend не запущен или слушает не тот порт. Проверьте
ss -tlnp | grep 3000. - 413 Request Entity Too Large — добавьте
client_max_body_size 50m;. - Изменения не применились — вы забыли
nginx -tиsystemctl reload nginx.
На NVMe у MAATRIX nginx отдаёт статику с минимальными задержками, а reload проходит без разрыва активных соединений.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для веб-приложенияОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
В чём разница reload и restart?
reload перечитывает конфиг без разрыва соединений, restart полностью перезапускает процесс. В проде почти всегда нужен reload.
Как проксировать несколько приложений?
Создайте отдельный server-блок на каждый домен со своим proxy_pass. nginx маршрутизирует по server_name.
Certbot выдал ошибку — что делать?
Чаще всего домен ещё не указывает на сервер (A-запись не прописана) или порт 80 закрыт firewall. Проверьте оба условия.