- Home »

Настройка Nginx как обратного прокси на Ubuntu 24
Сегодня разберём, как настроить Nginx в качестве обратного прокси на Ubuntu 24. Это одна из самых популярных и практичных задач для любого девопса или системного администратора. Nginx как reverse proxy — это золотая стандартная конфигурация, которая позволяет распределять нагрузку между серверами, скрывать внутреннюю архитектуру, кэшировать контент и обеспечивать SSL-терминацию. Если вы работаете с микросервисами, API или просто хотите разгрузить бэкенд-сервер, эта статья поможет вам быстро и правильно всё настроить.
Как работает обратный прокси?
Обратный прокси (reverse proxy) работает как посредник между клиентами и вашими бэкенд-серверами. В отличие от прямого прокси, который скрывает клиентов от серверов, обратный прокси скрывает серверы от клиентов. Клиент думает, что общается напрямую с веб-сервером, но на самом деле его запросы обрабатывает Nginx, который затем пересылает их на один или несколько бэкенд-серверов.
Основные преимущества:
- Балансировка нагрузки — распределение запросов между несколькими серверами
- SSL-терминация — обработка шифрования на прокси-уровне
- Кэширование — ускорение отдачи статического контента
- Сжатие — уменьшение размера передаваемых данных
- Безопасность — скрытие реальной архитектуры сервера
Быстрая установка и базовая настройка
Начнём с установки Nginx на Ubuntu 24. Обновляем пакеты и устанавливаем сам веб-сервер:
sudo apt update
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
Проверяем статус службы:
sudo systemctl status nginx
Если всё в порядке, Nginx должен быть запущен и доступен по адресу вашего сервера. Теперь создаём базовую конфигурацию обратного прокси.
Создание конфигурации обратного прокси
Создаём новый файл конфигурации для нашего сайта:
sudo nano /etc/nginx/sites-available/reverse-proxy
Базовая конфигурация обратного прокси:
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
proxy_cache_bypass $http_upgrade;
}
}
Активируем конфигурацию:
sudo ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Продвинутые настройки и оптимизация
Для продакшена нужна более серьёзная конфигурация. Вот расширенный вариант с балансировкой нагрузки:
upstream backend {
server 127.0.0.1:3000 weight=3;
server 127.0.0.1:3001 weight=2;
server 127.0.0.1:3002 backup;
}
server {
listen 80;
server_name example.com www.example.com;
# Логирование
access_log /var/log/nginx/reverse-proxy.access.log;
error_log /var/log/nginx/reverse-proxy.error.log;
# Базовые настройки прокси
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
# Таймауты
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Буферизация
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
# Кэширование
proxy_cache_bypass $http_upgrade;
}
# Статические файлы
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
SSL-терминация и HTTPS
Для безопасности обязательно настраиваем SSL. Используем Certbot для получения бесплатного сертификата:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com
После получения сертификата конфигурация автоматически обновится. Но можно настроить SSL вручную:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL настройки
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;
# Остальная конфигурация прокси...
}
# Редирект с HTTP на HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
Практические кейсы и примеры
Рассмотрим несколько реальных сценариев использования:
Кейс 1: Node.js приложение с API
server {
listen 80;
server_name myapp.com;
# API запросы
location /api/ {
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;
}
# Статические файлы
location / {
root /var/www/myapp;
try_files $uri $uri/ /index.html;
}
}
Кейс 2: Микросервисная архитектура
upstream auth_service {
server 127.0.0.1:3001;
}
upstream user_service {
server 127.0.0.1:3002;
}
upstream payment_service {
server 127.0.0.1:3003;
}
server {
listen 80;
server_name api.myapp.com;
location /auth/ {
proxy_pass http://auth_service/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /users/ {
proxy_pass http://user_service/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /payments/ {
proxy_pass http://payment_service/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Мониторинг и диагностика
Для мониторинга работы прокси добавляем специальные эндпоинты:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
location /health {
access_log off;
return 200 "OK\n";
add_header Content-Type text/plain;
}
Полезные команды для диагностики:
# Проверка конфигурации
sudo nginx -t
# Перезагрузка конфигурации
sudo nginx -s reload
# Просмотр логов
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log
# Проверка активных соединений
sudo netstat -tulpn | grep nginx
Сравнение с альтернативными решениями
Решение | Производительность | Простота настройки | Функциональность | Ресурсы |
---|---|---|---|---|
Nginx | Очень высокая | Средняя | Широкая | Низкое потребление |
HAProxy | Высокая | Сложная | Специализированная | Низкое потребление |
Apache HTTP Server | Средняя | Простая | Широкая | Высокое потребление |
Traefik | Средняя | Простая | Контейнер-ориентированная | Среднее потребление |
Автоматизация и скрипты
Создаём простой скрипт для автоматического развертывания:
#!/bin/bash
# deploy-proxy.sh
DOMAIN=$1
BACKEND_PORT=$2
if [ -z "$DOMAIN" ] || [ -z "$BACKEND_PORT" ]; then
echo "Usage: $0 "
exit 1
fi
# Создаём конфигурацию
cat > /etc/nginx/sites-available/$DOMAIN << EOF
server {
listen 80;
server_name $DOMAIN;
location / {
proxy_pass http://127.0.0.1:$BACKEND_PORT;
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;
}
}
EOF
# Активируем сайт
ln -s /etc/nginx/sites-available/$DOMAIN /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
echo "Proxy для $DOMAIN настроен на порт $BACKEND_PORT"
Интересные факты и нестандартные применения
Nginx как обратный прокси можно использовать не только для веб-приложений:
- WebSocket прокси — для real-time приложений
- TCP/UDP прокси — для любых TCP/UDP сервисов (требует модуль stream)
- Прокси для Docker контейнеров — интеграция с Docker Compose
- A/B тестирование — направление трафика на разные версии приложения
Пример конфигурации для WebSocket:
location /ws {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
proxy_read_timeout 86400;
}
Решение типичных проблем
Часто встречающиеся проблемы и их решения:
- 502 Bad Gateway — проверьте, запущен ли бэкенд-сервер
- 504 Gateway Timeout — увеличьте таймауты прокси
- Потеря IP-адреса клиента — убедитесь, что настроены заголовки X-Real-IP и X-Forwarded-For
- Проблемы с большими файлами — настройте client_max_body_size
Для работы с серверами различной конфигурации рекомендую рассмотреть VPS или выделенный сервер — это даст больше контроля над настройками и производительностью.
Мониторинг производительности
Для мониторинга производительности можно использовать различные инструменты:
# Установка htop для мониторинга ресурсов
sudo apt install htop
# Установка iftop для мониторинга сетевого трафика
sudo apt install iftop
# Мониторинг логов в реальном времени
sudo tail -f /var/log/nginx/access.log | grep -E "(5[0-9]{2}|4[0-9]{2})"
Заключение и рекомендации
Nginx как обратный прокси — это мощный и гибкий инструмент, который должен быть в арсенале каждого системного администратора. Он отлично подходит для:
- Производственных систем — высокая производительность и надёжность
- Микросервисных архитектур — удобное разделение трафика
- SSL-терминации — централизованное управление сертификатами
- Балансировки нагрузки — распределение запросов между серверами
Главные преимущества Nginx перед конкурентами — это низкое потребление ресурсов, высокая производительность и гибкость конфигурации. Начните с простой настройки, а затем постепенно добавляйте нужные функции.
Помните про мониторинг и регулярное обновление конфигурации. Nginx — это не "настроил и забыл", это живая система, которая требует внимания и оптимизации под конкретные задачи.
Полезные ссылки для дальнейшего изучения:
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.