NGINX
#nginx#astro#static#spa#ssg#gzip

Nginx: конфигурация для статического Astro сайта

Конфигурация Nginx для статического Astro сайта с поддержкой SPA роутинга, кеширования, gzip и правильных MIME типов. Основано на официальной документации Astro.

Конфигурация Nginx для статического Astro сайта. Astro генерирует статические файлы в директорию dist/, которые нужно правильно обслуживать через Nginx.

Базовая конфигурация

server {
    listen 80;
    server_name example.com www.example.com;
    
    # Директория с собранным Astro проектом
    root /var/www/example.com/dist;
    index index.html;
    
    access_log /var/log/nginx/astro-access.log;
    error_log  /var/log/nginx/astro-error.log;
    
    # Основной location - поддержка SPA роутинга
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    # Favicon и robots.txt
    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }
    
    location = /robots.txt {
        access_log off;
        log_not_found off;
    }
    
    # Статические файлы с кешированием
    location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|avif|woff|woff2|ttf|eot)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }
    
    # CSS и JS с кешированием
    location ~* \.(css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }
    
    # HTML без кеша (для обновлений контента)
    location ~* \.html$ {
        expires -1;
        add_header Cache-Control "no-cache, no-store, must-revalidate";
    }
    
    # Защита скрытых файлов
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}

С поддержкой gzip и brotli

server {
    listen 80;
    server_name example.com www.example.com;
    
    root /var/www/example.com/dist;
    index index.html;
    
    access_log /var/log/nginx/astro-access.log;
    error_log  /var/log/nginx/astro-error.log;
    
    # Gzip сжатие
    gzip on;
    gzip_vary on;
    gzip_min_length 1000;
    gzip_types text/css application/javascript text/html application/json text/xml application/xml application/xml+rss text/javascript;
    gzip_comp_level 6;
    
    # Brotli сжатие (если модуль установлен)
    # brotli on;
    # brotli_comp_level 6;
    # brotli_types text/css application/javascript text/html application/json text/xml application/xml application/xml+rss text/javascript;
    
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }
    
    location = /robots.txt {
        access_log off;
        log_not_found off;
    }
    
    # Статика с кешем
    location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|avif|woff|woff2|ttf|eot)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }
    
    location ~* \.(css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }
    
    # HTML без кеша
    location ~* \.html$ {
        expires -1;
        add_header Cache-Control "no-cache, no-store, must-revalidate";
    }
    
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}

С поддержкой HTTPS

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    
    root /var/www/example.com/dist;
    index index.html;
    
    # SSL сертификаты
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
    
    access_log /var/log/nginx/astro-access.log;
    error_log  /var/log/nginx/astro-error.log;
    
    # Gzip
    gzip on;
    gzip_vary on;
    gzip_min_length 1000;
    gzip_types text/css application/javascript text/html application/json text/xml application/xml application/xml+rss text/javascript;
    
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }
    
    location = /robots.txt {
        access_log off;
        log_not_found off;
    }
    
    location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|avif|woff|woff2|ttf|eot)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }
    
    location ~* \.(css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }
    
    location ~* \.html$ {
        expires -1;
        add_header Cache-Control "no-cache, no-store, must-revalidate";
    }
    
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}

Важные замечания

⚠️ Директория dist: root должен указывать на директорию dist/, которая создаётся после выполнения astro build.

⚠️ SPA роутинг: try_files $uri $uri/ /index.html; обеспечивает поддержку клиентского роутинга в Astro приложениях.

⚠️ MIME типы: Nginx должен правильно определять MIME типы для CSS и JS файлов. Если возникают проблемы, проверьте /etc/nginx/mime.types.

⚠️ Кеширование: HTML файлы не кешируются для обеспечения актуальности контента. Статические ресурсы (CSS, JS, изображения) кешируются на год с immutable для версионированных файлов.

⚠️ Gzip/Brotli: Включите сжатие для уменьшения размера передаваемых данных. Brotli требует отдельной установки модуля.

Источники: