Рейтинг:0

Varnish 4.1 - Как обслуживать кешированную копию при неудачной выборке из бэкэнда вместо 503

флаг sn

У меня есть сайт, обслуживаемый apache+tomcat, и кеш, обслуживаемый Varnish 4.1.

Когда апач не работает, лак всегда возвращает ошибку 503.
Я хотел бы, чтобы лак вернул копию страниц, которые он имеет в своем кеше, но мои попытки с ttl и грацией не увенчались успехом.
Я думаю, что прочитал всю документацию по лаку 4.1, которую смог найти, любая помощь очень ценится.

заранее спасибо

РЕДАКТИРОВАТЬ: лаклог -g запрос -q "ReqUrl eq '/'"

завиток

* << Запрос >> 1410492
- Начать запрос 1410491 rxreq
- Отметка времени начала: 1646995409.603391 0.000000 0.000000
- Требование метки времени: 1646995409.603391 0,000000 0,000000
- ReqStart 10.xxx.xxx.xxx 57472
- Требуемый метод ПОЛУЧИТЬ
- Требуемый URL /
- Требуемый протокол HTTP/1.1
- Хост ReqHeader: akamai5.rsi.ch
- Агент пользователя ReqHeader: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0
- ReqHeader принимает: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
- ReqHeader accept-language: it,en-US;q=0.7,en;q=0.3
- ReqHeader принимает кодировку: gzip, deflate, br
- Файл cookie ReqHeader: wt_rla=292330999892453%2C2%2C1646731482026; _pipe_c=do_not_track; _ga=GA1.2.836346559.1644414441; __gads=ID=453223b8518b57e5-22f191e137cd00c3:T=1644414444:RT=1644414444:S=ALNI_MbCUi8liJ5sbhjlTe68z1BhLhZJCQ; __utma=46365988.836346559.1644414441.16
- Небезопасные запросы на обновление ReqHeader: 1
- ReqHeader sec-fetch-dest: документ
- ReqHeader sec-fetch-mode: навигация
- ReqHeader sec-fetch-site: нет
- ReqHeader sec-fetch-user: ?1
- Управление кешем ReqHeader: max-age=0
- ReqHeader x-forwarded-proto: https
- ReqHeader x-forwarded-ssl: вкл.
- ReqHeader x-forwarded-port: 443
- ReqHeader x-forwarded-for: 1178.xxx.xxx.xxx
- Соединение ReqHeader: закрыть
- ReqUnset x-forwarded-for: 1178.xxx.xxx.xxx
- ReqHeader X-Forwarded-For: 1178.xxx.xxx.xxx, 10.xxx.xxx.xxx
- VCL_вызов RECV
- ReqUnset cookie: wt_rla=292330999892453%2C2%2C1646731482026; _pipe_c=do_not_track; _ga=GA1.2.836346559.1644414441; __gads=ID=453223b8518b57e5-22f191e137cd00c3:T=1644414444:RT=1644414444:S=ALNI_MbCUi8liJ5sbhjlTe68z1BhLhZJCQ; __utma=46365988.836346559.1644414441.16
- Файл cookie ReqHeader: wt_rla=292330999892453%2C2%2C1646731482026; _pipe_c=do_not_track; _ga=GA1.2.836346559.1644414441; __gads=ID=453223b8518b57e5-22f191e137cd00c3:T=1644414444:RT=1644414444:S=ALNI_MbCUi8liJ5sbhjlTe68z1BhLhZJCQ; cs_fpid=1645804349272_22538249; wt_geid
- ReqUnset Cookie: wt_rla=292330999892453%2C2%2C1646731482026; _pipe_c=do_not_track; _ga=GA1.2.836346559.1644414441; __gads=ID=453223b8518b57e5-22f191e137cd00c3:T=1644414444:RT=1644414444:S=ALNI_MbCUi8liJ5sbhjlTe68z1BhLhZJCQ; cs_fpid=1645804349272_22538249; wt_geid
- Файл cookie ReqHeader: wt_rla=292330999892453%2C2%2C1646731482026; _pipe_c=do_not_track; _ga=GA1.2.836346559.1644414441; __gads=ID=453223b8518b57e5-22f191e137cd00c3:T=1644414444:RT=1644414444:S=ALNI_MbCUi8liJ5sbhjlTe68z1BhLhZJCQ; cs_fpid=1645804349272_22538249; wt_geid
- ReqUnset Cookie: wt_rla=292330999892453%2C2%2C1646731482026; _pipe_c=do_not_track; _ga=GA1.2.836346559.1644414441; __gads=ID=453223b8518b57e5-22f191e137cd00c3:T=1644414444:RT=1644414444:S=ALNI_MbCUi8liJ5sbhjlTe68z1BhLhZJCQ; cs_fpid=1645804349272_22538249; wt_geid
- Файл cookie ReqHeader: wt_rla=292330999892453%2C2%2C1646731482026; _pipe_c=do_not_track; _ga=GA1.2.836346559.1644414441; __gads=ID=453223b8518b57e5-22f191e137cd00c3:T=1644414444:RT=1644414444:S=ALNI_MbCUi8liJ5sbhjlTe68z1BhLhZJCQ; cs_fpid=1645804349272_22538249; wt_geid
- Хеш VCL_return
- ReqUnset принять кодировку: gzip, deflate, br
- ReqHeader Accept-Encoding: gzip
- ХЭШ VCL_вызова
- Поиск VCL_return
- Хит 1410469
- VCL_вызов HIT
- VCL_return доставить
- Респпротокол HTTP/1.1
- RespStatus 200
- RespReason OK
- RespHeader Дата: пятница, 11 марта 2022 г., 10:42:05 по Гринвичу
- Сервер RespHeader: Apache-Coyote/1.1
- Тип содержимого RespHeader: text/html; charset=UTF-8
- RespHeader Set-Cookie: JSESSIONID=F8D07853DF7D90A3F381B316F64FA285; Путь=/; HttpOnly
- RespHeader X-лак: 1410492 1410469
- RespHeader Возраст: 84
- RespHeader Через: 1.1 лак-v4
- VCL_вызов ДОСТАВИТЬ
- RespHeader X-Cache-Host: rsi-prod-varnish45
- RespHeader X-Frame-Options: SAMEORIGIN
- RespHeader X-XSS-Защита: 1; режим = блок
- RespHeader X-Content-Type-Options: nosniff
- RespHeader Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval' *
- RespHeader X-Cache: HIT
- RespHeader X-Cache-Хиты: 3
- RespHeader X-Grace-Hit: да
- VCL_return доставить
- Процесс отметки времени: 1646995409.603614 0.000222 0.000222
- RespHeader Accept-Range: байты
- Длина содержимого RespHeader: 191244
- Отладка "RES_MODE 2"
- Соединение RespHeader: закрыть
- Временная метка Ответ: 1646995409.608024 0.004632 0.004410
- ReqAcct 1130 0 1130 574 191244 191818
-   Конец

браузер

* << Запрос >> 1410496
- Начало запроса 1410495 rxreq
- Отметка времени начала: 1646995426.730217 0,000000 0,000000
- Требование метки времени: 1646995426.730217 0,000000 0,000000
- ReqStart 10.xxx.xxx.xxx 60908
- ReqMethod ПОЛУЧИТЬ
- Требуемый URL /
- Требуемый протокол HTTP/1.1
- Хост ReqHeader: www.example.com
- Агент пользователя ReqHeader: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0
- ReqHeader принимает: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
- ReqHeader accept-language: it,it-IT;q=0.8,en-US;q=0.5,en;q=0.3
- ReqHeader принимает кодировку: gzip, deflate, br
- Файл cookie ReqHeader: _pipe_c=do_not_track; _ga=GA1.2.1217589648.1620392041; __gads=ID=1a22b33c44d55e6f-1a22b33c44d55e6f:T=1620392042:RT=1620392042:S=ALNI_MYR9nyXrxcQ8QV1Y2pNVDp67Gn9-w; __utma=46365988.1217589648.1620392041.1638545296.1642173864.10; __utmz=46365988.16
- Небезопасные запросы на обновление ReqHeader: 1
- Управление кешем ReqHeader: max-age=0
- ReqHeader x-forwarded-proto: https
- ReqHeader x-forwarded-ssl: вкл.
- ReqHeader x-forwarded-port: 443
- ReqHeader x-forwarded-for: 178.xxx.xxx.xxx
- Соединение ReqHeader: закрыть
- ReqUnset x-forwarded-for: 178.xxx.xxx.xxx
- ReqHeader X-Forwarded-For: 178.xxx.xxx.xxx, 10.xxx.xxx.xxx
- VCL_вызов RECV
- ReqUnset cookie: _pipe_c=do_not_track; _ga=GA1.2.1217589648.1620392041; __gads=ID=1a22b33c44d55e6f-1a22b33c44d55e6f:T=1620392042:RT=1620392042:S=ALNI_MYR9nyXrxcQ8QV1Y2pNVDp67Gn9-w; __utma=46365988.1217589648.1620392041.1638545296.1642173864.10; __utmz=46365988.16
- Файл cookie ReqHeader: _pipe_c=do_not_track; _ga=GA1.2.1217589648.1620392041; __gads=ID=1a22b33c44d55e6f-1a22b33c44d55e6f:T=1620392042:RT=1620392042:S=ALNI_MYR9nyXrxcQ8QV1Y2pNVDp67Gn9-w; wt_rla=292330999892453%2C2%2C1646995242972; cs_fpid=1645855325408_55998969; JSESSI
- ReqUnset Cookie: _pipe_c=do_not_track; _ga=GA1.2.1217589648.1620392041; __gads=ID=1a22b33c44d55e6f-1a22b33c44d55e6f:T=1620392042:RT=1620392042:S=ALNI_MYR9nyXrxcQ8QV1Y2pNVDp67Gn9-w; wt_rla=292330999892453%2C2%2C1646995242972; cs_fpid=1645855325408_55998969; JSESSI
- Файл cookie ReqHeader: _pipe_c=do_not_track; _ga=GA1.2.1217589648.1620392041; __gads=ID=1a22b33c44d55e6f-1a22b33c44d55e6f:T=1620392042:RT=1620392042:S=ALNI_MYR9nyXrxcQ8QV1Y2pNVDp67Gn9-w; wt_rla=292330999892453%2C2%2C1646995242972; cs_fpid=1645855325408_55998969; JSESSI
- ReqUnset Cookie: _pipe_c=do_not_track; _ga=GA1.2.1217589648.1620392041; __gads=ID=1a22b33c44d55e6f-1a22b33c44d55e6f:T=1620392042:RT=1620392042:S=ALNI_MYR9nyXrxcQ8QV1Y2pNVDp67Gn9-w; wt_rla=292330999892453%2C2%2C1646995242972; cs_fpid=1645855325408_55998969; JSESSI
- Файл cookie ReqHeader: _pipe_c=do_not_track; _ga=GA1.2.1217589648.1620392041; __gads=ID=1a22b33c44d55e6f-1a22b33c44d55e6f:T=1620392042:RT=1620392042:S=ALNI_MYR9nyXrxcQ8QV1Y2pNVDp67Gn9-w; wt_rla=292330999892453%2C2%2C1646995242972; cs_fpid=1645855325408_55998969; JSESSI
- Хеш VCL_return
- ReqUnset принять кодировку: gzip, deflate, br
- ReqHeader Accept-Encoding: gzip
- ХЭШ VCL_вызова
- Поиск VCL_return
- VCL_вызов МИСС
- выборка VCL_return
- Ссылка bereq 1410497 fetch
- Извлечение метки времени: 1646995426.730455 0.000238 0.000238
- Респпротокол HTTP/1.1
- РеспСтатус 503
- Не удалось получить RespReason Backend.
- RespHeader Дата: пятница, 11 марта 2022 г., 10:43:46 по Гринвичу
- Сервер RespHeader: Лак
- Тип содержимого RespHeader: text/html; кодировка = utf-8
- RespHeader Retry-After: 5
- RespHeader X-лак: 1410496
- Возраст RespHeader: 0
- RespHeader Через: 1.1 лак-v4
- VCL_вызов ДОСТАВИТЬ
- RespHeader X-Cache-Host: rsi-prod-varnish45
- RespHeader X-Frame-Options: SAMEORIGIN
- RespHeader X-XSS-Защита: 1; режим = блок
- RespHeader X-Content-Type-Options: nosniff
- RespHeader Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval' *
- RespHeader X-Cache: HIT
- RespHeader X-Cache-Хитов: 0
- RespHeader X-Grace-Hit: да
- VCL_return доставить
- Процесс отметки времени: 1646995426.730495 0.000278 0.000040
- Длина содержимого RespHeader: 284
- Отладка "RES_MODE 2"
- Соединение RespHeader: закрыть
- Временная метка Ответ: 1646995426.730527 0.000310 0.000032
- ReqAcct 929 0 929 490 284 774
-   Конец
** << БеРек >> 1410497
-- Начало bereq 1410496 fetch
-- Отметка времени начала: 1646995426.730367 0,000000 0,000000
-- BereqМетод ПОЛУЧИТЬ
-- BereqURL /
-- BereqПротокол HTTP/1.1
-- Хост BereqHeader: www.example.com
-- Агент пользователя BereqHeader: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0
-- BereqHeader принимает: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
-- Язык приема BereqHeader: it,it-IT;q=0.8,en-US;q=0.5,en;q=0.3
-- BereqHeader update-insecure-requests: 1
-- BereqHeader x-forwarded-proto: https
-- BereqHeader x-forwarded-ssl: вкл.
-- BereqHeader x-forwarded-port: 443
-- BereqHeader X-Forwarded-For: 178.xxx.xxx.xxx, 10.xxx.xxx.xxx
-- Cookie BereqHeader: _pipe_c=do_not_track; _ga=GA1.2.1217589648.1620392041; __gads=ID=1a22b33c44d55e6f-1a22b33c44d55e6f:T=1620392042:RT=1620392042:S=ALNI_MYR9nyXrxcQ8QV1Y2pNVDp67Gn9-w; wt_rla=292330999892453%2C2%2C1646995242972; cs_fpid=1645855325408_55998969; JSESSI
-- BereqHeader Accept-Encoding: gzip
-- BereqHeader X-лак: 1410497
-- VCL_вызов BACKEND_FETCH
-- Извлечение бэкэнда VCL_Log: v_ssl_ece
-- VCL_return выборка
-- FetchError Director v_ssl_ece не вернул бэкэнд
-- FetchError Нет бэкенда
-- Временная метка Бересп: 1646995426.730387 0.000020 0.000020
-- Ошибка отметки времени: 1646995426.730390 0.000023 0.000003
-- БереспПротокол HTTP/1.1
-- BerespStatus 503
-- Служба BerespReason недоступна
-- Ошибка извлечения бэкэнда BerespReason
-- BerespHeader Дата: пятница, 11 марта 2022 г., 10:43:46 по Гринвичу
-- Сервер BerespHeader: Лак
-- VCL_вызов BACKEND_ERROR
-- BerespHeader Content-Type: text/html; кодировка = utf-8
-- BerespHeader Retry-After: 5
-- VCL_return доставить
-- Storage malloc Transient
-- Объектный протокол HTTP/1.1
-- Статус объекта 503
-- Ошибка извлечения бэкенда ObjReason
-- ObjHeader Дата: пятница, 11 марта 2022 г., 10:43:46 по Гринвичу
-- Сервер ObjHeader: Лак
-- Тип содержимого ObjHeader: text/html; кодировка = utf-8
-- ObjHeader Retry-After: 5
-- Длина 284
-- BereqAcct 0 0 0 0 0 0
--  Конец

РЕДАКТИРОВАТЬ 2: хеш и куки

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

суб vcl_hash {
  hash_data(req.url);
  если(треб.http.хост) {
    hash_data(req.http.host);
  } еще {
    hash_data(сервер.ip);
  }
  # хеш-куки для объекта с авторизацией
  если(треб.http.Cookie) {
    hash_data(req.http.Cookie);
  }
  возврат(поиск);
}

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

Рейтинг:0
флаг in

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

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

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

Вот немного VCL:

вкл 4.1;

импорт стандарт;

суб vcl_recv {
    если (std.healthy(req.backend_hint)) {
        установить req.grace = 10s;
    }
}

суб vcl_backend_response {
    установить beresp.grace = 24 часа;
}

Этот код VCL обеспечивает 24-часовую отсрочку. Это означает, что ваш сервер может быть отключен в течение дня, и никто этого не заметит. Однако, пока бэкенд исправен, Varnish будет использовать только 10 секунд отсрочки.

Важно, чтобы ваше определение серверной части имело .зонд свойство, которое ссылается на пробу проверки работоспособности, в противном случае std.healthy (req.backend_hint) никогда не сможет дать нужных результатов.

я использовал установить beresp.grace = 24h что может быть лишним. При установке льготы на такую ​​большую продолжительность эти объекты остаются в кеше, пока истекает срок их действия. Если у вас есть большой каталог контента, который необходимо кэшировать, это может повлиять на частоту попаданий и привести к принудительному вытеснению кеша, когда он будет заполнен.

ВАЖНЫЙ: Varnish Cache 4.1 устарел и не должен использоваться. Вместо этого установите Varnish 6.0 LTS или Varnish 7.

Мой пример VCL содержит вкл 4.1; маркер версии, который будет работать только в Varnish 6 или Varnish 7. Я делаю это специально, чтобы побудить пользователей использовать последние версии Varnish. Переключив это на vcl 4.0; код, вероятно, будет работать на более старых версиях Varnish. Пожалуйста, рассмотрите возможность обновления.

503 ошибка

Основываясь на выводе VSL, который вы добавили к своему вопросу, я могу сделать вывод, что вы определили и использовали объект-директор в своем VCL, который не имеет никаких бэкэндов.

Это ошибка, которую я нашел в вашем выводе VSL:

Директор v_ssl_ece не вернул бэкэнд

Пожалуйста, посмотрите имя директора v_ssl_ece.

  • Проверьте, нужен ли вам этот директор
  • Проверьте, правильно ли он назначен через req.backend_hint в vcl_recv или через bereq.backend в vcl_backend_fetch
  • Проверьте, почему v_ssl_ece не имеет никаких бэкэндов

Если вы не можете найти решение, поделитесь полным файлом VCL, чтобы я мог помочь.

Erich avatar
флаг sn
Большое спасибо! К сожалению, я не могу обновить лак до новой версии :-/ Ваше решение работает очень хорошо, если я использую curl, но если я использую браузер (chrome или firefox), лак возвращает ошибку 503. Я попытался смоделировать запрос firefox с помощью curl, используя все http-заголовки, которые firefox отправляет на сервер, но лак возвращает 200 OK, если я использую curl, и 503, если я использую firefox. У вас есть какие-нибудь подсказки по этому поводу? Еще раз спасибо
Thijs Feryn avatar
флаг in
Пожалуйста, добавьте вывод `varnishlog -g request -q "ReqUrl eq '/'"` к вопросу. Эта команда распечатает журналы для домашней страницы. Убедитесь, что вы используете браузер для вызова домашней страницы. Если вы получите сообщение об ошибке, в журналах может быть указано, почему.
Erich avatar
флаг sn
Я добавил вывод `varnishlog -g request -q "ReqUrl eq '/'"` в вопрос как для запроса из curl, так и для запроса из firefox. Видишь ли что-нибудь, что могло бы мне помочь? Еще раз спасибо
Thijs Feryn avatar
флаг in
@Erich Я обновил ответ информацией о выводе VSL.
Erich avatar
флаг sn
Извините за поздний ответ, мы долго пытались найти проблему. Я снова обновил свой вопрос и надеюсь, что у вас есть полезные предложения. Большое спасибо!
Thijs Feryn avatar
флаг in
@Erich Пожалуйста, не добавляйте файлы cookie в хеш, потому что это приведет к слишком большому количеству вариаций кеша и слишком большому количеству промахов. Если вы хотите создать варианты кеша на основе значений файлов cookie, извлеките выбранные файлы cookie и проверьте их содержимое, чтобы избежать заполнения вашего кеша бессмысленными вариантами кеша.
Thijs Feryn avatar
флаг in
@Erich Пожалуйста, также добавьте свой полный код VCL, а не только экстракт `hash_data`. Я хочу понять, что на самом деле происходит, и рассказать вам, что нужно изменить, чтобы обеспечить поведение *stale if error*, когда бэкэнд не работает. Мой первоначальный отзыв заключается в том, что `Set-Cookie: JSESSIONID=F8D07853DF7D90A3F381B316F64FA285; Путь=/; HttpOnly` может быть причиной того, что содержимое не сохраняется в кеше. См. https://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#dont-cache-responses-with-set-cookie-headers для получения дополнительной информации.

Ответить или комментировать

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