# nginx-конфиг внутри контейнера (статика Astro) # TLS терминируется на хост-уровне (web.hhivp.com), здесь только HTTP. server { listen 80 default_server; server_name _; root /usr/share/nginx/html; index index.html; # Логи — на stdout/stderr контейнера (видны через docker logs) access_log /dev/stdout; error_log /dev/stderr warn; # Безопасность: запрет на скрытые файлы (но разрешаем .well-known для LE) location ~ /\.(?!well-known) { deny all; log_not_found off; access_log off; } # ──────────────────────────────────────────────────────────────── # Сжатие # ──────────────────────────────────────────────────────────────── gzip on; gzip_vary on; gzip_min_length 256; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css text/xml application/json application/xml application/rss+xml application/atom+xml application/javascript application/x-javascript image/svg+xml font/woff2; # ──────────────────────────────────────────────────────────────── # MIME для RSS-фидов и текстовых служебных файлов # ──────────────────────────────────────────────────────────────── location = /feed.xml { default_type application/rss+xml; charset utf-8; try_files /feed.xml =404; expires 5m; add_header Cache-Control "public, max-age=300, must-revalidate"; } location ~ ^/category/[^/]+/feed\.xml$ { default_type application/rss+xml; charset utf-8; expires 5m; add_header Cache-Control "public, max-age=300, must-revalidate"; } location = /sitemap.txt { default_type text/plain; charset utf-8; } location = /robots.txt { default_type text/plain; charset utf-8; } location = /ai.txt { default_type text/plain; charset utf-8; } location = /llms.txt { default_type text/plain; charset utf-8; } # ──────────────────────────────────────────────────────────────── # Кэш статики (хеш у Astro в имени файла) # ──────────────────────────────────────────────────────────────── location /_astro/ { expires 1y; add_header Cache-Control "public, immutable, max-age=31536000"; access_log off; } location ~* \.(?:css|js|woff2?|ttf|otf|eot)$ { expires 30d; add_header Cache-Control "public, max-age=2592000"; access_log off; } location ~* \.(?:png|jpe?g|gif|svg|webp|avif|ico)$ { expires 30d; add_header Cache-Control "public, max-age=2592000"; access_log off; } # ──────────────────────────────────────────────────────────────── # Маршрутизация: trailingSlash: 'always' уже встроен в Astro, # все страницы экспортированы как dir/index.html # ──────────────────────────────────────────────────────────────── location / { try_files $uri $uri/ $uri.html =404; } # Кастомная 404 error_page 404 /404.html; location = /404.html { internal; } }