Чому кешують статичні файли за допомогою Varnish, чому не передають


9

У мене працює система nginx / php-fpm / лак / 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 кешувати може бути швидше - ви економите крок. Інша перевага - на передньому диску-io. Якщо ви налаштовуєте лак для використання malloc, ви взагалі не потрапляєте на диск, що залишає його доступним для інших процесів (і, як правило, прискорює роботу).

Я думаю, що для того, щоб дійсно оцінити ефективність, потрібен кращий орієнтир. Неодноразово вимагаючи одного і того ж одного файлу, запускає кеші файлової системи, які починають зміщувати фокус від самих веб-серверів. Кращим орієнтиром було б використовувати облогу з кількома тисячами випадкових статичних файлів (можливо, навіть із журналів вашого сервера) для імітації реалістичного трафіку. Імовірно, хоча, як ви вже згадували, все частіше стає завантажувати статичний вміст на CDN, а це означає, що Varnish, ймовірно, не буде його обслуговувати для початку (ви згадуєте S3).

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

(Мій швидкий - дуже брутальний, не даючи довіри - тест показав, що nginx (direct) був найшвидшим - давайте назвемо це 100%, лак (з malloc) трохи повільніше (близько 150%), а nginx за лаком ( З пропусканням) було найповільнішим (близько 250%). Це говорить саме за себе - все або нічого - додаючи додатковий час (і обробляючи) для спілкування з бекендом, просто підказує, що якщо ви використовуєте Varnish, і запам’ятовує оперативну пам’ять , ви також можете просто кешувати все, що можете, і подавати його з Varnish, а не переходити до nginx.)


Мені подобаються пункти, які ви зробили, я щойно почав розбиратися в цьому, і мені здається дивним, що більшість інтернет-путівників дозволяють вам кешувати статичний вміст лаком, я вважаю, що деякі люди кешують статичний вміст МБ. Це правда, що ви говорите, якщо це невеликі файли, і якщо у вас є запам'ятована пам'ять, це нормально.
Сайф Бечан

Це означає, що я ні в кого не маю запам'ятовувати пам'ять, і у мене є деякі файли макета шаблону, які я не хочу ставити на CDN, я просто хочу їх у своєму каталозі шаблонів. Я вилучу фрагмент із конфігурації лаку, який їх кешує, тому пам'ять, яку я маю, можна краще використовувати. Мені сподобалась порада про 3 різні установки. Я думаю, що я просто відкрию порт для nginx безпосередньо та подаю файли шаблонів звідти. мати лак для обробки HTML, nginx обробляти статичним, а якщо необхідний php / mysql для деякого свіжого вмісту.
Сайф Бечан

Ви зауважите, що в багатьох програмах Varish використовується багато ГБ пам’яті - правильно налаштовано, і в реальних сценаріях життя я не сумніваюся, що це виконує nginx; Я можу припустити, що саме ця гнучкість та варіанти, які пропонує Varnish, робить його популярним - він спеціально розроблений для кешування після. У Wordpress моїм бажаним налаштуванням є Wordpress + W3TC (+ Cloudfront) + Лак + 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);}in vcl_recv (). По суті, я не хочу кешувати медіа - але, безумовно, хочу кешувати html (php) і навіть js / css (теорія полягає в тому, що зображення сприяють меншому часу завантаження сторінки, ніж макет).
cyberx86

Я бачив w3tc, але не дуже люблю використовувати плагіни. Я просто створюю маленькі власні плагіни, які піклуються про конкретні варіанти для кожного конкретного сайту, тому я знаю, що все робить. Від програмістів POV я переглянув деякі плагіни, а деякі - жахливо розроблені. Я створив свій власний міні-плагін, пряме розсипання та завантаження медіа-файлів у s3 та cf, невеликий плагін із пам’яті та деякі інші. Я просто не дійшов до того, щоб створити останній плагін, який піклується про завантаження шаблонів у CDN.
Сайф Бечан

2

Я думаю, ти можеш чогось пропустити.

За визначенням, динамічні файли змінюються. Зазвичай вони змінюються, роблячи якийсь запит до бази даних, який впливає на вміст сторінки, що надається користувачеві. Тому ви не хочете кешувати динамічний вміст. Якщо це зробити, він просто стає статичним контентом і, швидше за все, статичним вмістом з неправильним вмістом.

Як простий приклад, скажімо, що у вас є сторінка з ім’ям користувача, який увійшов у верхній частині сторінки. Кожен раз, коли ця сторінка завантажується, запускається запит до бази даних, щоб визначити, яке ім'я користувача належить користувачеві, який увійшов у систему, запитуючи сторінку, що забезпечує відображення власного імені. Якби ви кешували цю сторінку, запит до бази даних не відбудеться, і всі користувачі побачать одне і те ж ім’я користувача у верхній частині сторінки, і, швидше за все, це не буде їх ім'ям користувача. Потрібно, щоб цей запит відбувався на кожному завантаженні сторінки, щоб забезпечити відображення належного імені користувача кожному користувачеві. Тому він не є кешованим.

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

Статичний вміст за визначенням однаковий для всіх користувачів. Тому не потрібно проводити запит до бази даних, щоб налаштувати цю сторінку для кожного користувача, тому є сенс кешувати це, щоб усунути непотрібні запити до бази даних. Зображення - це справді чудовий приклад статичного вмісту - ви хочете, щоб усі користувачі бачили однакове зображення заголовка, однакові кнопки входу тощо, тому вони є прекрасними кандидатами для кешування.

У своєму фрагменті коду вище ви бачите дуже типовий фрагмент лаку VCL, який змушує кешувати зображення, css та javascript. За замовчуванням Varnish не буде кешувати жоден запит із файлом cookie. Логіка полягає в тому, що якщо в запиті є файл cookie, то сервер повинен мати певну причину, щоб він потребував цього файлу cookie, щоб він був потрібен на зворотному кінці і повинен бути переданий через кеш. Насправді багато CMS (Drupal, Wordpress тощо) приєднують файли cookie майже до всього, незалежно від того, потрібен він чи ні, тому звичайно писати VCL для видалення файлів cookie з вмісту, який, як відомо, є статичним, що, в свою чергу, призводить до того, що Varnish кешується це.

Мати сенс?


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

2

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

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

У цьому випадку кешування на оновленеSaaS server оновлення за секунду backend serversдає змогу задовольнити запити десятків тисяч subscription users.

Без кешу на сервері SaaS ця модель просто не працювала б.


1

Кешування статичних файлів за допомогою Varnish виграє з точки зору вивантаження Nginx. Звичайно, якщо у вас є багато статичних файлів для кешування, це втратить оперативну пам’ять. Однак у Varnish є приємна особливість - він підтримує декілька резервних файлів для зберігання кешу.

Для статичних файлів: кеш на жорсткий диск. Для всього іншого: кеш-пам'ять в оперативній пам'яті.

Це має дати вам більше уявлення про те, як реалізувати цей сценарій: http://www.getpagespeed.com/server-setup/varnish-static-files-cache


Цікаво, чому ви можете ставити статичні файли в кеш-пам'ять жорсткого диска - чи не по суті те саме, що просто обслуговувати їх з диска без кешу?
Шейн N

По суті, так :) Але якщо там є лак, він повинен зв’язатись із бекендом (Nginx, Apache, що завгодно), щоб отримати їх. Це не може зробити це безпосередньо з файлової системи. Щоб усунути накладні комунікації, їх слід кешувати, навіть не диска.
Данила Вершинін

Ну добре, це має сенс - дякую @ danila-v
Shane N
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.