Как настроить 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 на порту3000app.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 — это мощный и гибкий инструмент. Он позволяет держать несколько сервисов на одном сервере, не открывая лишних портов, и легко масштабировать архитектуру. Начните с простого конфига и расширяйте по мере необходимости.
