Зачем кэшировать статические файлы с помощью Varnish, почему бы не передать

9

У меня есть система, запускающая nginx / php-fpm / varnish / wordpress и amazon s3.

Сейчас я посмотрел на множество файлов конфигурации при настройке системы, и во всех них я нашел что-то вроде этого:

    /* If the request is for pictures, javascript, css, etc */
    if (req.url ~ "\.(jpg|jpeg|png|gif|css|js)$") {
        /* Remove the cookie and make the request static */
        unset req.http.cookie;
        return (lookup);
    }

Я не понимаю, почему это сделано. Большинство примеров также запускают NginX как веб-сервер. Теперь вопрос в том, зачем вам использовать кеш лака для кэширования этих статических файлов.

Для меня гораздо больше смысла кэшировать только динамические файлы, чтобы php-fpm / mysql не попадал так сильно.

Я прав или я что-то здесь упускаю?

ОБНОВИТЬ

Я хочу добавить некоторую информацию к вопросу на основе ответа.

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

Тем не менее, для меня важнее статический конент . Я нашел ссылку с некоторыми тестами и тестами для разных приложений кеша и приложений веб-сервера.

http://nbonvin.wordpress.com/2011/03/14/apache-vs-nginx-vs-varnish-vs-gwan/

На самом деле NginX быстрее получает статический контент, поэтому имеет смысл просто пропустить его. NginX прекрасно работает со статическими файлами.

-

Кроме того, большую часть времени статический контент отсутствует даже в самом веб-сервере. В большинстве случаев этот контент хранится где-то на CDN, может быть, в AWS S3, что-то в этом роде. Я думаю, что кеш лака - это последнее место, где вы хотите хранить статический контент.

Саиф Бечан
источник

Ответы:

10

Есть несколько преимуществ лака. Первое, что вы заметите, это снижение нагрузки на бэкэнд-сервер. Обычно путем кэширования контента, который генерируется динамически, но изменяется редко (по сравнению с тем, как часто к нему обращаются). На примере Wordpress большинство страниц, по-видимому, меняются не очень часто, и существуют некоторые плагины для аннулирования кэша лака при изменении страницы (например, новое сообщение, редактирование, комментарий и т. Д.). Таким образом, вы кешируете неопределенное время и аннулируете изменения, что приводит к минимальной нагрузке на ваш внутренний сервер.

Связанная статья, несмотря на то, что большинство людей предположили бы, что Varnish работает лучше, чем Nginx, при правильной настройке - хотя (и я очень не хочу это признавать) - мои собственные тесты, кажется, сходятся во мнении, что nginx может обслуживать статический файл быстрее, чем лак ( к счастью, я не использую лак для этой цели). Я думаю, что проблема в том, что если вы в конечном итоге используете Varnish, вы добавили дополнительный слой в ваши настройки. Пропуск через этот дополнительный слой к бэкэнд-серверу всегда будет медленнее, чем простое обслуживание непосредственно из бэкэнда - и поэтому разрешение кэширования Varnish может быть быстрее - вы сохраняете шаг. Другое преимущество находится на передней панели диска. Если вы настроите лак на использование malloc, вы вообще не попадете на диск, что сделает его доступным для других процессов (и, как правило, ускорит процесс).

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

В реальном сценарии вы, скорее всего, расставите приоритеты в использовании памяти - сначала динамический контент, так как он является наиболее дорогим для генерации; затем небольшой статический контент (например, js / css) и, наконец, изображения - вы, вероятно, не кэшируете другие носители в памяти, если у вас нет действительно веской причины для этого. В этом случае, когда Varnish загружает файлы из памяти и nginx загружает их с диска, Varnish, вероятно, превзойдет nginx (обратите внимание, что кеши nginx предназначены только для прокси и fastCGI, а те, по умолчанию, основаны на дисках - хотя это можно использовать nginx с memcached).

(Мой быстрый - очень грубый, не заслуживающий доверия - тест показал, что nginx (прямой) был самым быстрым - назовем его 100%, лак (с malloc) был немного медленнее (около 150%), а nginx за лаком ( с pass) был самым медленным (около 250%). Это говорит само за себя - все или ничего - добавляя дополнительное время (и обработку) для связи с бэкэндом, просто предлагает, что если вы используете Varnish, и у вас есть RAM, чтобы сэкономить вы также можете просто кэшировать все, что можете, и обслужить его из Varnish вместо того, чтобы возвращаться в nginx.)

cyberx86
источник
Мне нравятся высказанные вами замечания, я только начал копаться в этом, и я нахожу странным, что большинство онлайн-руководств просто позволяют вам кэшировать статический контент с помощью лака, держу пари, что некоторые люди кэшируют МБ статического контента. Это правда, что вы говорите, если это небольшие файлы, и если у вас есть свободная память, это нормально.
Саиф Бечан
Тем не менее, у меня, например, нет свободной памяти, и у меня есть несколько файлов макетов шаблонов, которые я не хочу помещать в CDN, я просто хочу, чтобы они были в моем каталоге шаблонов. Я удалю фрагмент из своего конфига лака, который их кеширует, так что память, которую я имею, может быть использована лучше. Мне понравился совет о 3 различных настройках. Я думаю, что я просто открою порт для nginx напрямую и подам оттуда файлы шаблонов. иметь лак дескриптор html, nginx дескриптор статический, и если необходимо php / mysql для некоторого свежего контента.
Саиф Бечан
Вы заметите, что многие установки Varish используют много ГБ памяти - правильно настроены, и в реальных сценариях я не сомневаюсь, что он превосходит nginx; Я могу предположить, однако, что именно гибкость и возможности, предлагаемые Varnish, делают его популярным - он специально разработан для кэширования. В Wordpress я предпочитаю установку Wordpress + W3TC (+ Cloudfront) + Varnish + Nginx + PHP-FPM + APC. На самом деле в некоторых случаях он не такой быстрый, как в других настройках, но довольно хорошо справляется с нагрузкой и обеспечивает хорошую производительность. Имейте в виду, что корпоративные брандмауэры часто блокируют нестандартные порты.
cyberx86
Из любопытства, почему бы не сохранить ваши шаблоны (предположительно, подразумевающие, что CSS / JS - PHP, конечно, должен оставаться на вашем сервере) в вашей CDN? Кроме того, один из моих ec2-экземпляров настроен с той же предпосылкой и включает следующее: if (req.url ~ "\.(png|gif|jp(e?)g|avi|flv|mp(e?)g|mp4|mp3)"){return(pass);}в vcl_recv (). По сути, я не хочу кэшировать медиа - но определенно хочу кэшировать html (php) и даже js / css (теория заключается в том, что изображения вносят меньший вклад в воспринимаемое время загрузки страницы, чем макет).
cyberx86
Я видел w3tc, но я не очень люблю использовать плагины. Я просто создаю свои собственные небольшие плагины, которые заботятся о конкретных опциях для каждого конкретного сайта, поэтому я знаю, что все делает. От программистов POV я посмотрел на некоторые плагины, и некоторые из них ужасно разработаны. Я создал свой собственный плагин для минимизации, прямую передачу и загрузку медиа-файлов в s3 и cf, небольшой плагин memcached и некоторые другие. Я просто не дошел до того, чтобы создать последний плагин, который позаботится о загрузке шаблонов в CDN.
Саиф Бечан
2

Я думаю, вы можете что-то упустить.

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

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

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

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

В приведенном выше фрагменте кода вы видите очень типичный фрагмент Varnish VCL, который заставляет кэшировать изображения, CSS и JavaScript. По умолчанию Varnish не будет кэшировать какие-либо запросы с cookie-файлами. Логика заключается в том, что если в запросе есть файл cookie, то должна быть какая-то причина, по которой серверу нужен этот файл cookie, чтобы он требовался на серверной части и передавался через кэш. В действительности, многие CMS (Drupal, Wordpress и т. Д.) Прикрепляют файлы cookie практически ко всему, независимо от того, нужны они или нет, поэтому обычно пишут VCL, чтобы удалить файлы cookie из содержимого, которое, как известно, является статическим, что, в свою очередь, приводит к кешированию Varnish. Это.

Есть смысл?

JDW
источник
Спасибо за ответ, но я все еще не уверен. Мне известно о том, что динамический контент изменяется на некоторых веб-сайтах, но на других, таких как мой, он меняется не часто. Я просто использую CMS, чтобы сделать жизнь проще. Так что мои динамические страницы могут быть кэшированы на неделю. Важно, давайте забудем о динамике, я не понимаю, зачем кэшировать статический контент, если у вас есть nginx в качестве бэкэнда. Если я прав, nginx и лак так же быстры в статическом контенте, или я ошибаюсь. Статический поиск может быть обработан так же быстро с nginx, как и с лаком. Я немного обновил вопрос.
Саиф Бечан
2

Для динамического содержимого некоторые виды, такие как биржевые котировки, на самом деле часто меняются (обновляются каждую секунду SaaS serverиз a backend server), но могут запрашиваться еще чаще (десятки тысяч subscription clients):

[stock calculation / backend server] ----- [SaaS server] ------ [subscription clients]

В этом случае кэширование при SaaS serverобновлении за секунду backend serversпозволяет удовлетворить запросы десятков тысяч subscription users.

Без кеша на SaaS-сервере эта модель просто не работала бы.

Eli
источник
1

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

Для статических файлов: кеш на HDD. Для всего остального: кеш на RAM.

Это должно дать вам более полное представление о том, как реализовать этот сценарий: http://www.getpagespeed.com/server-setup/varnish-static-files-cache

Данила Вершинин
источник
Просто любопытно, почему вы можете поместить статические файлы в кеш жесткого диска - разве это не то же самое, что просто подавать их с диска без кеша?
Шейн Н
По сути, да :) Но если есть Varnish, он должен связаться с бэкэндом (Nginx, Apache и т. Д.), Чтобы получить их. Это не может быть сделано напрямую из файловой системы. Чтобы устранить накладные расходы на бэкэнд-связь, они должны быть кэшированы, хотя и на диск.
Данила Вершинин
Ах, хорошо, это имеет смысл - спасибо @ danila-v
Шейн N