Лак + Статические HTML-страницы - PullRequest
9 голосов
/ 31 марта 2012

Я недавно столкнулся с веб-ускорителем http, который называется Varnish. Из того, что я прочитал, Varnish ускоряет доставку веб-сайта, оптимизируя каждый процесс HTTP-связи с HTTP-сервером с использованием конфигурации обратного прокси.

Мой вопрос заключается в том, что если у вас есть веб-сайт, механизм кэширования которого полностью сконфигурирован вплоть до статических html-файлов, то какой эффект окажет Varnish на это? Обрезает ли обратный прокси работу, выполняемую HTTP-сервером для обработки запроса? Если у вас есть все, что активно кэшируется на стороне сервера (HTTP-заголовки, Etags, Expires Headers, Кэширование базы данных, Фрагмент и Кэширование страниц), то что еще может сделать ускоритель HTTP, чтобы улучшить это?

1 Ответ

21 голосов
/ 01 апреля 2012

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

HTTP-кэширование контролируется HTTP-заголовками, особенно, как вы указали ETag и различными механизмами истечения срока действия (включая Expires и различные аспекты Cache-Control).Все это описано в RFC 2616 (HTTP), раздел 13 и позволяет HTTP кэшам возвращать ответ на запрос HTTP от клиента без необходимостивернитесь на исходный сервер .По сути, механизм HTTP-кэширования позволяет другой машине между клиентом и сервером действовать, как будто это сервер, в некоторых случаях.Это на самом деле то, что делает лак, как мы увидим через минуту;Другое распространенное использование, с которым многие знакомы, - это когда интернет-провайдеры предоставляют HTTP-кеш в своей сети, который обычно может быстрее отвечать своим подписчикам (и, таким образом, улучшать воспринимаемую производительность), чем исходные серверы за пределами их сети.

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

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

  1. парсинг HTTP-запроса
  2. сопоставление URI (и любых соответствующих заголовков запроса, таких как Accept-Encoding) с файлом
  3. получение информации о файле для построения заголовков HTTP в ответе;они известны как заголовки сущностей ( RFC 2616 раздел 7.1 , которые включают такие вещи, как Content-Length, Content-Type и заголовки Expires и Last-Modified, используемые в кэшировании HTTP)
  4. выясните, какие дополнительные заголовки ответа ( RFC 2616, раздел 6.2 ; к ним относятся ETag и Vary, обе важные части кэширования HTTP) и поля общего заголовка ( RFC 2616 раздел 4.5 ) необходимо
  5. записать строку состояния HTTP и заголовки в сеть
  6. записать содержимое файлак сети

Для сравнения, лак является восходящим потоком всего этого, поэтому все, что он должен сделать, это:

  1. анализ HTTP-запроса
  2. отобразить URI (и любые соответствующие заголовки запроса) на запись в его внутреннем кэше
  3. посмотреть, есть ли запись;если есть, напишите в сеть;заголовки HTTP будут храниться в кеше

Если записи нет, лак должен сделать немного больше работы:

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

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

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

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

...