# ТЕСТОВОЕ ЗАДАНИЕ РОСМОРПОРТ # == Конфикурационный файл 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