Перейти к содержанию

Веб-прокси nginx

Роль nginx в архитектуре

На боевом сервере nginx выполняет роль обратного прокси-сервера: принимает все входящие запросы из интернета и перенаправляет их нужному сервису в зависимости от доменного имени и пути запроса.

Внутренние сервисы (серверная часть, пользовательский интерфейс, документация) слушают только на локальном адресе --- напрямую из интернета они недоступны.

Домены и маршрутизация

Домен Куда перенаправляется Порт назначения
alfainft.monroe-tech.ru Пользовательский интерфейс React localhost:3000
alfainft-api.monroe-tech.ru Серверная часть FastAPI localhost:8000
alfainft-minio.monroe-tech.ru Консоль MinIO localhost:9001
alfainft-docs.monroe-tech.ru Сайт документации MkDocs localhost:8088

Файлы конфигурации

Конфигурации nginx хранятся в двух местах:

  1. В репозитории --- каталог nginx/:

    • nginx.prod.conf --- основная конфигурация для серверной части и пользовательского интерфейса
    • alfainft-docs.conf --- конфигурация для сайта документации
    • nginx.conf --- конфигурация для локальной разработки
  2. На сервере --- каталог /etc/nginx/sites-available/ с символическими ссылками из /etc/nginx/sites-enabled/.

Основная конфигурация

Файл nginx.prod.conf описывает обработку запросов к основному домену:

  • Запросы с путём /api/ перенаправляются серверной части. К ним применяется ограничение частоты (10 запросов в секунду на один адрес клиента, с допуском до 20 запросов в пике).
  • Запрос /health перенаправляется на проверку здоровья серверной части.
  • Все остальные запросы попадают в пользовательский интерфейс.

Настройки безопасности:

  • Заголовок X-Frame-Options: SAMEORIGIN --- запрет встраивания страницы в чужие сайты.
  • Заголовок X-Content-Type-Options: nosniff --- запрет браузеру угадывать тип содержимого.
  • Заголовок X-XSS-Protection --- дополнительная защита от межсайтового выполнения скриптов.
  • Максимальный размер загружаемого файла --- 100 МБ (client_max_body_size 100M).

Тайм-ауты для обращений к серверной части увеличены до 300 секунд (5 минут), так как обработка крупных файлов может занимать длительное время.

Сжатие включено для текстовых форматов (HTML, CSS, JSON, JavaScript, XML).

Конфигурация документации

Файл alfainft-docs.conf описывает отдельный виртуальный сервер для домена alfainft-docs.monroe-tech.ru. Все запросы перенаправляются на контейнер документации (localhost:8088).

SSL-сертификаты

Сертификаты выпускаются через Let's Encrypt с помощью утилиты certbot. В конфигурациях предусмотрен блок /.well-known/acme-challenge/ для прохождения проверки владения доменом.

После выпуска сертификата нужно:

  1. Раскомментировать блок HTTPS в соответствующем файле конфигурации.
  2. Включить перенаправление с HTTP на HTTPS.
  3. Перечитать конфигурацию nginx:
sudo nginx -t && sudo systemctl reload nginx

Пути к файлам сертификатов:

/etc/letsencrypt/live/<домен>/fullchain.pem   # сертификат
/etc/letsencrypt/live/<домен>/privkey.pem      # закрытый ключ

Размещение конфигурации на сервере

Для добавления нового домена (например, документации):

# Передать файл конфигурации
scp nginx/alfainft-docs.conf alfa:/etc/nginx/sites-available/

# Создать символическую ссылку
ssh alfa "ln -sf /etc/nginx/sites-available/alfainft-docs.conf /etc/nginx/sites-enabled/"

# Проверить конфигурацию
ssh alfa "nginx -t"

# Применить
ssh alfa "systemctl reload nginx"

Защита от индексации

Если требуется запретить поисковым системам индексировать сайт, в конфигурацию виртуального сервера можно добавить:

add_header X-Robots-Tag "noindex, nofollow" always;

Или создать файл robots.txt в корне сайта с содержимым:

User-agent: *
Disallow: /