Поиск по сайту:

Как настроить заголовки Cache-Control в NGINX


Кэширование — это процесс хранения загруженных данных для последующего использования, когда их можно прочитать с диска, а не запрашивать повторно. Правильное использование вашего браузера и кэширования CDN может значительно ускорить ваш сайт.

Как работает кэширование?

Браузер каждого пользователя имеет встроенный кеш, в котором хранятся статические объекты, загруженные с веб-сайтов. При следующем подключении, если объект, который они запрашивают, все еще находится в кеше, он будет загружаться из памяти, а не запрашивать его снова, что значительно повышает производительность и снижает нагрузку на ваш веб-сервер в процессе.

Браузер пользователя представляет собой кеш на стороне клиента. Однако многие крупные сайты также используют сеть доставки контента или CDN. CDN находится перед вашим веб-сервером и кэширует ваши страницы на стороне сервера, обычно на нескольких пограничных серверах, расположенных по всему миру. Это улучшает задержку доступа, производительность и значительно снижает нагрузку на ваш веб-сервер. Если вы хотите узнать больше о CDN, вы можете прочитать наше руководство по ним здесь.

Cache-Control – это заголовок, который вы можете настроить на своем веб-сервере для добавления ко всем исходящим запросам. Используя его, вы можете указать, какие ресурсы кэшируются и на какой срок. Есть несколько вещей, на которые следует обратить внимание, прежде чем вы добавите его для всего сайта.

Некоторые страницы никогда не следует кэшировать. Все, что требует от пользователя входа в систему, не должно кэшироваться CDN, иначе вы рискуете отобразить личную информацию одного пользователя другим. Вы по-прежнему можете кэшировать такие страницы только на стороне браузера (установив для Cache-Control значение private). Как правило, если страница будет одинаковой для всех пользователей, например, ваша домашняя страница, вы можете кэшировать ее. Статические ресурсы, такие как CSS и изображения, обычно можно кэшировать, часто на гораздо более длительный срок.

Вы также должны убедиться, что устанавливаете разумные значения времени жизни (TTL) для каждого ресурса. TTL определяет, как долго объект будет оставаться в кеше, прежде чем он будет признан недействительным, предлагая пользователю запросить новый объект. Компромисс здесь заключается между длительным временем кэширования и быстрыми обновлениями. Вы не хотите кэшировать свою домашнюю страницу на целый год, потому что вы можете что-то изменить во вторник. Установка максимального срока хранения домашней страницы на несколько минут — это достаточно долго, чтобы охватить немедленные перезагрузки, и достаточно быстро, чтобы обеспечить быстрое распространение обновлений. Однако для статических ресурсов, таких как изображения, они могут никогда не измениться, и вы должны установить высокие значения TTL, даже два года.

Вы всегда можете использовать версионные имена файлов для запуска перезагрузки кеша. Если вы выпускаете новую версию таблицы стилей CSS, вы можете назвать ее styles-1.0.1.css, и браузер пользователя (и любые CDN перед ней) увидит ее как новую файл, который необходимо перезагрузить. Кроме того, для некоторых CDN вы можете выполнить аннулирование вручную, чтобы очистить существующий кеш без изменения имен файлов.

Как использовать Cache-Control в NGINX

Cache-Control имеет несколько параметров:

  • public  — может кэшироваться кем угодно, включая браузеры и CDN. Используйте это для большинства статических объектов.
  • private  – содержит конфиденциальные данные, которые не могут быть кэшированы CDN или обратными прокси-серверами. Браузер пользователя может кэшировать его локально. Используйте это для большинства аутентифицированных страниц.
  • no-cache  — несмотря на название, кэширование не отключается. Браузер может по-прежнему кэшировать ответ для повышения производительности, но перед его использованием он должен проверить наличие обновлений на исходном сервере. Используйте это, если вы хотите, чтобы пользователь каждый раз проходил повторную проверку
  • no-store  – полностью отключает кеширование. Используйте это только для особо конфиденциальных данных, которые не следует отправлять дважды.

При установке max-age это всегда делается в секундах. Однако NGINX допускает еще несколько пользовательских значений:

  • -1 или off, что отключит кеширование и не изменит существующие заголовки
  • epoch, установите нулевое время Unix, что явно отключит кеширование и очистит все кеши (полезно, если вы используете NGINX в качестве обратного прокси-сервера)
  • max, срок действия которого истечет, когда закончится вселенная, 31 декабря 2037 года.
  • 30s, для секунд
  • 1 м для минут
  • 24 часа, в течение нескольких часов
  • 3D, на несколько дней
  • 1 М на несколько месяцев
  • 2 года, в течение многих лет

Кроме того, вы можете добавить директиву no-transform , которая отключает любые преобразования, которые могут быть выполнены с ресурсом. Например, некоторые CDN сжимают изображения для уменьшения пропускной способности. Эта директива отключает такое поведение.

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

expires 1y;
add_header Cache-Control "public, no-transform";

Первая строка устанавливает максимальный возраст на 1 год, а вторая устанавливает параметры кэширования public и no-transform . Вы можете добавить это в блок server , чтобы применить ко всему сайту, но лучший способ — сопоставить расширения файлов с блоком местоположения, чтобы установить разные значения в зависимости от расширения файла:

location ~* .(?:css|js)$ {
  expires 1y;
  add_header Cache-Control "public";
}

Этот блок местоположения использует соответствие регулярному выражению, обозначаемому ~. Это полезно для применения общих настроек для типа контента. Если вы хотите сделать исключения для определенных местоположений, вы можете использовать обычный блок местоположений, который будет иметь приоритет над совпадением с регулярным выражением.

location /profile {
    expires 2d;
    add_header Cache-Control "public, no-transform";
}

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

Используйте Surrogate-Control для изменения поведения CDN

Хотя вы можете отключить кэширование CDN и по-прежнему использовать кэширование браузера с помощью Cache-Control: private, лучше иметь прямой контроль над ним. Большинство CDN будут учитывать заголовок Surrogate-Control, который работает точно так же, как Cache-Control, за исключением того, что он предназначен только для CDN. Таким образом, вы можете сказать Fastly сделать одно, а пользователю сделать другое.

В NGINX вам придется установить этот заголовок вручную и установить значение max-age вместо использования директивы NGINX expires.

add_header Surrogate-Control "public, max-age=86400";
add_header Cache-Control "public, max-age=120";

Вы определенно захотите протестировать свою CDN, чтобы убедиться, что это работает — Surrogate-Control довольно новый и не универсальный.