- Расширенное логирование с форматом 'main' (IP, время, метод, URL, статус) - Буферизированные логи с 5-сек очисткой для оптимизации дискового I/O - Rate-limiting: 100 req/s на IP, burst=200 для легитимного трафика - Логирование статики и медиа включено для анализа попыток сканирования - Отключен log_not_found для уменьшения размера логов (404 всё равно в error_log) - Добавлено уточнение что WhiteNoise уже сжимает статику (gzip в nginx не нужен)
139 lines
8.7 KiB
Plaintext
139 lines
8.7 KiB
Plaintext
# ТЕСТОВОЕ ЗАДАНИЕ РОСМОРПОРТ
|
||
# == Конфикурационный файл config/nginx/pet-clones--external-nginx.conf ==
|
||
|
||
# Внешний nginx конфиг для проксирования к контейнеру petclones-site--backend
|
||
# Это конфиг для ХОСТА (не внутри контейнера)
|
||
|
||
# Upstream (группировка backends) для проксирования запросов в Django контейнер
|
||
upstream petclones-backend {
|
||
# Контейнер слушает на 127.0.0.1:8040 согласно docker-compose.prod.yml
|
||
server 127.0.0.1:8040;
|
||
# Сохраняем persistent соединения (требует proxy_http_version 1.1 и proxy_set_header Connection "")
|
||
keepalive 32;
|
||
}
|
||
|
||
# Основной server блок для обработки HTTP запросов
|
||
server {
|
||
# Слушаем на стандартном HTTP порту (80) для IPv4 и IPv6
|
||
listen 80;
|
||
listen [::]:80;
|
||
server_name pet-clones.cube2.ru;
|
||
|
||
# Редирект HTTP → HTTPS (будет активирован после добавления SSL сертификата через certbot)
|
||
# Раскомментируй эту строку после получения SSL сертификата:
|
||
# return 301 https://$server_name$request_uri;
|
||
|
||
# Логирование запросов и ошибок для этого виртуального хоста
|
||
access_log /var/log/nginx/petclones.access.log;
|
||
error_log /var/log/nginx/petclones.error.log warn;
|
||
|
||
# Rate-limiting для защиты от DDoS и автоматизированных запросов
|
||
# Разрешаем максимум 100 запросов в секунду с одного IP адреса
|
||
limit_req_zone $binary_remote_addr zone=petclones_limit:10m rate=100r/s;
|
||
limit_req zone=petclones_limit burst=200 nodelay;
|
||
|
||
# ОСНОВНОЙ БЛОК ПРОКСИРОВАНИЯ
|
||
# Все запросы, кроме перехвачённых специфичными location'ами, проксируются сюда
|
||
location / {
|
||
# Проксируем все запросы в upstream контейнер
|
||
proxy_pass http://petclones-backend;
|
||
|
||
# --- ЗАГОЛОВКИ ДЛЯ КОРРЕКТНОЙ РАБОТЫ ПРИЛОЖЕНИЯ ---
|
||
# Передаём оригинальный хост (важно для правильной работы Django и генерации URLs)
|
||
proxy_set_header Host $host;
|
||
# Передаём оригинальный IP клиента (для логирования и rate-limiting)
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
# Добавляем этот прокси в цепь X-Forwarded-For (если было несколько проксей)
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
# Передаём оригинальный протокол (HTTP или HTTPS) - важно для правильной работы redirect'ов
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
# Передаём оригинальный хост (может отличаться от Host если используется load balancer)
|
||
proxy_set_header X-Forwarded-Host $server_name;
|
||
# Передаём порт если не стандартный
|
||
proxy_set_header X-Forwarded-Port $server_port;
|
||
|
||
# --- HTTP KEEP-ALIVE ДЛЯ ПРОИЗВОДИТЕЛЬНОСТИ ---
|
||
# Используем HTTP 1.1 для поддержки keep-alive
|
||
proxy_http_version 1.1;
|
||
# Очищаем Connection header (иначе будет "Connection: close")
|
||
proxy_set_header Connection "";
|
||
|
||
# --- ТАЙМАУТЫ ДЛЯ ДЛИТЕЛЬНЫХ ЗАПРОСОВ ---
|
||
# Время ожидания подключения к backend
|
||
proxy_connect_timeout 60s;
|
||
# Время ожидания отправки запроса на backend
|
||
proxy_send_timeout 60s;
|
||
# Время ожидания ответа от backend (может быть увеличено если есть долгие запросы)
|
||
proxy_read_timeout 60s;
|
||
|
||
# --- БУФЕРИЗАЦИЯ ОТВЕТОВ ---
|
||
# Включаем буферизацию (nginx буферизирует ответ перед отправкой клиенту)
|
||
# Это экономит память backend если клиент медленный
|
||
proxy_buffering on;
|
||
# Размер буфера для первой части ответа (заголовки)
|
||
proxy_buffer_size 4k;
|
||
# Количество и размер буферов для основного тела ответа
|
||
proxy_buffers 8 4k;
|
||
}
|
||
|
||
# КЭШИРОВАНИЕ СТАТИЧЕСКИХ ФАЙЛОВ
|
||
# Кэшируем: HTML, изображения, стили, скрипты, шрифты и иконки
|
||
# ВАЖНО: WhiteNoise уже сжимает статику в контейнере (Gzip в nginx не нужен)
|
||
location ~* \.(htm|html|gif|png|jpe?g|svg|ico|css|js|woff|woff2|ttf|eot)$ {
|
||
# Проксируем запрос к backend (статика часть контейнера)
|
||
proxy_pass http://petclones-backend;
|
||
# Передаём хост в заголовке
|
||
proxy_set_header Host $host;
|
||
|
||
# --- КЭШИРОВАНИЕ В БРАУЗЕРЕ КЛИЕНТА ---
|
||
# Если файлы имеют хеш в названии (например: app.abc123.js), то cache-control может быть очень долгой
|
||
# "immutable" говорит браузеру что файл никогда не изменится (если изменится, то будет другой хеш)
|
||
add_header Cache-Control "public, max-age=604800, immutable"; # 7 дней в секундах (604800 = 7*24*60*60)
|
||
|
||
# ЛОГИРОВАНИЕ ВКЛЮЧЕНО для CrowdSec анализа подозрительных запросов к статике
|
||
# CrowdSec может обнаруживать попытки доступа к несуществующим файлам (признак сканирования)
|
||
# Отключаем логирование только найденных файлов (404 всё равно логируются в error_log)
|
||
access_log /var/log/nginx/petclones.access.log main buffer=32k flush=5s;
|
||
log_not_found off; # Не логируем 404 статики (слишком много шума)
|
||
}
|
||
|
||
# КЭШИРОВАНИЕ МЕДИА ФАЙЛОВ
|
||
# Медиа загруженные пользователями кэшируются меньше чем статика (на случай удаления или обновления)
|
||
location ~* ^/media/.*\.(jpg|jpeg|png|gif|webp|svg|pdf|mp4|webm)$ {
|
||
proxy_pass http://petclones-backend;
|
||
proxy_set_header Host $host;
|
||
# Кэшируем на 30 дней (можно менять в зависимости от политики)
|
||
add_header Cache-Control "public, max-age=2592000"; # 30 дней в секундах (30*24*60*60)
|
||
|
||
# ЛОГИРОВАНИЕ ВКЛЮЧЕНО для CrowdSec анализа
|
||
# Подозрительные скачивания медиа файлов (боты, жесткие сканеры и т.п.) должны логироваться
|
||
access_log /var/log/nginx/petclones.access.log main buffer=32k flush=5s;
|
||
}
|
||
}
|
||
|
||
# HTTPS SERVER БЛОК (ДОБАВИТЬ ПОСЛЕ ПОЛУЧЕНИЯ SSL СЕРТИФИКАТА)
|
||
# После получения SSL сертификата через certbot, раскомментируй и настрой эту секцию:
|
||
#
|
||
# server {
|
||
# listen 443 ssl http2;
|
||
# listen [::]:443 ssl http2;
|
||
# server_name pet-clones.cube2.ru;
|
||
#
|
||
# # SSL сертификаты от certbot
|
||
# ssl_certificate /etc/letsencrypt/live/pet-clones.cube2.ru/fullchain.pem;
|
||
# ssl_certificate_key /etc/letsencrypt/live/pet-clones.cube2.ru/privkey.pem;
|
||
#
|
||
# # Параметры безопасности SSL
|
||
# ssl_protocols TLSv1.2 TLSv1.3;
|
||
# ssl_ciphers HIGH:!aNULL:!MD5;
|
||
# ssl_prefer_server_ciphers on;
|
||
#
|
||
# # остальная конфигурация идентична HTTP блоку выше...
|
||
# # (копируешь content из server блока выше и вставляешь сюда)
|
||
# }
|
||
#
|
||
# ТАКЖЕ НЕ ЗАБУДЬ:
|
||
# 1. Установи certbot: sudo apt-get install certbot python3-certbot-nginx
|
||
# 2. Получи сертификат: sudo certbot certonly --standalone -d pet-clones.cube2.ru
|
||
# 3. Перезагрузи nginx: sudo systemctl restart nginx
|