У меня есть рабочий кеш лака для моих веб-сайтов с нежелательным побочным эффектом, заключающимся в том, что запросы домена с http кэшируются с определенным URL-адресом, а запросы https с другим URL-адресом. Таким образом, я получаю двойные объекты в кеше, и я хотел спросить о некоторых передовых практиках, как оптимизировать это поведение.
Подробно у меня есть два хоста в nginx для одного и того же домена, которые прослушивают порт 80 и 443 каждый. Запросы передаются в лак по доверенности:
proxy_pass http://varnish:8101/VirtualHostBase/http/example.com:80/path/VirtualHostRoot/;
и
proxy_pass http://varnish:8101/VirtualHostBase/https/example.com:443/path/VirtualHostRoot/;
В varnish.vcl я проверяю запрашивающий хост и устанавливаю правильный бэкэнд, поскольку их несколько.
if (req.http.host == "example.com") {
set req.backend = backend_0;
}
Бэкэнд - это сервер Zope / Plone. Страницы правильно кэшируются лаком, но у меня есть запись для /VirtualHostBase/http/example.com:80/path/VirtualHostRoot/logo.png и одна для /VirtualHostBase/https/example.com:443/path/VirtualHostRoot/ logo.png в моем журнале varnishlog (RxURL).
Когда Plone очищает запись, удаляется только версия ssl, потому что каждый зарегистрированный пользователь должен использовать https. Запись http сохраняется до тех пор, пока возраст не будет признан недействительным.
Можно ли объединить запросы http и https в один объект varnish, переписав URL-адреса? Чтобы сэкономить место и провести успешную чистку. Может кто подскажет, как это решить!
Varnish идентифицирует различные сущности по их req.url
и их req.http.Host
(если присутствует, в противном случае используется server.ip
). Что вы хотите:
sub vcl_hash {
#Example URL is:
# http://varnish:8101/VirtualHostBase/http/example.com:80/path/VirtualHostRoot/
#req.url contains only:
# /VirtualHostBase/http/example.com:80/path/VirtualHostRoot/
#after transform, this will become:
# /VirtualHostBase/fakescheme/example.com:fakeport/path/VirtualHostRoot/
hash_data(regsub(regsub(req.url,":(80|443)/",":fakeport/"),"/https?/","/fakescheme/")); #equivalent of "hash URL"
#Below here, copied from default.vcl
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (hash);
}
Идея, как это реализовать:
Итак, вам необходимо настроить:
На самом деле Nginx уже можно настроить как кэширующий обратный прокси. Однако, если вы хотите иметь определенные правила кеширования, лучшим решением будет возможность удалять отдельные объекты из кеша и т. Д. Varnish.
Подсказка:
Вы должны проверить, хорошо ли работает ваш сайт с одинаковыми объектами кеша для http и https. Это не так, если веб-сайт предоставляет HTML, CSS или JavaScript с использованием абсолютных URL-адресов для внешнего контента (например, встроенных медиаресурсов). Как вы знаете, браузеры не любят встраивать ресурсы HTTP в веб-сайты HTTPS.