2013-06-24 2 views
1

우리는 Amazon Web Service EC2 Magento 인스턴스를 RDS 및 Varnish Cache와 nginx로 실행하고 있습니다. 우리는 현재 사용자가 카트에 두 번째 항목을 추가하려고 할 때 카트가 비어 있다는 문제에 직면하고 있습니다. 새 쿠키가 설정되어 세션이 삭제됩니다. 여기에 .vcl 파일이 있습니다.Varnish Magento 캐시 비우기

# default backend definition. Set this to point to your content server. 
backend default { 
    .host = "127.0.0.1"; 
    .port = "8080"; 
} 

# admin backend with longer timeout values. Set this to the same IP & port as your default server. 
backend admin { 
    .host = "127.0.0.1"; 
    .port = "8080"; 
    .first_byte_timeout = 18000s; 
    .between_bytes_timeout = 18000s; 
} 

# add your Magento server IP to allow purges from the backend 
acl purge { 
    "localhost"; 
    "127.0.0.1"; 
} 


sub vcl_recv { 
    if (req.restarts == 0) { 
     if (req.http.x-forwarded-for) { 
      set req.http.X-Forwarded-For = 
      req.http.X-Forwarded-For + ", " + client.ip; 
     } else { 
      set req.http.X-Forwarded-For = client.ip; 
     } 
    } 

    if (req.request != "GET" && 
     req.request != "HEAD" && 
     req.request != "PUT" && 
     req.request != "POST" && 
     req.request != "TRACE" && 
     req.request != "OPTIONS" && 
     req.request != "DELETE" && 
     req.request != "PURGE") { 
     /* Non-RFC2616 or CONNECT which is weird. */ 
     return (pipe); 
    } 

    # purge request 
    if (req.request == "PURGE") { 
     if (!client.ip ~ purge) { 
      error 405 "Not allowed."; 
     } 
     ban("obj.http.X-Purge-Host ~ " + req.http.X-Purge-Host + " && obj.http.X-Purge-URL ~ " + req.http.X-Purge-Regex + " && obj.http.Content-Type ~ " + req.http.X-Purge-Content-Type); 
     error 200 "Purged."; 
    } 

    # switch to admin backend configuration 
    if (req.http.cookie ~ "adminhtml=") { 
     set req.backend = admin; 
    } 

    # we only deal with GET and HEAD by default  
    if (req.request != "GET" && req.request != "HEAD") { 
      return (pass); 
    } 

    # normalize url in case of leading HTTP scheme and domain 
    set req.url = regsub(req.url, "^http[s]?://[^/]+", ""); 

    # static files are always cacheable. remove SSL flag and cookie 
    if (req.url ~ "^/(media|js|skin)/.*\.(png|jpg|jpeg|gif|css|js|swf|ico)$") { 
     unset req.http.Https; 
     unset req.http.Cookie; 
    } 

    # not cacheable by default 
    if (req.http.Authorization || req.http.Https) { 
     return (pass); 
    } 

    # do not cache any page from 
    # - index files 
    # - ... 
    if (req.url ~ "^/(index)") { 
     return (pass); 
    } 

    # checkout should not be cached by varnish 
    if (req.url ~ "/(checkout|customer|catalog/product_compare|wishlist)/") { 
     return(pass); 
    } 

    # if (req.url ~ "^/(index.php/)?(checkout|onepagecheckout)") 
    # { 
    # return(pipe); 
    # } 

    # as soon as we have a NO_CACHE cookie pass request 
    if (req.http.cookie ~ "NO_CACHE=") { 
     return (pass); 
    } 

    # normalize Aceept-Encoding header 
    # http://varnish.projects.linpro.no/wiki/FAQ/Compression 
    if (req.http.Accept-Encoding) { 
     if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|flv)$") { 
      # No point in compressing these 
      remove req.http.Accept-Encoding; 
     } elsif (req.http.Accept-Encoding ~ "gzip") { 
      set req.http.Accept-Encoding = "gzip"; 
     } elsif (req.http.Accept-Encoding ~ "deflate" && req.http.user-agent !~ "MSIE") { 
      set req.http.Accept-Encoding = "deflate"; 
     } else { 
      # unkown algorithm 
      remove req.http.Accept-Encoding; 
     } 
    } 

    # remove Google gclid parameters 
    set req.url = regsuball(req.url,"\?gclid=[^&]+$",""); # strips when QS = "?gclid=AAA" 
    set req.url = regsuball(req.url,"\?gclid=[^&]+&","?"); # strips when QS = "?gclid=AAA&foo=bar" 
    set req.url = regsuball(req.url,"&gclid=[^&]+",""); # strips when QS = "?foo=bar&gclid=AAA" or QS = "?foo=bar&gclid=AAA&bar=baz" 

    return (lookup); 
} 

# sub vcl_pipe { 
#  # Note that only the first request to the backend will have 
#  # X-Forwarded-For set. If you use X-Forwarded-For and want to 
#  # have it set for all requests, make sure to have: 
#  # set bereq.http.connection = "close"; 
#  # here. It is not set by default as it might break some broken web 
#  # applications, like IIS with NTLM authentication. 
#  return (pipe); 
# } 
# 
# sub vcl_pass { 
#  return (pass); 
# } 
# 
sub vcl_hash { 
    hash_data(req.url); 
    if (req.http.host) { 
     hash_data(req.http.host); 
    } else { 
     hash_data(server.ip); 
    } 
    if (!(req.url ~ "^/(media|js|skin)/.*\.(png|jpg|jpeg|gif|css|js|swf|ico)$")) { 
     call design_exception; 
    } 
    return (hash); 
} 
# 
# sub vcl_hit { 
#  return (deliver); 
# } 
# 
# sub vcl_miss { 
#  return (fetch); 
# } 

sub vcl_fetch { 
    if (beresp.status == 500) { 
     set beresp.saintmode = 10s; 
     return (restart); 
    } 
    set beresp.grace = 5m; 

    # add ban-lurker tags to object 
    set beresp.http.X-Purge-URL = req.url; 
    set beresp.http.X-Purge-Host = req.http.host; 

    if (beresp.status == 200 || beresp.status == 301 || beresp.status == 404) { 
     if (beresp.http.Content-Type ~ "text/html" || beresp.http.Content-Type ~ "text/xml") { 
      if ((beresp.http.Set-Cookie ~ "NO_CACHE=") || (beresp.ttl < 1s)) { 
       set beresp.ttl = 0s; 
       return (hit_for_pass); 
      } 

      # marker for vcl_deliver to reset Age: 
      set beresp.http.magicmarker = "1"; 

      # Don't cache cookies 
      unset beresp.http.set-cookie; 
     } else { 
      # set default TTL value for static content 
      set beresp.ttl = 30d; 
        } 
     return (deliver); 
    } 

    return (hit_for_pass); 
} 

sub vcl_deliver { 
    # debug info 
    if (resp.http.X-Cache-Debug) { 
     if (obj.hits > 0) { 
      set resp.http.X-Cache = "HIT"; 
      set resp.http.X-Cache-Hits = obj.hits; 
     } else { 
      set resp.http.X-Cache = "MISS"; 
     } 
     set resp.http.X-Cache-Expires = resp.http.Expires; 
    } else { 
     # remove Varnish/proxy header 
     remove resp.http.X-Varnish; 
     remove resp.http.Via; 
     remove resp.http.Age; 
     remove resp.http.X-Purge-URL; 
     remove resp.http.X-Purge-Host; 
    } 

    if (resp.http.magicmarker) { 
     # Remove the magic marker 
     unset resp.http.magicmarker; 

     set resp.http.Cache-Control = "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; 
     set resp.http.Pragma = "no-cache"; 
     set resp.http.Expires = "Mon, 31 Mar 2008 10:00:00 GMT"; 
     set resp.http.Age = "0"; 
    } 
} 

# sub vcl_error { 
#  set obj.http.Content-Type = "text/html; charset=utf-8"; 
#  set obj.http.Retry-After = "5"; 
#  synthetic {" 
# <?xml version="1.0" encoding="utf-8"?> 
# <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
# "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
# <html> 
# <head> 
#  <title>"} + obj.status + " " + obj.response + {"</title> 
# </head> 
# <body> 
#  <h1>Error "} + obj.status + " " + obj.response + {"</h1> 
#  <p>"} + obj.response + {"</p> 
#  <h3>Guru Meditation:</h3> 
#  <p>XID: "} + req.xid + {"</p> 
#  <hr> 
#  <p>Varnish cache server</p> 
# </body> 
# </html> 
# "}; 
#  return (deliver); 
# } 
# 
# sub vcl_init { 
# return (ok); 
# } 
# 
# sub vcl_fini { 
# return (ok); 
# } 

sub design_exception { 
} 

기본적으로 잘못된 것을하고 있습니까? 또는 우리가 잘못된 지점을 찾고 있습니까? 많은 도움에 감사드립니다.

환호, 볼프강

답변

0

귀하의 게시 .vcl 그러나 잘하지만 외모 :

1)이 설치 official Pagecache powered by Varnish Magento module이 있는지 확인합니다.

2) 백엔드에서 시스템 => 구성 => 시스템 아래에 광택 전용 탭이 있습니다. 모든 설정이 올바르게 채워 졌는지 확인하십시오.

3)

4) 모든 일을해야 설정 "NO_CACHE"또는 "EXTERNAL_NO_CACHE"쿠키가 장바구니에 제품을 추가 한 후 다음을 확인?

+0

빠른 답장을 보내 주신 KennyDs에게 감사드립니다. 1 단계와 2 단계는 명확합니다. 장바구니에 제품을 추가 한 후 NO_CACHE 또는 EXTERNAL_NO_CACHE가 설정되도록하려면 어떻게해야합니까? –

+0

여기에서는 Chrome에서 쿠키를 확인하는 방법에 대해 설명합니다. http://stackoverflow.com/questions/913296/how-to-see-cookie-information-of-chrome-browser – Kenny

+1

개발자 확장 프로그램에는 카트가 이미 NO_CACHE로 표시되어 있다는 내용이 모두 나와 있습니다. 그 동안 우리는 또한 페이지의 404 오류로 인해 세션이 삭제 될 수 있습니다. 이것이 그 같은 문제를 일으킬 수 있다고 생각합니까? –

관련 문제