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

    Кеширование — это одна из самых простых и при этом самых эффективных оптимизаций сайта.
    Независимо от того, на чём он написан — PHP, Laravel, WordPress, SPA или просто HTML — принципы кеширования одинаковые.

    Что именно мы кешируем

    В этой статье речь идёт о browser cache, то есть кешировании на стороне браузера.

    Обычно сюда входят:

    • изображения;
    • CSS;
    • JavaScript;
    • шрифты;
    • другие статические файлы.

    Зачем это нужно:

    • браузер не скачивает одни и те же файлы при каждом заходе;
    • повторные визиты становятся заметно быстрее;
    • уменьшается количество запросов к серверу;
    • PageSpeed и Lighthouse перестают ругаться на отсутствие cache policy.

    HTML-страницы и динамический контент — это уже page cache, он настраивается отдельно и зависит от сервера или приложения.

    Apache

    Apache часто используется на shared-хостингах и удобен тем, что позволяет управлять кешированием через .htaccess.
    Файл .htaccess находится в корне сайта (например, public_html/.htaccess).

    mod_expires

    mod_expires позволяет указать браузеру, как долго можно хранить файлы локально и не запрашивать их повторно с сервера.

    Базовое кеширование:

     1<IfModule mod_expires.c>
     2  ExpiresActive On
     3
     4  ExpiresByType image/jpeg "access plus 1 year"
     5  ExpiresByType image/png  "access plus 1 year"
     6  ExpiresByType image/gif  "access plus 1 year"
     7  ExpiresByType image/webp "access plus 1 year"
     8  ExpiresByType image/svg+xml "access plus 1 year"
     9  ExpiresByType image/x-icon "access plus 1 year"
    10
    11  ExpiresByType font/woff2 "access plus 1 year"
    12  ExpiresByType font/woff  "access plus 1 year"
    13
    14  ExpiresByType text/css "access plus 1 month"
    15  ExpiresByType application/javascript "access plus 1 month"
    16
    17  ExpiresDefault "access plus 7 days"
    18</IfModule>
    

    Важно понимать: mod_expires управляет только браузерным кешем и не кеширует HTML-страницы.

    Cache Control

    Cache-Control — это дополнительный и более современный HTTP-заголовок, который явно говорит браузеру и прокси, как можно кешировать файл.
    Современные инструменты анализа скорости учитывают именно Cache-Control.

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

    Nginx

    Если сайт работает на Nginx, важно понимать одну вещь, в отличие от Apache, здесь нет .htaccess, и все правила кеширования задаются на уровне конфигурации сервера.

    На shared-хостингах доступ к конфигурационным файлам Nginx, как правило, отсутствует.
    Поэтому вместо попыток “найти конфиг” правильный и безопасный путь — обратиться в службу поддержки хостинга

    Правила кеширования нужно добавлять ВНУТРИ блока server { ... },
    обычно после root и index, но до location ~ \.php$.

    Пример конфигурационного файла:

     1server {
     2    listen 80;
     3    server_name example.com;
     4
     5    root /var/www/example.com/public;
     6    index index.php index.html;
     7
     8    # Кеширование изображений и шрифтов
     9    location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|woff2|woff)$ {
    10        expires 1y;
    11        add_header Cache-Control "public";
    12        access_log off;
    13    }
    14
    15    # Кеширование CSS и JS
    16    location ~* \.(css|js)$ {
    17        expires 30d;
    18        add_header Cache-Control "public";
    19        access_log off;
    20    }
    21
    22    location / {
    23        try_files $uri $uri/ /index.php?$args;
    24    }
    25
    26    location ~ \.php$ {
    27        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    28        include fastcgi_params;
    29    }
    30}
    

    Cloudflare

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

    Cloudflare работает как прокси между пользователем и сервером:

    • принимает запросы;
    • отдаёт закешированные файлы с ближайшего дата-центра;
    • снижает нагрузку на сервер и ускоряет сайт.

    Сразу после подключения Cloudflare автоматически кеширует статические файлы:

    • изображения;
    • CSS;
    • JavaScript;
    • шрифты.

    HTML-страницы по умолчанию Cloudflare не кеширует.

    Browser Cache TTL (базовая настройка)

    В панели Cloudflare:
    Caching → Configuration → Browser Cache TTL

    Здесь можно указать, как долго браузер пользователя будет хранить файлы.

    Рекомендую установить значение в 1 месяц.

    Очистка кеша

    После обновления файлов кеш можно сбросить:

    Caching → Configuration → Purge Cache → Purge Everything

    Важные моменты

    Долгий cache требует версионирования файлов

    Если для CSS или JavaScript задан большой срок кеширования (max-age на месяцы или год), URL файла должен меняться при каждом обновлении.

    Примеры корректного URL: /assets/css/app.css?v=1718032451 или /assets/css/app.8f3a2c1.css.

    Без этого браузер будет продолжать использовать старую версию файла, даже если он уже обновлён на сервере.

    Browser cache и Page cache

    Кеширование через Apache или Nginx:

    • не кеширует HTML-страницы;
    • влияет только на статические файлы.

    Для реального ускорения сайта нужен ещё и page cache (серверный, через плагин или CDN).

    htaccess работает только с Apache

    Файл .htaccess обрабатывается только Apache.
    Если сайт работает на Nginx, любые правила в .htaccess будут полностью игнорироваться.

    Shared-хостинг накладывает ограничения

    На shared-хостингах:

    • доступ к конфигу Nginx часто закрыт;
    • правила кеширования могут быть жёстко ограничены;
    • не всё можно решить самостоятельно.

    В таких случаях самый стабильный вариант — использовать CDN или обратиться в поддержку хостинга.