Ссылка скопирована

Кэширование сайта — Apache vs Nginx

DonVardixDonVardix—

Введение

Без настроенного кеширования браузер пользователя вынужден при каждом переходе повторно скачивать тяжелые статические файлы (изображения, стили, скрипты, шрифты). Это увеличивает время ответа сервера, расходует трафик и ухудшает метрики Core Web Vitals (LCP, Speed Index).

Что будет сделано:

  • Разобраны типы кешируемой статики и принципы работы Browser Cache;
  • Настроены правила кеширования и заголовки Cache-Control для веб-сервера Apache через .htaccess;
  • Сконфигурированы блоки location и директива expires для Nginx;
  • Разобрана альтернативная настройка через прокси Cloudflare для shared-хостингов.

Результат: ускорение повторной загрузки страниц до 2–5 раз за счет локального сохранения ресурсов в браузере и снижение нагрузки на сервер.


1. Объекты браузерного кеширования

Браузерный кеш (browser cache) сохраняет файлы на устройстве пользователя. В отличие от page cache (кеширования готового HTML), browser cache отвечает только за статические ресурсы.

Кешированию подлежат:

  • Изображения: JPG, PNG, GIF, WebP, SVG, ICO;
  • Стили и скрипты: CSS, JS;
  • Шрифты: WOFF2, WOFF, TTF, EOT.

При повторном визите браузер проверяет локальный диск или память и загружает файл без сетевого запроса к серверу со статусом 200 (from memory cache) или 304 Not Modified.


2. Настройка кеширования в Apache

На серверах под управлением Apache или классических shared-хостингах кеширование настраивается через файл .htaccess в корневой директории сайта.

2.1. Модуль mod_expires

Модуль mod_expires выставляет дату истечения срока действия ресурса:

<IfModule mod_expires.c>
  ExpiresActive On

  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/png  "access plus 1 year"
  ExpiresByType image/gif  "access plus 1 year"
  ExpiresByType image/webp "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
  ExpiresByType image/x-icon "access plus 1 year"

  ExpiresByType font/woff2 "access plus 1 year"
  ExpiresByType font/woff  "access plus 1 year"

  ExpiresByType text/css "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"

  ExpiresDefault "access plus 7 days"
</IfModule>

2.2. Заголовки Cache-Control

Для современных браузеров и прокси-серверов рекомендуется явно передавать заголовок Cache-Control:

<IfModule mod_headers.c>
  <FilesMatch "\.(css|js|jpg|jpeg|png|gif|webp|svg|ico|woff2|woff)$">
    Header set Cache-Control "public, max-age=31536000"
  </FilesMatch>
</IfModule>

3. Настройка кеширования в Nginx

В Nginx отсутствуют файлы локальных переопределений типа .htaccess. Конфигурация вносится непосредственно в файл виртуального хоста в блоке server { ... } (например, /etc/nginx/sites-available/example.com).

Добавьте правила после директив root и index:

server {
    listen 80;
    server_name example.com;

    root /var/www/example.com/public;
    index index.php index.html;

    # Кеширование изображений и шрифтов (1 год)
    location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|woff2|woff)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    # Кеширование CSS и JS (30 дней)
    location ~* \.(css|js)$ {
        expires 30d;
        add_header Cache-Control "public";
        access_log off;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
        include fastcgi_params;
    }
}

Директива access_log off; отключает запись запросов статики в журнал, экономя дисковые операции сервера.


4. Настройка кеширования в Cloudflare

Если проект размещен на shared-хостинге без доступа к конфигурационным файлам сервера, оптимальный путь — подключение сайта через прокси Cloudflare.

4.1. Параметр Browser Cache TTL

В панели управления Cloudflare перейдите в раздел:

Caching → Configuration → Browser Cache TTL

Рекомендуемое значение для стабильных проектов — 1 month.

4.2. Очистка кеша

После внесения изменений в стили или скрипты сбросьте кеш прокси:

Caching → Configuration → Purge Cache → Purge Everything

Вывод

Настройка отдачи статических файлов завершена. Для стабильной эксплуатации соблюдайте ключевые правила версионирования и контроля заголовков.

1. Чек-лист версионирования ассетов

При долгом сроке жизни кеша (1y или 30d) браузер не запрашивает файл повторно до истечения срока. Чтобы изменения вступили в силу мгновенно:

  1. Используйте query-параметры версий: /assets/css/app.css?v=1.0.4
  2. Используйте хеши в именах файлов (рекомендуется): /assets/css/app.9b2c1f.css
  3. Не кешируйте HTML: кеширование главного документа запрещено, иначе клиент никогда не получит ссылки на обновленные ассеты.

2. Проверка заголовков ответа

Проверьте корректность отдачи заголовков с помощью curl:

curl -I https://example.com/assets/css/app.css

Ищите в ответе строки:

Cache-Control: public, max-age=2592000
Expires: ...

3. Шпаргалка команд

  • Проверка конфигурации Nginx: sudo nginx -t
  • Перезагрузка Nginx: sudo systemctl reload nginx
  • Проверка Apache: sudo apachectl configtest
  • Перезагрузка Apache: sudo systemctl reload apache2