NGINX
#nginx#static#server#try_files#index#spa

Nginx: базовый server block для статического сайта

Минимальная конфигурация nginx для статического сайта (HTML, CSS, JS). try_files, index, обработка ошибок.

Минимальная рабочая конфигурация nginx для статического сайта. Подходит для HTML/CSS/JS сайтов и SPA.

Базовый server block

server {
    listen 80;
    server_name example.com www.example.com;
    
    root /var/www/example.com;
    index index.html index.htm;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

С поддержкой SPA (Single Page Application)

server {
    listen 80;
    server_name example.com;
    
    root /var/www/example.com;
    index index.html;
    
    # Все запросы на index.html (для SPA роутинга)
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    # Кастомная страница 404
    error_page 404 /index.html;
}

С кешированием статики

server {
    listen 80;
    server_name example.com;
    
    root /var/www/example.com;
    index index.html;
    
    # Статика с кешированием
    location ~* \.(jpg|jpeg|png|gif|ico|svg|css|js|woff|woff2)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }
    
    # HTML без кеша
    location ~* \.html$ {
        expires -1;
        add_header Cache-Control "no-cache";
    }
    
    # Основной location
    location / {
        try_files $uri $uri/ /index.html;
    }
}

С gzip сжатием

server {
    listen 80;
    server_name example.com;
    
    root /var/www/example.com;
    index index.html;
    
    # Gzip для текстовых файлов
    gzip on;
    gzip_types text/css application/javascript text/html application/json;
    gzip_min_length 1000;
    
    location / {
        try_files $uri $uri/ /index.html;
    }
}

Полный пример с безопасностью

server {
    listen 80;
    server_name example.com;
    
    root /var/www/example.com;
    index index.html;
    
    # Безопасность
    server_tokens off;
    add_header X-Frame-Options "DENY" always;
    add_header X-Content-Type-Options "nosniff" always;
    
    # Защита скрытых файлов
    location ~ /\. {
        deny all;
        access_log off;
    }
    
    # Статика с кешем
    location ~* \.(jpg|jpeg|png|gif|ico|svg|css|js|woff|woff2)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
    
    # Основной location
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    # Кастомная 404
    error_page 404 /index.html;
}

Usage:

Создайте файл в /etc/nginx/sites-available/example.com, добавьте конфигурацию, создайте symlink в sites-enabled и перезагрузите nginx.

Notes:

⚠️ try_files $uri $uri/ /index.html означает: попробуй файл, потом директорию, если не найдено — верни index.html (для SPA). Используйте expires -1 для HTML, чтобы изменения применялись сразу после деплоя. immutable подходит только для версионированных файлов (например, app.abc123.js).