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 требует отдельной установки модуля.
Источники: