Nginx на VPS: базовая настройка реверс-прокси
Пошаговое руководство по настройке Nginx в качестве реверс-прокси на VPS: от подготовки сервера до проверки конфигурации.
Содержание
Зачем нужен реверс-прокси и как он работает на VPS
Реверс-прокси — это промежуточный сервер, который принимает клиентские запросы и направляет их к бэкенд-приложениям. На VPS такая схема используется повсеместно: например, у вас есть Node.js, Python или Go приложение, которое слушает на локальном порту (3000, 8080 и т.д.), а Nginx выступает внешним шлюзом, принимая стандартные 80/443 порты.
Преимущества очевидны: Nginx эффективно распределяет нагрузку, может кэшировать контент, терминировать SSL/TLS, а также скрывать внутреннюю структуру серверов. Базовая настройка реверс-прокси сводится к простому правилу: все запросы, пришедшие на определённый домен (или IP), Nginx пересылает на указанный бэкенд-адрес. В этой статье мы разберём именно такую минимальную конфигурацию без дополнительных «рюшечек» — только то, что нужно для быстрого деплоя.
Подготовка VPS и установка Nginx
Перед началом убедитесь, что ваш VPS работает под управлением Linux (Debian, Ubuntu, CentOS или их производных). Подключитесь к нему через SSH. Обновите индекс пакетов и установите Nginx из официального репозитория вашего дистрибутива:
sudo apt update
sudo apt install nginxДля CentOS/RHEL используйте sudo yum install nginx. После установки проверьте статус службы:
sudo systemctl status nginxЕсли Nginx не запущен — запустите его и добавьте в автозагрузку:
sudo systemctl start nginx
sudo systemctl enable nginxДальше важно проверить, что ваш бэкенд действительно работает. Допустим, у вас есть приложение, которое слушает 127.0.0.1:3000. Выполните запрос с сервера:
curl http://127.0.0.1:3000Если получили ответ — всё в порядке. Если нет, разберитесь с вашим приложением: убедитесь, что оно запущено и привязано к правильному интерфейсу.
Базовая настройка реверс-прокси в Nginx
Nginx хранит виртуальные хосты в каталоге /etc/nginx/sites-available//sites-enabled/ на Debian/Ubuntu, или в /etc/nginx/conf.d/ на CentOS. Создадим новый конфигурационный файл. В Debian/Ubuntu:
sudo nano /etc/nginx/sites-available/my-appВставьте минимальную конфигурацию:
server ⟨br⟩ listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
include proxy_params;
}
}Объяснение: listen 80 говорит Nginx слушать 80-й порт (HTTP). server_name — доменное имя, по которому будут приходить запросы. Если домена нет, можно указать IP-адрес сервера. Внутри location / мы устанавливаем proxy_pass на адрес бэкенда, а директива include proxy_params подтягивает стандартный набор заголовков, необходимых для корректной работы многих приложений (например, Host, X-Real-IP, X-Forwarded-For).
Если вы используете CentOS, создайте файл /etc/nginx/conf.d/my-app.conf с тем же содержимым, но заменяя include proxy_params на отдельные строки (или просто не включайте их в базовой настройке). Для полноты вот конфигурация без proxy_params:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}После создания файла включите его симлинкой в sites-enabled (Debian/Ubuntu):
sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/Проверка конфигурации и перезапуск Nginx
Прежде чем перезапускать Nginx, обязательно проверьте синтаксис конфигурации:
sudo nginx -tЕсли вы увидите syntax is ok и test is successful, можно безопасно перезагрузить сервер:
sudo systemctl reload nginxИли перезапустить полностью:
sudo systemctl restart nginxТеперь откройте браузер и перейдите на ваш домен или IP. Вы должны увидеть ответ вашего приложения. Если ничего не работает, смотрите логи Nginx:
sudo tail -f /var/log/nginx/error.logЧаще всего проблема в том, что порт бэкенда не совпадает, либо приложение слушает только на 127.0.0.1, а в proxy_pass указан правильный адрес. Убедитесь также, что брандмауэр (ufw, firewalld) не блокирует нужные порты.
При настройке дополнительных локаций, например для API или статики, вы можете добавить ещё правил. Хорошей практикой является использование разных location блоков, например:
location /api/ {
proxy_pass http://127.0.0.1:3000/api/;
}
location /static/ {
alias /var/www/my-app/static/;
}Это позволяет Nginx отдавать статику напрямую, разгружая ваше приложение.
Диагностика типовых неполадок
Если после настройки вы получаете ошибку 502 Bad Gateway, это означает, что Nginx не может соединиться с бэкендом. Проверьте:
- Запущено ли ваше приложение. Выполните
ps aux | grep nodeилиsystemctl status my-app. - Постучитесь вручную:
curl -I http://127.0.0.1:3000. - Посмотрите, нет ли ошибок в конфигурации:
sudo nginx -t.
Ошибка 504 Gateway Timeout появляется, когда бэкенд отвечает слишком долго. Увеличьте таймауты в конфигурации:
proxy_connect_timeout 60s;
proxy_read_timeout 120s;Если вы планируете использовать HTTPS, обязательно настройте SSL-сертификат, например через Let's Encrypt (certbot). Для этого потребуется включить 443 порт и обновить конфигурацию, но это тема для отдельной инструкции.
Заключение
Мы рассмотрели базовую настройку реверс-прокси на Nginx: подготовку VPS, установку, создание конфигурации, проверку и перезапуск. Этого достаточно, чтобы запустить простое приложение за Nginx на вашем виртуальном сервере. Дальнейшее углубление — настройка SSL, балансировка нагрузки, кэширование и оптимизация — остаётся на ваше усмотрение. Действуйте по шагам, и вы избежите большинства ошибок, с которыми сталкиваются новички.
Мини-чеклист
- Обновите систему и установите Nginx
- Убедитесь, что бэкенд-приложение запущено и слушает нужный порт
- Создайте конфигурационный файл виртуального хоста
- Укажите server_name и proxy_pass
- Проверьте конфигурацию с помощью nginx -t
- Перезапустите Nginx и протестируйте доступность из браузера
- Просмотрите логи Nginx при возникновении проблем
Частые ошибки
- Не проверили nginx -t перед перезапуском — из-за синтаксической ошибки падает весь сервер
- Неправильно указали proxy_pass: если у бэкенда есть URI, а в proxy_pass его нет, запросы будут искажаться (нужно следить за слэшами)
- Забыли добавить proxy_set_header для корректной передачи IP и схемы
- Приложение слушает на 127.0.0.1, а конфигурация указывает на localhost или другой интерфейс
- Файл не включен в sites-enabled, поэтому Nginx его не читает
- На CentOS/RedHat файл должен быть в conf.d, а не в sites-available
Источники и документация
FAQ
Можно ли использовать реверс-прокси Nginx без доменного имени?
Да, вместо server_name можно указать IP-адрес VPS или просто пропустить директиву (будет матчиться любой Host). Но лучше задать domain или IP для предсказуемого поведения.
Что означает ошибка 502 Bad Gateway при обращении к сайту?
Это значит, что Nginx не смог подключиться к бэкенд-серверу. Проверьте, запущено ли ваше приложение, соответствует ли порт в proxy_pass фактическому порту приложения, и убедитесь, что бэкенд доступен с сервера по curl.
Нужно ли открывать порт 3000 (порт приложения) в брандмауэре?
Нет, обычно достаточно открыть только 80 (и 443 для TLS). Приложение должно слушать только localhost, чтобы внешние злоумышленники не могли обратиться к нему напрямую. Nginx будет перенаправлять запросы на него.
Хотите перейти сразу к рабочему доступу?
Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.
Получить доступ