Pernis dan Terpentin

9

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_Varienkelas, 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_recvfungsi:

// 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:

Edisi # 345

Peter A
sumber
1
Saya melihat Anda baru saja membuka masalah pada GitHub, saya akan memeriksanya besok pagi. Sementara itu Anda dapat memeriksa github.com/nexcess/magento-turpentine/issues/90 dan github.com/nexcess/magento-turpentine/issues/92 .
mbalparda
ini tidak mungkin, sesi disimpan di magento dan browser pengguna, pernis tidak ada hubungannya dengan itu. ada sesuatu yang mungkin salah dikonfigurasi.

Jawaban:

4

Ini bisa disebabkan oleh pengaturan jalur cookie Anda yang tidak benar.

Coba atur pengaturan cookie Anda Admin->Configuration->Web->Session Cookie Managementjika belum.

Atau itu mungkin bug di pernis.

berperforma digital
sumber
Terima kasih @performadigital, saya telah melakukan beberapa penyelidikan lebih lanjut dan saya memperbarui pertanyaan saya.
Peter A
1

Saya menduga masalah Anda akan diselesaikan dengan pembaruan Turpentine terbaru: https://github.com/nexcess/magento-turpentine/commit/66615b7cc987854e8671911ab6c3aa22afb808a2

Penghapusan sesi sesi Dihapus Memperbaiki masalah # 806, # 345 dan banyak lainnya yang terkait dengan sesi ekstra, kereta kosong, dll.

Menyebabkan Varnish dilewati pada pemuatan halaman pertama untuk sesi baru.

Jadi Varnish tidak lagi harus mencoba memalsukan cookie sesi (dengan biaya tidak dapat menanggapi dari cache ke permintaan halaman pertama)

Kami telah menemukan bahwa perubahan ini telah menyelesaikan masalah ini untuk sejumlah pelanggan Magento kami (Kami menjalankan www.section.io ).

tidak tahu
sumber
1
Terima kasih @mattnthat, saya menyadari solusi yang diusulkan tetapi saya tidak dapat menerimanya. Saya akhirnya menerapkan solusi yang berbeda. Saya membuat Magento memeriksa apakah sesi itu valid, dan jika tidak, alih-alih mengakhiri skrip, saya membuatnya menginisialisasi sesi baru dan menyelesaikan permintaan.
Peter A