Русский (Russian)

Обратный прокси Nginx на Linux VPS

2 min
VPS/VDS-хостинг

Обратный прокси принимает публичный трафик на портах 80 и 443 и передаёт его приложениям, которые слушают только локально. Он даёт HTTPS, несколько сайтов на одном IP и единое место для логов и ограничений. Это руководство настраивает его на VPS Linux Infrawire для приложений на Node.js, Python или Docker.

📋 Требования

  • Linux VPS (Ubuntu 24.04 / Debian 12 или AlmaLinux 9 / Rocky 9) с root-доступом по SSH. IP-адрес и root-пароль находятся в личном кабинете.
  • Домен example.com с записями A/AAAA, указывающими на VPS_IP.
  • Приложение, слушающее локальный порт, например 127.0.0.1:3000.

📦 Установка Nginx

Bash
# Debian / Ubuntu sudo apt update && sudo apt install -y nginx # AlmaLinux / Rocky sudo dnf install -y nginx sudo systemctl enable --now nginx

В AlmaLinux/Rocky SELinux по умолчанию запрещает Nginx подключаться к бэкендам. Разрешите это один раз:

Bash
sudo setsebool -P httpd_can_network_connect 1

🚀 Первое приложение за прокси

Приложение должно слушать 127.0.0.1, а не 0.0.0.0, чтобы оно было доступно только через Nginx. Независимо от языка схема одна: node server.js на порту 3000, gunicorn -b 127.0.0.1:8000 app:app для Python или контейнер, опубликованный командой docker run -d -p 127.0.0.1:3000:80 IMAGE.

Создайте /etc/nginx/sites-available/example.com (в AlmaLinux/Rocky используйте /etc/nginx/conf.d/example.com.conf):

Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com; 5 6 location / { 7 proxy_pass http://127.0.0.1:3000; 8 proxy_http_version 1.1; 9 proxy_set_header Host $host; 10 proxy_set_header X-Real-IP $remote_addr; 11 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 12 proxy_set_header X-Forwarded-Proto $scheme; 13 } 14}

Включите его в Debian/Ubuntu, затем проверьте и перезагрузите:

Bash
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx

Заголовки X-Forwarded-* сообщают приложению реальный IP клиента и то, использовал ли посетитель HTTPS. Без них приложение видит только 127.0.0.1 и может создавать ссылки http://. Многие фреймворки нужно дополнительно настроить на доверие к прокси (например, app.set('trust proxy', 1) в Express).

🔌 Поддержка WebSocket

WebSocket требует заголовков HTTP upgrade. Добавьте map в начале контекста http (например, в /etc/nginx/conf.d/websocket.conf):

Nginx
map $http_upgrade $connection_upgrade { default upgrade; '' close; }

Затем в блоке location:

Nginx
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;

⏱️ Таймауты и размер тела запроса

По умолчанию это 60 секунд и 1 МБ. Подстройте их для медленных эндпоинтов или загрузки файлов:

Nginx
proxy_connect_timeout 5s; proxy_read_timeout 120s; proxy_send_timeout 120s; client_max_body_size 50m;

Для долгоживущего WebSocket увеличьте proxy_read_timeout (например, 3600s) или пусть приложение отправляет ping.

🔒 HTTPS через Certbot

Сначала откройте в файрволе порты 80 и 443, затем:

Bash
# Debian / Ubuntu sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d example.com

В AlmaLinux/Rocky установите Certbot командами sudo dnf install -y epel-release, а затем sudo dnf install -y certbot python3-certbot-nginx. Certbot добавляет сертификат в ваш блок server, предлагает редирект с HTTP на HTTPS и настраивает автоматическое продление. Проверьте его:

Bash
sudo certbot renew --dry-run

🗂️ Несколько приложений на одном VPS

Создайте по одному блоку server на домен, каждый со своим server_name и своим локальным портом:

Nginx
1server { 2 listen 80; 3 server_name app1.example.com; 4 location / { proxy_pass http://127.0.0.1:3000; } 5} 6 7server { 8 listen 80; 9 server_name app2.example.com; 10 location / { proxy_pass http://127.0.0.1:8000; } 11}

Повторите заголовки прокси в каждом блоке, затем запустите Certbot с -d app1.example.com -d app2.example.com. Можно разделять и по пути (location /api/ { proxy_pass http://127.0.0.1:8000/; }); завершающий слеш тогда убирает префикс.

✅ Проверка

Bash
curl -I https://example.com ss -ltnp | grep -E ':(80|443|3000)' sudo tail -f /var/log/nginx/error.log

Порт бэкенда должен быть привязан только к 127.0.0.1, а Nginx слушает 80 и 443.

🛠️ Устранение неполадок

502 Bad Gateway. Приложение остановлено или работает на другом порту. Проверьте через ss -ltnp и запустите его. В AlmaLinux/Rocky Permission denied в журнале ошибок означает, что не включён описанный выше параметр SELinux.

504 Gateway Timeout. Бэкенд отвечает дольше, чем proxy_read_timeout. Увеличьте значение или оптимизируйте эндпоинт.

WebSocket отключается или падает с 400/426. Нет заголовков Upgrade и Connection либо отсутствует proxy_http_version 1.1;.

Неверный IP клиента в логах. X-Forwarded-For отправляется, но приложение не доверяет прокси. Включите соответствующую настройку доверия в вашем фреймворке.


🎉 Ваши приложения теперь работают за Nginx с HTTPS, корректными заголовками и запасом места для стольких сайтов, сколько выдержит ваш VPS.

Следите за последними предложениями, скидками и специальными акциями.

Смотреть акции

Мы используем файлы cookie

Аналитические cookie улучшают работу сайта. Данные не продаются третьим лицам. Подробнее в политике конфиденциальности.