Настройка Nginx в качестве reverse proxy для backend-приложений
Введение
В современных серверных конфигурациях приложения редко взаимодействуют с интернетом напрямую. Вместо этого перед ними располагается reverse proxy, который обрабатывает входящие клиентские запросы. Nginx — один из самых популярных инструментов для этой задачи, поскольку он быстрый, надёжный и простой в настройке. В этом руководстве вы узнаете, как настроить Nginx в качестве reverse proxy для backend-приложения, работающего на том же сервере.
Что такое reverse proxy?
Reverse proxy — это сервер, который:
- Принимает запросы от клиентов (браузеров, API и т.д.)
- Перенаправляет эти запросы backend-приложению
- Возвращает клиенту ответ от backend
Клиент никогда не взаимодействует напрямую с backend-приложением.
Reverse proxy vs прямой доступ
Без reverse proxy:
Client ---> Backend application (port 3000)
С reverse proxy:
Client ---> Nginx (port 80, 443) ---> Backend application (port 3000)
Зачем использовать Nginx как reverse proxy?
Использование Nginx перед приложением позволяет:
- Открывать в интернет только порты 80/443
- Скрывать backend-сервисы от прямого доступа
- Терминировать HTTPS (TLS) в одном месте
- Добавлять логирование, контроль доступа и ограничение скорости
- Запускать несколько приложений на одном сервере
Для системных администраторов это означает высокий уровень безопасности и простое управление.
Сценарий, используемый в этом руководстве
Для простоты используем следующую схему:
- Nginx слушает порт
80 - Backend-приложение слушает
127.0.0.1:3000 - Запросы к
http://example.comперенаправляются на backend
Схема движения трафика
[ Browser ] | v [ Nginx example.com:80,443 ] | v [ Backend app 127.0.0.1:3000 ]
Предварительные требования
Перед началом убедитесь, что у вас есть:
- Linux-сервер с последней стабильной версией Debian
- Доступ root или sudo
- Уже запущенное backend-приложение (например, Node.js, Python или Java)
- Базовое понимание работы в терминале Linux
Установка Nginx
Обновите список пакетов и установите Nginx и curl (для тестирования):
sudo apt update
sudo apt install nginx curl
Проверьте, что Nginx запущен:
systemctl status nginx
В выводе должно присутствовать "active (running)".
Протестируйте Nginx локально:
curl http://localhost
Если Nginx работает, вы получите стандартную страницу приветствия.
Структура конфигурации Nginx
Файлы конфигурации Nginx обычно находятся в /etc/nginx/. Важные директории:
/etc/nginx/nginx.conf— основной конфигурационный файл/etc/nginx/sites-available/— конфигурации сайтов (неактивные)/etc/nginx/sites-enabled/— активные конфигурации (символические ссылки)
Nginx читает конфигурации из каталога sites-enabled, а не напрямую из sites-available. Рекомендуется создавать файлы конфигурации в sites-available и затем создавать символические ссылки в sites-enabled.
Создание конфигурации reverse proxy
Создание нового файла сайта
sudo nano /etc/nginx/sites-available/reverse-proxy.conf
Добавьте конфигурацию reverse proxy
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; } }
Разбор конфигурации
Блок server
server { listen 80; server_name example.com; }
listen 80;— Nginx слушает HTTP-трафик на порту 80server_name example.com;— доменное имя, для которого применяется этот блок
Блок location
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; }
location /— соответствует всем входящим URLproxy_pass— перенаправляет запросы backend-приложению
Proxy-заголовки
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;
Эти заголовки позволяют backend-приложению знать:
- Оригинальное доменное имя
- Реальный IP-адрес клиента
- Был ли запрос HTTP или HTTPS
Без этих заголовков backend может логировать некорректную информацию о клиентах.
Активация конфигурации
Отключите стандартный сайт Nginx, чтобы избежать конфликтов на порту 80:
sudo rm /etc/nginx/sites-enabled/default
Создайте символическую ссылку для активации сайта:
sudo ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/
Проверьте конфигурацию на ошибки синтаксиса:
sudo nginx -t
Если всё успешно, перезагрузите Nginx:
sudo systemctl reload nginx
Тестирование reverse proxy
Проверьте с сервера:
curl http://example.com
Откройте http://example.com в браузере. Вы должны получить ответ от backend-приложения, а не стандартную страницу Nginx. Если всё настроено правильно, загрузится ваше приложение.
Как обрабатывается запрос
- Клиент отправляет запрос к example.com
- Nginx принимает запрос на порту 80
- Nginx пересылает запрос на 127.0.0.1:3000
- Backend обрабатывает запрос
- Ответ возвращается через Nginx
- Клиент получает ответ
Частые ошибки и устранение неисправностей
Backend не запущен
- Убедитесь, что приложение работает
- Проверьте правильность порта
ss -tuln | grep 3000
Неверный адрес proxy_pass
- Всегда указывайте
http:// - Проверьте IP-адрес и порт
Забыли перезагрузить Nginx
После каждого изменения конфигурации:
sudo systemctl reload nginx
Фаервол блокирует доступ
Убедитесь, что порт 80 открыт:
sudo ufw allow 80
Дополнительные улучшения
После настройки reverse proxy можно:
- Включить HTTPS с помощью Let's Encrypt
- Запустить несколько backend-приложений
- Добавить access-логи и error-логи
- Настроить балансировку нагрузки
- Поддержать WebSocket-соединения
Настройка HTTPS
В production-среде всегда следует использовать HTTPS вместо HTTP. HTTPS шифрует трафик между клиентом и сервером, защищая пароли, API-токены, cookie и другие чувствительные данные. Nginx поддерживает HTTPS с использованием SSL/TLS-сертификатов. В этом разделе вы узнаете:
- Что такое Certbot
- Как установить Certbot
- Как Certbot автоматически изменяет конфигурацию Nginx
- Как вручную настроить Nginx с использованием купленного сертификата
Что такое Certbot?
Certbot — это инструмент, который автоматически получает и устанавливает бесплатные SSL/TLS-сертификаты от Let's Encrypt. Он может:
- Запросить бесплатный сертификат
- Подтвердить владение доменом
- Автоматически настроить Nginx
- Настроить автоматическое продление сертификата
Для начинающих и большинства production-сред Certbot — самый простой и безопасный способ включить HTTPS.
Установка Certbot (Debian/Ubuntu)
Обновите список пакетов:
sudo apt update
Установите Certbot и плагин для Nginx:
sudo apt install certbot python3-certbot-nginx
Пакет python3-certbot-nginx позволяет Certbot автоматически изменять конфигурацию Nginx.
Получение и установка сертификата
Перед запуском Certbot убедитесь, что:
- Домен указывает на публичный IP вашего сервера
- Nginx запущен
- Порты 80 и 443 открыты в фаерволе
Запустите:
sudo certbot --nginx
Certbot:
- Спросит, какой домен нужно защитить
- Подтвердит владение доменом
- Автоматически обновит конфигурацию Nginx
- Перезагрузит Nginx
Certbot автоматически изменяет конфигурацию Nginx. Обычно он добавляет новый блок server для порта 443 (HTTPS), пути к SSL-сертификатам, настраивает редирект HTTP → HTTPS (если вы выбрали этот вариант) и добавляет рекомендуемые SSL-настройки.
Пример конфигурации, добавленной Certbot:
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 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; } }
Certbot также может изменить HTTP-блок для редиректа:
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
Поскольку Certbot автоматически изменяет конфигурацию, рекомендуется:
- Делать резервные копии конфигурации
- Понимать, какие изменения были внесены
- Всегда проверять конфигурацию после изменений
Проверка конфигурации:
sudo nginx -t
Автоматическое продление сертификата
Сертификаты Let's Encrypt действительны 90 дней. Certbot автоматически настраивает таймер продления. Проверить можно так:
sudo certbot renew --dry-run
При правильной настройке продление будет происходить автоматически без простоя.
Использование купленного SSL-сертификата
Если вы приобрели SSL-сертификат у центра сертификации (CA), настройку нужно выполнить вручную. После покупки вы обычно получаете:
- Файл сертификата (например,
example.com.crt) - Приватный ключ (
example.com.key) - Файл цепочки сертификатов (
ca_bundle.crt)
Создайте защищённый каталог:
sudo mkdir -p /etc/nginx/ssl
sudo chmod 700 /etc/nginx/ssl
Скопируйте файлы сертификата в этот каталог.
Пример HTTPS-конфигурации с купленным сертификатом:
server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_trusted_certificate /etc/nginx/ssl/ca_bundle.crt; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; 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 → HTTPS:
server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; }
Перезагрузите Nginx после ручной настройки:
sudo nginx -t
sudo systemctl reload nginx
Для начинающих системных администраторов настоятельно рекомендуется использовать Certbot, если политика вашей организации не требует коммерческих сертификатов.
Итоги
В этом руководстве вы узнали:
- Что такое reverse proxy и зачем он нужен
- Как Nginx перенаправляет запросы backend-приложениям
- Как создать и активировать конфигурацию reverse proxy
- Как тестировать и устранять распространённые ошибки
- Как настроить HTTPS
Настройка Nginx в качестве reverse proxy — базовый и крайне важный навык для системных администраторов, широко используемый в production-средах.