Véc ni và Turpentine


9

Tôi thấy rằng bất cứ khi nào tôi khởi động lại Varnish trên máy chủ của mình, tôi sẽ mất các phiên cho người dùng của mình.

Đây là lần lượt làm cho khách hàng của tôi mất giỏ hàng của họ.

Đây có phải là hành vi bình thường đối với Varnish hay là VCL của tôi bị đổ lỗi? Có vẻ như nó không phải là


Thêm thông tin.

Khi điều tra thêm, có vẻ như vấn đề này có liên quan đến Vấn đề # 725 trên GitHub.

Cài đặt Magento của tôi là phiên bản 1.9.1.0. Cũng cần phải nói rằng toàn bộ lối vào của tôi đang được chạy dưới https. Tôi đang sử dụng Pound trước Varnish để chấm dứt SSL.

Dường như hành vi Magento mặc định trong phiên bản này là tạo cookie ngoại vi thứ cấp, thường được gọi là 'frontend_cid', trong nỗ lực kiểm tra các cuộc tấn công MITM.

Có vẻ như tệp VCL được tạo bởi Turpentine không chuyển qua cookie này, điều này gây ra các phiên không hợp lệ.

Bất cứ ai cũng có thể giải thích cách tệp VCL chuyển qua cookie mà Magento tạo ra cho Máy khách?


Tôi đã thu hẹp điều này xuống để Varnish không tạo ra các cookie cần thiết.

Kể từ Magento 1.9.1.0, cookie 'frontend_cid' đã được giới thiệu để chặn các cuộc tấn công MITM.

Điều này có thể được tìm thấy trong Mage_Core_Model_Session_Abstract_Varienlớp, tại dòng 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);
    }
}

Để cung cấp các kết nối an toàn cho khách hàng, Varnish phải tạo ra một cookie 'frontend', mà Magento sau này sẽ sử dụng để xác định khách hàng cụ thể đó. Cho đến nay, nó xuất hiện để làm điều này chỉ tốt. Tuy nhiên, nó trông giống như Magento 1.9.1.0, giờ đây nó cũng cần tạo cookie 'frontend_cid'.

Varnish phải làm điều này bởi vì, bằng cách lưu bộ đệm phản hồi, nó cũng lưu trữ tiêu đề phản hồi, chứa cookie 'frontend'.

Do đó, theo mặc định, Varnish sẽ loại bỏ mọi cookie mà phụ trợ phản hồi khi xử lý các điều kiện 'tra cứu' hoặc 'vượt qua'. Nó thực hiện điều này để ngăn chặn nhiều người dùng được cấp cùng một cookie giao diện được lưu trong bộ nhớ cache (điều đó sẽ làm ảnh hưởng đến các phiên của mọi người).

Bất cứ lúc nào véc ni xử lý yêu cầu bằng 'pipe', Magento có thể tạo cookie yêu cầu và đính kèm chúng vào trình duyệt của người dùng. Điều này dẫn đến hệ thống không xác nhận ban đầu, nhưng sau đó cung cấp một phiên mới cho người dùng. Triệu chứng này biểu hiện là mất giỏ hàng hoặc không thể thêm sản phẩm vào giỏ hàng.

Turpentine VCL sẽ 'ống' bất kỳ yêu cầu nào KHÔNG thuộc loại phương thức GET hoặc HEAD như mã này đã thấy trong vcl_recvhàm:

// 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);
}

Do đó, triệu chứng đáng chú ý nhất là khi người dùng cố gắng thêm một mặt hàng vào giỏ hàng của họ hoặc cố gắng kiểm tra lần đầu tiên.


Làm thế nào để khắc phục?

Tôi tin rằng giải pháp cho vấn đề này là để VCL Turpentine cũng tạo cookie 'frontend_cid' cho khách truy cập đến và sau đó có mô-đun turpentine thêm cookie đó vào phiên hiện tại giống như bây giờ cho cookie 'frontend'.

Vậy ... làm thế nào để chúng ta thực hiện điều này?

Hãy cẩn thận: Tôi có thể sai, tôi rất mới với Varnish, nhưng tôi đã dành rất nhiều giờ cho việc này và đây là những gì tôi đang thấy, bất kỳ ai hỗ trợ ngay bây giờ sẽ được đánh giá rất cao.

CẬP NHẬT CUỐI CÙNG VÀ CỐ ĐỊNH CỦA TÔI - 2015 10 30

Không thể tạo cookie 'frontend_cid' bằng véc-ni vì cookie được tạo ngẫu nhiên trên máy chủ bởi Magento và được lưu trữ dưới dạng băm MD5 trong phiên khách hàng. Điều này ngăn bạn tạo ra bên ngoài phiên khách hàng.

Giải pháp tốt nhất tôi đưa ra về vấn đề này là thay vào đó ghi đè lên cách Magento xử lý các phiên của khách hàng.

Hiện tại Magento xử lý các phiên không hợp lệ như thế này:

IF
    The requested session by the customer is flagged as invalid
THEN
    Stop processing request
    Redirect to the appropriate page

Logic mới của tôi diễn ra như sau:

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

Cách tiếp cận mới của tôi cho phép thay đổi để xử lý phản hồi của khách hàng ngay cả trong lần truy cập đầu tiên. Đó không phải là cách thực hiện mới nhất của turpentine hoạt động.


Vấn đề của tôi, Vấn đề # 829 - / nexcess / magento-turpentine / vấn đề / 829 trên GitHub. Một bản sao của VCL của tôi có thể được tìm thấy ở đây.


Vấn đề của tôi trên GitHub đã bị đóng vì đây là bản sao của một vấn đề cũ hơn nhiều được tìm thấy ở đây:

Vấn đề # 345


1
Tôi thấy bạn vừa mở một vấn đề trên GitHub, tôi sẽ kiểm tra nó vào sáng mai. Trong thời gian chờ đợi, bạn có thể kiểm tra github.com/nexcess/magento-turpentine/issues/90github.com/nexcess/magento-turpentine/issues/92 .
mbalparda

Điều này là không thể, các phiên được lưu trữ trong magento và trình duyệt của người dùng, véc ni không liên quan gì đến nó. một cái gì đó có thể được cấu hình sai.

Câu trả lời:


4

Điều này có thể được gây ra bởi không thiết lập chính xác đường dẫn cookie của bạn.

Hãy thử cài đặt cookie của bạn Admin->Configuration->Web->Session Cookie Managementnếu chưa có.

Ngoài ra, nó có thể là một lỗi trong vecni.


Cảm ơn @performadigital, tôi đã thực hiện một số điều tra thêm và đang cập nhật câu hỏi của tôi.
Peter A

1

Tôi nghi ngờ vấn đề của bạn sẽ được giải quyết bằng bản cập nhật Turpentine gần đây: https://github.com/nexcess/magento-turpentine/commit/66615b7cc987854e8671911ab6c3aa22afb808a2

Tạo phiên bị xóa Khắc phục các sự cố # 806, # 345 và nhiều vấn đề khác liên quan đến phiên ngoại, giỏ hàng trống, v.v.

Nguyên nhân Varnish bị bỏ qua khi tải trang đầu tiên cho các phiên mới.

Vì vậy, Varnish không còn phải cố gắng giả mạo cookie phiên (với chi phí không thể phản hồi từ bộ đệm đến yêu cầu trang đầu tiên)

Chúng tôi đã thấy rằng thay đổi này đã giải quyết vấn đề này cho một số khách hàng Magento của chúng tôi (Chúng tôi điều hành www.section.io ).


1
Cảm ơn @mattnthat, tôi biết về giải pháp được đề xuất nhưng tôi không thấy nó có thể chấp nhận được. Tôi đã kết thúc việc thực hiện một giải pháp khác nhau. Tôi đã thực hiện kiểm tra Magento xem phiên có hợp lệ không và nếu không, thay vì chấm dứt tập lệnh, tôi đã thực hiện để khởi tạo phiên mới và hoàn tất yêu cầu.
Peter A
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.