Давайте дружить в Телеграме: рассказываем про новые фичи и общаемся в комментах Подписаться
support@serv.host
Личный кабинет

Как настроить Nginx как reverse proxy для нескольких сервисов

Как настроить Nginx как reverse proxy для нескольких сервисов

Если у вас на одном сервере работает несколько приложений — например, Node.js-бэкенд, Python API и статический сайт — вам нужен reverse proxy. Nginx справляется с этой задачей отлично: он принимает входящие запросы и перенаправляет их к нужному сервису по порту или доменному имени.


Что такое reverse proxy и зачем он нужен

Reverse proxy — это сервер-посредник, который стоит перед вашими приложениями и распределяет входящий трафик. Клиент обращается к Nginx на порту 80/443, а Nginx сам решает, куда отправить запрос.

Преимущества:

  • Все сервисы доступны через стандартные порты (80/443), а не через 3000, 8080 и т.д.
  • Легко настроить HTTPS сразу для всех приложений
  • Nginx берёт на себя балансировку нагрузки и кэширование
  • Приложения не знают о внешнем мире — безопаснее

Установка Nginx

На Ubuntu/Debian:

sudo apt update
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

Проверить статус:

sudo systemctl status nginx

Структура конфигурации

Nginx хранит конфиги в /etc/nginx/. Основной файл — nginx.conf, но для удобства лучше создавать отдельные файлы в /etc/nginx/sites-available/ и делать симлинки в sites-enabled/.

/etc/nginx/
├── nginx.conf
├── sites-available/
│   ├── app1.conf
│   └── app2.conf
└── sites-enabled/
    ├── app1.conf -> ../sites-available/app1.conf
    └── app2.conf -> ../sites-available/app2.conf

Настройка proxy по доменному имени

Допустим, у вас есть два сервиса:

  • api.example.com → Node.js на порту 3000
  • app.example.com → Python/Flask на порту 5000

Создайте конфиг для первого сервиса:

sudo nano /etc/nginx/sites-available/api.conf
server {
    listen 80;
    server_name api.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 (если нужно)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Создайте конфиг для второго сервиса:

sudo nano /etc/nginx/sites-available/app.conf
server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://127.0.0.1:5000;
        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;
    }
}

Активируйте конфиги:

sudo ln -s /etc/nginx/sites-available/api.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/

Настройка proxy по пути (path-based)

Если у вас один домен, но несколько сервисов по разным путям:

server {
    listen 80;
    server_name example.com;

    # Запросы к /api/ идут на Node.js
    location /api/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # Запросы к /admin/ идут на Flask
    location /admin/ {
        proxy_pass http://127.0.0.1:5000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # Всё остальное — статика
    location / {
        root /var/www/html;
        index index.html;
        try_files $uri $uri/ =404;
    }
}

Важно: Слэш в конце proxy_pass http://127.0.0.1:3000/ имеет значение. Если он есть — Nginx убирает префикс /api/ при передаче запроса. Если нет — передаёт путь целиком.


Полезные параметры proxy

ПараметрОписание
proxy_connect_timeoutТаймаут на соединение с бэкендом
proxy_read_timeoutТаймаут ожидания ответа
proxy_buffersРазмер буферов для ответа
proxy_cache_pathКэширование ответов

Пример с таймаутами:

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_connect_timeout 10s;
    proxy_read_timeout 30s;
    proxy_send_timeout 30s;
}

Проверка конфигурации и перезапуск

Всегда проверяйте конфиг перед перезапуском:

sudo nginx -t

Если всё в порядке, перезагружаем без остановки сервиса:

sudo systemctl reload nginx

Добавление HTTPS через Let's Encrypt

После того как reverse proxy работает, подключите бесплатный SSL:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d api.example.com -d app.example.com

Certbot сам изменит конфиг Nginx и настроит автоматическое обновление сертификата.


Итог

Nginx как reverse proxy — это мощный и гибкий инструмент. Он позволяет держать несколько сервисов на одном сервере, не открывая лишних портов, и легко масштабировать архитектуру. Начните с простого конфига и расширяйте по мере необходимости.