Клиент обратился к нам с проблемой с системой входа на одну из закодированных страниц. Иногда бывает, что пользователи входят в систему как кто-то другой. Как бы мы ни старались, мы не могли повторить это. Я подозреваю, что причиной этого является Varnish (поскольку клиент впервые сообщил, что эта проблема возникла после того, как системный администратор установил ее), но у меня нет большого опыта с этим, и наш системный администратор, похоже, не хочет помогать.
На странице используется ESI. Все включения, специфичные для пользователя, вообще не кэшируются, за одним исключением: имя пользователя в заголовке отдельного включения. Мы кэшируем этот ESI с помощью Vary: Cookie
, так что это не должно быть проблемой.
Наша установка на сервере: Nginx -> Varnish -> Apache. это это наш конфиг Varnish. Nginx не должен ничего кэшировать (по крайней мере, так утверждает системный администратор).
Я подозреваю, что в конфигурации Varnish есть опечатка или неправильная конфигурация. Любые подсказки приветствуются.
Я подозреваю, что это может быть связано с вашей функцией vcl_hash. Если вам это не нужно, закомментируйте это и посмотрите, что произойдет - сначала попробуйте на тестовом сервере, который имитирует настройку вашего клиента.
Подробности следуют: (Я новичок в лаке, поэтому вот мое понимание):
Эта функция используется varnish для «маркировки» кэшированного содержимого. Исходя из логики здесь, хеш - это либо URL-адрес запроса, либо IP-адрес хоста или сервера. Если пользователь user1 входит и входит в систему на clientapp.com, лак помечает эту страницу хешем, используя хост clientapp.com. Поэтому, когда user2 появляется на том же хосте, varnish видит, что страница уже кэширована на основе правил в хэш-функции, и доставляет кешированную страницу пользователю user2, когда этого не должно быть. Если user2 войдет в систему, посетив IP-адрес сервера, держу пари, он увидит свою информацию. Однако, если user3 входит в систему через IP-адрес, он / она увидит информацию user2.
sub vcl_hash {
hash_data(req.url); //This is never used 'cos of the lines that follow
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (hash);
}