Настройка 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 или закажите настройку через Администрирование серверов.
