Системный журнал — практичная база знаний по VPS и Linux
Nginx • HTTP • статический сайт

Грамотная настройка nginx для статического сайта

Nginx для статического сайта должен быть простым, быстрым и предсказуемым. Хорошая конфигурация не пытается решить всё сразу: она отдаёт файлы, закрывает лишнее, корректно кэширует статику и понятно пишет ошибки.

Разделите основной сайт и неизвестные хосты

На публичный IP будут приходить запросы с чужими Host-заголовками. Это нормальный фон интернета: сканеры, боты, старые домены, случайные запросы. Поэтому полезно иметь отдельный default_server, который не обслуживает чужие имена.

server {
    listen 80 default_server;
    server_name _;
    return 444;
}

Такой блок уменьшает шум и не показывает содержимое сайта по случайным Host-запросам.

Правильно задайте root и index

Директива root должна указывать на каталог, где лежит index.html и остальные файлы сайта. Частая ошибка — указать родительский каталог или ошибиться в одной цифре IP/пути.

server {
    listen 80;
    server_name sysjournal.site;
    root /var/www/sysjournal.site;
    index index.html;
}
Если root указан неправильно, nginx может отдавать 403, 404 или показывать не тот сайт.

Используйте try_files для нормальной отдачи страниц

Для статического сайта try_files позволяет искать файл, каталог или возвращать главную страницу. Это удобно, если часть ссылок сделана как человекочитаемые пути.

location / {
    try_files $uri $uri/ /index.html;
}

Кэшируйте только статические файлы

CSS, JS, изображения и шрифты можно кэшировать надолго. HTML лучше не кэшировать агрессивно, потому что изменения на сайте могут не появиться у пользователей сразу.

location ~* \.(?:jpg|jpeg|gif|png|webp|ico|svg|css|js|woff2?)$ {
    expires 30d;
    add_header Cache-Control "public, max-age=2592000, immutable";
    try_files $uri =404;
}

Добавьте базовые заголовки безопасности

Для статического сайта полезны простые security headers. Они не делают сайт неуязвимым, но закрывают ряд типовых проблем браузерного уровня.

  • X-Content-Type-Options снижает риск неверного определения MIME-типа;
  • X-Frame-Options защищает от простого встраивания в iframe;
  • Referrer-Policy ограничивает передачу referrer;
  • Permissions-Policy отключает ненужные браузерные API.

Проверяйте конфиг перед reload

Nginx не стоит перезапускать вслепую. Сначала проверяется синтаксис, затем выполняется reload. Так активные соединения не обрываются без необходимости.

nginx -t
systemctl reload nginx
journalctl -u nginx --no-pager -n 50