Files
2026-etpgrf-site/config/nginx/etpgrf--internal-nginx.conf
erjemin 1e86ed1591 add:
- Микроразметка `Schema.org` (JSON-LD) для постов и страниц для улучшения SEO и понимания контента поисковиками и ИИ.
- Файл `llms.txt` для предоставления информации о сайте и API для больших языковых моделей (LLM).

fix:
- Экранирования кавычек в JSON-LD, Title и Description.
- Перезапуск watchtower при его остановке.
2026-02-11 13:39:23 +03:00

134 lines
5.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
user nginx;
worker_processes auto;
pid /var/run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
# --- ОПТИМИЗАЦИЯ ПРОИЗВОДИТЕЛЬНОСТИ ---
# sendfile: Включает копирование данных напрямую в ядре (zero-copy), минуя буфер приложения.
# Это значительно ускоряет раздачу статики и снижает нагрузку на CPU.
sendfile on;
# tcp_nopush: Работает с sendfile. Заставляет отправлять заголовки и начало файла одним пакетом.
tcp_nopush on;
# tcp_nodelay: Отключает буферизацию (алгоритм Нейгла) для keep-alive соединений.
# Данные отправляются мгновенно, интерфейс кажется более отзывчивым.
tcp_nodelay on;
# keepalive_timeout: Время (в секундах), которое соединение висит открытым для повторных запросов.
# 65 секунд — разумный баланс между скоростью и потреблением памяти.
keepalive_timeout 65;
# types_hash_max_size: Увеличивает память для таблицы MIME-типов.
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Логи направляем в стандартный вывод, чтобы Docker их видел
access_log /dev/stdout;
error_log /dev/stderr warn;
# --- ЗАЩИТА ОТ БРУТФОРСА ---
# Создаем зону в памяти, где будут храниться IP-адреса (1MB -- 16000 IP).
# rate=5r/s - разрешаем 5 запросов в секунду (мягкий лимит).
limit_req_zone $binary_remote_addr zone=one:1m rate=5r/s;
# Настройки сжатия gzip
gzip on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_disable "msie6";
gzip_vary on;
gzip_min_length 512;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
# upstream для Gunicorn (имя сервиса из docker-compose)
upstream app_server {
server etpgrf-backend:8000;
}
server {
listen 80;
server_name localhost;
charset utf-8;
# Убираем токены версии nginx для безопасности
server_tokens off;
# --- ЗАЩИТА ОТ БОЛЬШИХ ЗАПРОСОВ ---
# Ограничиваем максимальный размер тела запроса (например, 1MB)
client_max_body_size 1M;
# --- КАСТОМНЫЕ СТРАНИЦЫ ОШИБОК ---
error_page 403 /403.html;
error_page 404 /404.html;
error_page 500 /500.html;
error_page 502 /502.html;
error_page 503 /503.html;
error_page 504 /504.html;
location = /403.html { root /app/public/static_collected; internal; } # файл будет сюда скопирован при сборке образа
location = /404.html { root /app/public/static_collected; internal; }
location = /500.html { root /app/public/static_collected; internal; }
location = /502.html { root /app/public/static_collected; internal; }
location = /503.html { root /app/public/static_collected; internal; }
location = /504.html { root /app/public/static_collected; internal; }
# Прямая раздача favicon.ico
location = /favicon.ico {
alias /app/public/static_collected/favicon.ico;
access_log off;
log_not_found off;
expires 30d;
}
# Robots.txt
location = /robots.txt {
alias /app/public/static_collected/robots.txt;
access_log off;
log_not_found off;
expires 30d;
}
# llms.txt (для ИИ)
location = /llms.txt {
alias /app/public/static_collected/llms.txt;
access_log off;
log_not_found off;
expires 30d;
}
location / {
# --- ЗАЩИТА ОТ БРУТФОРСА ---
# Применяем зону 'one', разрешаем "всплеск" до 10 запросов.
limit_req zone=one burst=10 nodelay;
proxy_pass http://app_server;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
alias /app/public/static_collected/;
# Кэширование на стороне браузера
expires 30d;
add_header Cache-Control "public, no-transform";
}
location /media/ {
alias /app/media/;
}
}
}