Saya menemukan bahwa setiap kali saya me-restart Varnish di server saya, saya kehilangan sesi untuk pengguna saya.
Ini adalah giliran membuat pelanggan saya kehilangan keranjang belanja mereka.
Apakah ini perilaku normal untuk Varnish atau VCL saya yang harus disalahkan? Tampaknya tidak
Info lebih lanjut.
Pada penyelidikan lebih lanjut, tampaknya masalah ini terkait dengan Masalah # 725 di GitHub.
Instalasi Magento saya adalah versi 1.9.1.0. Juga harus dikatakan bahwa seluruh frontend saya dijalankan di bawah https. Saya menggunakan Pound di depan Varnish untuk mengakhiri SSL.
Tampaknya perilaku Magento default dalam versi ini adalah membuat cookie frontend sekunder, biasanya disebut 'frontend_cid', Dalam upaya menguji terhadap serangan MITM.
Sepertinya file VCL yang dihasilkan oleh Turpentine tidak meneruskan cookie ini, yang menyebabkan sesi tidak valid.
Adakah yang bisa menjelaskan bagaimana file VCL meneruskan cookie yang dibuat Magento kepada Klien?
Saya mempersempit ini ke Varnish tidak menghasilkan cookie yang diperlukan.
Pada Magento 1.9.1.0, cookie 'frontend_cid' diperkenalkan untuk memblokir serangan MITM.
Ini dapat ditemukan di Mage_Core_Model_Session_Abstract_Varien
kelas, di baris 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);
}
}
Untuk menyediakan koneksi yang aman bagi klien, Varnish harus membuat cookie 'frontend', yang nantinya akan digunakan Magento untuk mengidentifikasi pelanggan tersebut. Sejauh ini, tampaknya melakukan ini baik-baik saja. Namun, sepertinya pada Magento 1.9.1.0, sekarang juga perlu membuat cookie 'frontend_cid'.
Varnish harus melakukan ini karena, dengan menyalin respons, itu juga cache header respons, yang berisi cookie 'frontend'.
Oleh karena itu, secara default, Varnish menghapus cookie apa pun yang merespons dengan backend ketika menangani kondisi 'pencarian' atau 'lulus'. Hal ini dilakukan untuk menghentikan beberapa pengguna dikeluarkan dengan cookie frontend cache yang sama (yang akan membahayakan sesi orang).
Setiap saat pernis menangani permintaan dengan 'pipa', Magento dapat membuat cookie yang diperlukan dan melampirkannya ke browser pengguna. Ini mengakibatkan sistem gagal dalam validasi awal, tetapi kemudian memberikan sesi baru kepada pengguna. Gejala ini bermanifestasi sebagai hilangnya keranjang atau ketidakmampuan untuk menambahkan produk ke keranjang belanja.
Turpentine VCL akan 'mem-pipe' permintaan apa pun yang BUKAN dari tipe metode GET atau HEAD seperti yang terlihat oleh kode ini dalam vcl_recv
fungsi:
// 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);
}
Oleh karena itu, gejalanya paling terlihat ketika pengguna mencoba menambahkan item ke troli mereka, atau mencoba checkout untuk pertama kalinya.
Bagaimana cara memperbaiki?
Saya percaya solusi untuk masalah ini adalah memiliki Turpentine VCL juga membuat cookie 'frontend_cid' untuk pengunjung yang masuk, dan kemudian modul terpentin menambahkan cookie itu ke sesi saat ini seperti sekarang untuk cookie 'frontend'.
Jadi ... bagaimana kita menerapkan ini?
Peringatan: Saya bisa saja salah, saya sangat baru di Varnish, tetapi saya telah menghabiskan banyak waktu untuk hal ini sekarang dan inilah yang saya lihat, dukungan siapa pun sekarang akan sangat dihargai.
PEMBARUAN AKHIR DAN FIX Pilihan Saya - 2015 10 30
Tidak mungkin membuat cookie 'frontend_cid' dalam pernis karena cookie dibuat secara acak di server oleh Magento dan disimpan sebagai hash MD5 di sesi pelanggan. Ini menghentikan Anda dari membuat secara eksternal di luar sesi pelanggan.
Solusi terbaik yang saya temukan pada masalah ini adalah alih-alih menimpa cara Magento menangani sesi pelanggan.
Saat ini Magento menangani sesi yang tidak valid seperti ini:
IF
The requested session by the customer is flagged as invalid
THEN
Stop processing request
Redirect to the appropriate page
Logika baru saya adalah sebagai berikut:
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
Pendekatan baru saya memungkinkan dipernis untuk menangani respons pelanggan bahkan pada kunjungan pertama. Yang tidak seberapa implementasi terbaru dari kerja terpentin.
Edisi Saya, Edisi # 829 - / nexcess / magento-turpentine / issues / 829 di GitHub. Salinan VCL saya dapat ditemukan di sini.
Masalah saya pada GitHub telah ditutup karena merupakan duplikat dari masalah yang jauh lebih tua yang ditemukan di sini: