Varnish возвращает MISS после успешного HIT

В моем приложении используется Varnish 3.0.2. Я столкнулся со странной проблемой здесь. Иногда страницы подаются из Varnish со знаком HIT. Но сразу после этого возвращается MISS.

У меня сложилось впечатление, что после того, как он будет обслужен из кеша, он будет продолжать это делать, пока не истечет срок действия TTL. Я ошибаюсь в понимании этого?

Вот два заголовка ответа для обоих сценариев:

УДАР

HTTP/1.1 200 OK
Server: Apache/2.4.16 (Unix) mod_auth_kerb/5.4 PHP/5.3.29
X-Powered-By: PHP/5.3.29
X-Drupal-Cache: MISS
Content-Language: en
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
cache-control: max-age=86400, public
X-Cookie-Debug: Request cookie: 
X-Request-URL: /org/31633421?unit=31633421
Content-Length: 11986
Accept-Ranges: bytes
Date: Wed, 24 Apr 2019 14:26:43 GMT
X-Varnish: 330015711 330015651
Via: 1.1 varnish
Connection: keep-alive
X-Varnish-Cache: HIT
X-Varnish-Cache-Hits: 1
X-Varnish-Age: 188
X-Varnish-Leg: 128.87.225.172
X-Varnish-Cache-Version: 3.0.2

МИСС

HTTP/1.1 200 OK
Server: Apache/2.4.16 (Unix) mod_auth_kerb/5.4 PHP/5.3.29
X-Powered-By: PHP/5.3.29
X-Drupal-Cache: MISS
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: public, max-age=300
Content-Language: en
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
X-Cookie-Debug: Request cookie: _gat_UA-15166137-36=1
X-Request-URL: /org/31633421?unit=31633421
Content-Length: 11978
Accept-Ranges: bytes
Date: Wed, 24 Apr 2019 14:23:52 GMT
X-Varnish: 1900997574
Via: 1.1 varnish
Connection: keep-alive
X-Varnish-Cache: MISS
X-Varnish-Age: 0
X-Varnish-Leg: 128.87.225.158
X-Varnish-Cache-Version: 3.0.2

Я пытался увеличить значение TTL, удалить все файлы cookie (включая Google Analytics), но все равно он ведет себя резко.

Есть идеи, почему?

Обновлять

Похоже, это происходит из-за включения следующего кода JS диспетчера тегов Google в мой шаблон представления.

<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
      new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
      j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
      'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
      })(window,document,'script','dataLayer','GTM-XXX');</script>

Почему заголовки управления кешем различаются в двух ответах? Почему в одном ответе есть заголовок Expire, а в другом нет?

Ronald 24.04.2019 19:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
171
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я предполагаю, что это исходит от двух разных серверов лака на основе двух заголовков ответов:

X-Varnish-Leg: 128.87.225.172

а также

X-Varnish-Leg: 128.87.225.158

Это потому, что у нас есть две серверные ножки и на обеих установлена ​​лакировка. В результате ответ Varnish поступает от них обоих в зависимости от нагрузки на сервер. Но может ли это повлиять на HIT? Я имею в виду, что он может не показывать HIT для одного или двух ответов, но как только он будет кэширован, он должен начать показывать HIT. В моем случае этого не происходит. Соотношение попаданий и промахов почти 4:1. Также заметил новую вещь, если вообще убрать гугл аналитику, лак работает все идеально. Я создал исключение для файлов cookie GA, хотя в vcl. Проверьте комментарий ниже.

Pratip Ghosh 25.04.2019 09:48
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|Drupal.visitor.name|WEBTRENDS_ID|WT_FPC|J‌​SESSIONID|sifrFetch|‌​sso_hide_login|ei_se‌​ssion_test|ei_sessio‌​n|has_js|BIGipServer‌​[a-zA-Z_0-9]*)=[^;]*‌​", "");
Pratip Ghosh 25.04.2019 09:51

+1 для Рональда, также, пожалуйста, подумайте об обновлении до последней версии Varnish 6, поскольку с момента выпуска Varnish 3 прошли годы, было исправлено множество ошибок и внесены улучшения. Кроме того, V3 является концом жизни.

Да, на самом деле этот вопрос касается нашего старого приложения, которое само находится на старой платформе Drupal. Мы обновляем это. В этой новой итерации мы использовали Varnish 4. Тем не менее, короткий вопрос: если мы действительно планируем обновить Varnish на этой новой платформе с 4 до 6, как вы предлагаете, насколько, по вашему мнению, изменится язык конфигурации?

Pratip Ghosh 25.04.2019 10:44

Переход с 4 на 6 менее разрушительный, чем переход с 3 на 4. VCL не сильно меняется с 4 на 6, вы можете посмотреть раздел «обновление VCL»: docs.varnish-software.com/varnish-cache-plus/upgrading/…

Arianna Aondio 26.04.2019 10:44

Спасибо за это. Хотя все еще жду ответа на свой первоначальный вопрос. :П

Pratip Ghosh 26.04.2019 13:09

На него Рональд ответил: если у вас два кеша, то их кеши не синхронизируются (в версии с открытым исходным кодом)

Guillaume Quintard 01.05.2019 02:14
Ответ принят как подходящий

Оказывается, на самом деле проблема была в конфигурации VCL с регулярным выражением, которое я использовал. Я не учел не-альфа-символы файла cookie Google Analytics. Изменил регулярное выражение на _[_\-\.\=a-zA-Z0-9] и снова все весело!

Надеюсь, это поможет кому-то.

Другие вопросы по теме