Ich stelle fest, dass ich bei jedem Neustart von Varnish auf meinem Server meine Sitzungen für meine Benutzer verliere.
Dies führt dazu, dass meine Kunden ihre Einkaufswagen verlieren.
Ist das normales Verhalten für Lack oder ist meine VCL schuld? Es scheint, dass es nicht ist
Weitere Informationen.
Bei weiteren Untersuchungen scheint dieses Problem mit Problem Nr. 725 auf GitHub zu zusammenhängen.
Meine Magento-Installation ist Version 1.9.1.0. Es sollte auch gesagt werden, dass mein gesamtes Frontend unter https ausgeführt wird. Ich verwende Pound vor Varnish, um SSL zu beenden.
Es scheint, dass das Standardverhalten von Magento in dieser Version darin besteht, ein sekundäres Frontend-Cookie zu erstellen, das normalerweise als "frontend_cid" bezeichnet wird, um gegen MITM-Angriffe zu testen.
Es sieht so aus, als würde die von Terpentine generierte VCL-Datei dieses Cookie nicht weitergeben, was zu ungültigen Sitzungen führt.
Kann jemand erklären, wie die VCL-Datei die von Magento gesetzten Cookies an den Client weitergibt?
Ich habe dies auf Varnish eingegrenzt, ohne die erforderlichen Cookies zu generieren.
Ab Magento 1.9.1.0 wurde ein 'frontend_cid'-Cookie eingeführt, um MITM-Angriffe zu blockieren.
Dies finden Sie in der Mage_Core_Model_Session_Abstract_Varien
Klasse in Zeile 135
if (Mage::app()->getFrontController()->getRequest()->isSecure() && empty($cookieParams['secure'])) {
// secure cookie check to prevent MITM attack
$secureCookieName = $sessionName . '_cid';
if (isset($_SESSION[self::SECURE_COOKIE_CHECK_KEY])
&& $_SESSION[self::SECURE_COOKIE_CHECK_KEY] !== md5($cookie->get($secureCookieName))
) {
session_regenerate_id(false);
$sessionHosts = $this->getSessionHosts();
$currentCookieDomain = $cookie->getDomain();
foreach (array_keys($sessionHosts) as $host) {
// Delete cookies with the same name for parent domains
if (strpos($currentCookieDomain, $host) > 0) {
$cookie->delete($this->getSessionName(), null, $host);
}
}
$_SESSION = array();
}
if (!isset($_SESSION[self::SECURE_COOKIE_CHECK_KEY])) {
$checkId = Mage::helper('core')->getRandomString(16);
$cookie->set($secureCookieName, $checkId, null, null, null, true);
$_SESSION[self::SECURE_COOKIE_CHECK_KEY] = md5($checkId);
}
}
Um sichere Verbindungen für Kunden bereitzustellen, muss Varnish ein Frontend-Cookie generieren, mit dem Magento später diesen bestimmten Kunden identifiziert. Bisher scheint dies in Ordnung zu sein. Es sieht jedoch so aus, als ob ab Magento 1.9.1.0 jetzt auch das Cookie 'frontend_cid' generiert werden muss.
Varnish muss dies tun, da durch das Zwischenspeichern der Antwort auch der Antwortheader zwischengespeichert wird, der die Frontend-Cookies enthält.
Daher sprengt Varnish standardmäßig alle Cookies, mit denen das Backend antwortet, wenn es die Bedingungen für die Suche oder das Bestehen behandelt. Auf diese Weise wird verhindert, dass mehreren Benutzern dasselbe zwischengespeicherte Frontend-Cookie ausgestellt wird (dies würde die Sitzungen der Benutzer gefährden).
Jedes Mal, wenn Lack die Anfrage mit 'pipe' bearbeitet, kann Magento die erforderlichen Cookies erstellen und sie an den Browser des Benutzers anhängen. Dies führt dazu, dass das System die Erstvalidierung nicht besteht, dem Benutzer dann jedoch eine neue Sitzung bereitstellt. Dieses Symptom äußert sich in einem Verlust des Einkaufswagens oder in der Unfähigkeit, Produkte zum Einkaufswagen hinzuzufügen.
Die Terpentin-VCL leitet alle Anforderungen weiter, die NICHT vom Methodentyp GET oder HEAD sind, wie in diesem Code in der vcl_recv
Funktion dargestellt:
// We only deal with GET and HEAD by default
// we test this here instead of inside the url base regex section
// so we can disable caching for the entire site if needed
if (!true || req.http.Authorization ||
req.request !~ "^(GET|HEAD)$" ||
req.http.Cookie ~ "varnish_bypass=1") {
return (pipe);
}
Daher tritt das Symptom am deutlichsten auf, wenn der Benutzer versucht, einen Artikel in den Warenkorb zu legen, oder wenn er zum ersten Mal versucht, zur Kasse zu gehen.
Wie repariert man?
Ich glaube, die Lösung für dieses Problem besteht darin, dass die Terpentine VCL auch ein 'frontend_cid'-Cookie für eingehende Besucher erstellt und das Terpentinmodul dieses Cookie dann zur aktuellen Sitzung hinzufügt, wie dies jetzt für das' Frontend'-Cookie der Fall ist.
Also ... wie setzen wir das um?
Vorsichtsmaßnahme: Ich könnte mich irren, ich bin sehr neu in Varnish, aber ich habe jetzt viele Stunden damit verbracht, und das ist es, was ich sehe. Jede Unterstützung im Moment wäre sehr dankbar.
ENDGÜLTIGES UPDATE UND MEIN AUSGEWÄHLTES FIX - 2015 10 30
Es ist unmöglich, ein 'frontend_cid'-Cookie in Lack zu erstellen, da das Cookie von Magento zufällig auf dem Server erstellt und in der Kundensitzung als MD5-Hash gespeichert wird. Dies verhindert, dass Sie außerhalb der Kundensitzung extern erstellen.
Die beste Lösung, die ich zu diesem Problem gefunden habe, besteht darin, stattdessen die Art und Weise zu überschreiben, wie Magento Kundensitzungen behandelt.
Derzeit behandelt Magento ungültige Sitzungen wie folgt:
IF
The requested session by the customer is flagged as invalid
THEN
Stop processing request
Redirect to the appropriate page
Meine neue Logik lautet wie folgt:
IF
The requested session by the customer is flagged as invalid
THEN
Create a new session
Complete the requested task
Redirect to the appropriate page
Mein neuer Ansatz ermöglicht es lackiert, die Kundenreaktion bereits beim ersten Besuch zu verarbeiten. So funktioniert die neueste Implementierung von Terpentin nicht.
Meine Ausgabe, Ausgabe # 829 - / nexcess / magento-terpentine / issue / 829 auf GitHub. Eine Kopie meiner VCL finden Sie hier.
Mein Problem auf GitHub wurde geschlossen, da es sich um ein Duplikat eines viel älteren Problems handelt, das hier zu finden ist: