Грамотная настройка 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;
}
Используйте 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