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_Varien
lớ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_recv
hà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: