2

我正在测试 Varnish 以增加 Magento 的加载时间,到目前为止,缓存效果非常好。我可以为 index.php 提供 32-35 页/秒的速度,而为目录页面提供的最大速度为 1200/秒。但是,我遇到了一个我真的在努力解决的问题。这几天我一直在努力解决这个问题。将产品添加到购物车时,它会重定向到主页,然后显示“商品 XXX 已添加到您的购物车”。我可以看到 Varnish 获取 302 以将其返回到我从中添加项目的页面,但它总是弹回主页。添加产品进行比较时也存在同样的问题,但这永远不会添加到要比较的项目列表中。

您可以在此处查看该站点:http: //test.autoracks.com

这是我的 default.vcl:

        # 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.";
                }
                purge("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);
            #}

            # 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 {
            set req.hash += req.url;
            if (req.http.host) {
                 set req.hash += req.http.host;
            } else {
                set req.hash += server.ip;
            }
            if (!(req.url ~ "^/(media|js|skin)/.*\.(png|jpg|jpeg|gif|css|js|swf|ico)$")) {
                call design_exception;
            }
            return (hash);
        }
        # 
        # sub vcl_hit {
        #     if (!obj.cacheable) {
        #         return (pass);
        #     }
        #     return (deliver);
        # }
        # 
        # sub vcl_miss {
        #     return (fetch);
        # }

        sub vcl_fetch {
            if (beresp.status == 500) {
               set beresp.saintmode = 10s;
               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 (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 = 4h;
                }
                return (deliver);
            }

            return (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";
        #     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 design_exception {
        }

如果我把 nginx 放在前面,我应该一切正常。对此的任何帮助将不胜感激,我真的很想让这个工作!

谢谢...

4

2 回答 2

2

此问题位于 Magento Core 中。由于该方法getCurrentUrl使用 Nginx 端口号构建 URL(在 Varnish 后面通常不为 80)。稍后,当重定向 URL 被解码时,由于端口号,它作为“内部 URL”失败。

解决方案(不修改 Magento 核心)是将 Nginx 设置为侦听端口 80,将 Varnish 设置为其他端口。然后使用 iptables 将传入流量映射到 Varnish。

我在一篇关于保持 Magento 对 Varnish 满意的博文中对此进行了介绍。

于 2013-04-21T10:39:00.250 回答
1

当我使用 siege 使用本地 apache 服务器测试 varnish 时,测试有时会发送与我预期的测试不同的响应 url。我不知道为什么我从来没有(用我的眼睛)目睹错误的页面加载,即使我在开发其他东西时一直使用相同的 vcl 运行它。但我按照清漆网站上的建议安装了 64 位操作系统。我的问题消失了。你用的是32位系统吗?

于 2012-10-28T20:53:09.483 回答