Передовые методы веб-кэширования для сайта? - PullRequest
6 голосов
/ 08 апреля 2009

Резюме

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

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

Anonymous

  1. Статические элементы (GIF / JPG и т. Д.)
  2. Полудинамический (JS / CSS)
  3. Динамический

Зарегистрировался

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

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

Anon # 1

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

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

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

Anon # 3

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

Зарегистрирован # 1

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

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

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

Зарегистрированный # 3

  • Cache-Control: s-maxage = 0, обязательна повторная проверка

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

Ответы [ 4 ]

2 голосов
/ 29 июля 2009

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

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

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

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

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

2 голосов
/ 09 апреля 2009

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

Anon # 1,2: (статические, полудинамические элементы) Вы можете установить их, чтобы никогда не истек. Если вам нужно изменить их, измените их URL. Чеки If-Modified-Since дешевы, но не бесплатны.

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

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

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

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

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

1 голос
/ 16 апреля 2009
0 голосов
/ 17 апреля 2009

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

-

...