Что такое Nginx reverse proxy и как через него проксировать несколько сайтов

6 минут чтения
Средний рейтинг статьи — 4.8

Reverse proxy — это режим работы веб-сервера, при котором он принимает запросы от клиентов и перенаправляет их на внутренние серверы (backend), скрывая их от внешнего мира.
Проще говоря, Nginx выступает в роли посредника между пользователем и вашим приложением или API.

Например, пользователь обращается к example.com, но на самом деле его запрос обрабатывается приложением, запущенным на localhost:3000.
Nginx принимает запрос, передаёт его на порт 3000 и возвращает ответ клиенту так, будто всё работает с одного домена.

Такой подход даёт несколько преимуществ:

  • Безопасность. Реальные адреса внутренних сервисов не видны извне.
  • Балансировка нагрузки. Можно распределять трафик между несколькими backend-серверами.
  • Кеширование и сжатие. Nginx умеет кешировать ответы и экономить трафик.
  • SSL-терминация. Сертификаты можно настроить только на уровне Nginx, не трогая внутренние приложения.
  • Единая точка входа. Все сайты и API можно обслуживать через один сервер и порт 80/443.

Простой пример конфигурации reverse proxy

Допустим, у вас есть Node.js-приложение, работающее на localhost:3000, и вы хотите, чтобы оно было доступно по адресу example.com.

Файл конфигурации /etc/nginx/sites-available/example.conf может выглядеть так:

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;
    }
}

Эта конфигурация делает следующее:

  • принимает HTTP-запросы на домен example.com;
  • перенаправляет их на внутренний порт 3000;
  • добавляет нужные заголовки (Host, X-Real-IP), чтобы backend знал реальный IP клиента;
  • возвращает ответ пользователю.

После сохранения файла достаточно активировать конфиг и перезапустить Nginx:

sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Проксирование нескольких сайтов через один Nginx

Теперь представим, что на сервере нужно обслуживать несколько разных доменов:

  • api.example.com → Node.js на localhost:4000
  • blog.example.com → статический сайт на /var/www/blog
  • shop.example.com → PHP-приложение (например, Laravel) на localhost:9000

Для этого достаточно добавить несколько server-блоков — по одному на каждый сайт:

# API
server {
    listen 80;
    server_name api.example.com;
 
    location / {
        proxy_pass http://127.0.0.1:4000;
        include proxy_params;
    }
}
 
# Блог
server {
    listen 80;
    server_name blog.example.com;
 
    root /var/www/blog;
    index index.html;
}
 
# Магазин (PHP-FPM)
server {
    listen 80;
    server_name shop.example.com;
 
    root /var/www/shop/public;
    index index.php index.html;
 
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
 
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass 127.0.0.1:9000;
    }
}

Так Nginx принимает запросы на разные домены и перенаправляет их туда, куда нужно.
Это особенно удобно, если вы разворачиваете целый стек приложений на одном сервере или под одной инфраструктурой Docker.

Проксирование HTTPS-запросов

Чтобы сайт работал по HTTPS, достаточно добавить SSL-сертификат и слушать порт 443.
С помощью Let’s Encrypt это можно сделать буквально одной командой:

sudo certbot --nginx -d example.com -d api.example.com

Certbot автоматически добавит SSL-настройки в конфиги и настроит автоматическое продление сертификатов.

Советы по оптимизации и безопасности

  1. Используйте proxy_buffering off при работе с WebSocket и стримингом.
  2. Добавьте gzip on; — это уменьшит размер передаваемых данных.
  3. Ограничивайте доступ по IP, если у вас внутренние панели или админки.
  4. Следите за логами — они по умолчанию хранятся в /var/log/nginx/access.log и error.log.
  5. Проверяйте конфигурацию перед перезапуском:
sudo nginx -t

Вывод

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

Благодаря гибкости конфигурации и высокой производительности, Nginx остаётся стандартом де-факто для проксирования веб-приложений любого уровня — от простых сайтов до крупных микросервисных систем.

6 минут чтения
Средний рейтинг статьи — 4.8

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний