Лучшие практики кэширования веб-интерфейса для сайта?

Резюме

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

Итак, чтобы настроить сценарий, представьте себе веб-сервер (скажем, nginx), обратный прокси-сервер (скажем, лак), сервер приложений (что угодно), сервер базы данных (скажем, mysql).

Анонимный

  1. Статические элементы (gif/jpg и т. д.)
  2. Полудинамический (js/css)
  3. Динамический

Вы вошли

  1. Статический
  2. Полудинамический (js/css)
  3. Динамический

Вообще говоря, все анонимные сообщения должны быть кэшируемыми, а большинство зарегистрированных (не обращайте внимания на динамические, пока без ESI).

Анон #1

  • Установить удаленно Истекает
  • Установите ETag, если это возможно
  • Кэш-контроль: max-age=315360000

Анон №2 (обратный прокси-сервер кэширует результат, если он генерируется динамически, иначе применяются правила Анона №1)

  • Cache-Control: общедоступный, s-maxage=3000

Анон #3

  • Cache-Control: общедоступный, s-maxage=300

Вы вошли в систему #1

  • Установить удаленно Истекает
  • Установите ETag, если это возможно
  • Кэш-контроль: max-age=315360000

Вошел в систему #2 (обратный прокси-сервер кэширует результат, если он генерируется динамически, иначе применяются правила входа в систему #1)

  • Cache-Control: общедоступный, s-maxage=3000

Вы вошли в систему #3

  • Cache-Control: s-maxage=0, необходимо перепроверить

Каковы ваши предложения? Я буду обновлять пост по мере поступления ответов.


person Community    schedule 08.04.2009    source источник


Ответы (4)


Я не знаю всего о кэшировании, но вот несколько советов:

Анон № 1, 2: (статические, полудинамические элементы) Вы можете установить для них неограниченный срок действия. Если вам нужно изменить их, измените их URL. Проверка If-modified-Since дешева, но не бесплатна.

Анон #3: (динамические элементы) Вот где ETags и/или Last-Modified очень кстати. В зависимости от того, что вы обслуживаете, вы можете создать хороший заголовок Last-Modified. Если в вашей базе данных хранится дата изменения всех элементов, которые вы планировали показать, вы можете что-то сказать о SELECT MAX(last_updated) FROM items_to_show. Предупреждение: здесь учитывается возраст данных, а не возраст вашего шаблона, поэтому, если вы изменили свой шаблон django, вы не знаете, как сообщить об этом в заголовке.

Или вы можете сделать что-то подобное с ETag. Это может быть контрольная сумма сгенерированного содержимого. При этом будет учтено изменение шаблона.

Следует отметить, что оба этих подхода к кэшированию динамического контента действительно экономят больше полосы пропускания, чем загружают веб-сервер/базу данных. Вы всегда можете разумно использовать заголовок Expires, чтобы помочь в тех случаях, когда изменения на странице являются периодическими и предсказуемыми.

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

В общем, я бы использовал либо ETag, либо Last-modified, но не оба.

person Community    schedule 09.04.2009

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

Тем не менее, большинство людей забывают думать о своем динамическом контенте, конечно, результаты кэширования db и тому подобное великолепны, но все же включают фактический запуск механизма синтаксического анализа PHP/ASP или чего-то еще.

Если вы посмотрите на плагин super-cache для wordpress, вы заметите, что у него есть возможность фактически подготовить ваш html в виде статических файлов. Мало того, он также делает копию gzip и использует правила перезаписи для проверки существования этих файлов в качестве подходящей альтернативы запуску синтаксического анализатора. Это, очевидно, даст вам наилучший результат, так как это не только экономит время обработки, но и пропускную способность.

Если вы хотите увидеть разницу в производительности, сравните результаты apachebench <?php die('hello world'); с обслуживанием статической страницы .html.

Очевидно, вам нужно быть осторожным с таким кэшированием, но может быть очень полезно заменить кэширование всей страницы изнутри интерпретатора, такого как PHP.

person Community    schedule 29.07.2009

На страницах ySlow есть несколько соответствующих предложений.

Etags может быть не очень хорошей идеей.

person Community    schedule 16.04.2009
comment
Я хорошо знаком с YSlow. =) Я искал информацию от людей, которые разбирались в тонкостях Cache-Control для разных типов страниц/контента. - person Jauder Ho; 18.04.2009

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

--

person Community    schedule 17.04.2009
comment
Вместо того, чтобы предлагать читать книги, я ищу более конкретный вклад/опыт от людей. Больше в духе Вот что я сделал.... - person Jauder Ho; 27.04.2009
comment
Я рекомендовал эту книгу, потому что она более практична в плане охвата масштаба/производительности и лучших практик для достижения этой цели. Затем вам нужно будет выбрать подход и эмпирически измерить, что хорошо работает на вашем сайте. - person MikeJ; 27.04.2009
comment
Это класс проблем, для которых простой ответ не будет продуктивным. - person Norman H; 10.09.2012