Настройка proxy_pass и server_name в Nginx: Полное руководство с примерами

Настройка proxy_pass и server_name в Nginx: Полное руководство с примерами

Nginx — мощный инструмент для проксирования запросов и управления серверами. Ключевые директивы proxy_pass и server_name позволяют гибко маршрутизировать трафик между приложениями. В этом руководстве разберем их работу, практическое применение и лучшие настройки для вашей инфраструктуры.

Что такое server_name и proxy_pass в Nginx?

Директива server_name определяет, какой домен или IP-адрес обрабатывает текущий server-блок. Она позволяет Nginx выбирать конфигурацию на основе имени запроса. Например:

  • server_name example.com; — обрабатывает запросы к example.com
  • server_name *.example.com; — ловит все поддомены
  • server_name _; — ловит все нераспознанные запросы

proxy_pass перенаправляет запросы на другой сервер (бэкенд). Например, для Node.js или Python-приложений:

location / {
  proxy_pass http://localhost:3000;
}

Вместе эти инструменты создают гибкую систему маршрутизации, где Nginx выступает обратным прокси.

Пошаговая настройка proxy_pass и server_name

  1. Создайте конфиг в /etc/nginx/sites-available/your_app
  2. Определите server_name:
    server {
      listen 80;
      server_name api.your-domain.com;
    }
  3. Добавьте location с proxy_pass:
    location / {
      proxy_pass http://127.0.0.1:8080;
      proxy_set_header Host $host;
    }
  4. Проверьте конфигурацию: nginx -t
  5. Перезагрузите Nginx: systemctl reload nginx

Ключевые параметры для proxy_pass:

  • proxy_set_header Host $host — передает исходный домен
  • proxy_redirect off — отключает перезапись URL
  • proxy_buffering on — ускоряет передачу данных

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

Пример 1: Прокси на локальное приложение

server {
  listen 80;
  server_name app.example.com;

  location / {
    proxy_pass http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
  }
}

Пример 2: Балансировка между серверами

upstream backend {
  server 192.168.1.10:8000;
  server 192.168.1.11:8000;
}

server {
  server_name example.ru;
  location / {
    proxy_pass http://backend;
  }
}

Лучшие практики оптимизации

  • Кэширование статики: Отдавайте файлы напрямую через Nginx, минуя бэкенд
  • Таймауты: Настройте proxy_connect_timeout 5s; для защиты от “висячих” соединений
  • Безопасность: Всегда передавайте заголовки X-Forwarded-For и X-Real-IP
  • SSL Termination: Разгрузите бэкенд, обрабатывая HTTPS на Nginx

FAQ: Ответы на частые вопросы

Как обработать несколько доменов в одном server-блоке?

Перечислите домены через пробел:

server_name domain1.com domain2.com *.domain3.com;

Почему proxy_pass возвращает 502 ошибку?

Основные причины:

  1. Бэкенд-сервер не запущен
  2. Неправильный порт в proxy_pass
  3. Ошибки в firewall правилах

Проверьте логи: tail -f /var/log/nginx/error.log

Как проксировать WebSocket-соединения?

Добавьте в location:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Эти заголовки обеспечивают upgrade протокола с HTTP на WebSocket.

Можно ли использовать переменные в proxy_pass?

Да, но с осторожностью:

set $backend "http://service-1";
proxy_pass $backend;

Избегайте циклов перенаправлений и проверяйте синтаксис.

Правильная настройка proxy_pass и server_name — основа производительности и безопасности ваших сервисов. Тестируйте конфиги в staging-среде, используйте мониторинг и регулярно обновляйте Nginx для максимальной эффективности.

Proxy Ninja
Добавить комментарий