我最近把我的主要网站之一转移到WordPress安装,但不幸的是,这导致了非常高的服务器负载。 最初,我运行一个基本的LAMP服务器与几个网站。 我现在主要关心的是一个网站,每天点击6万次点击,并且有一个非常活跃的使用Invision电源板的论坛。
这使我现在到了现在。 我换了nginx的apache,优化了一下MySQL,并安装了Varnish。 这帮助了很多,除了我的Invision电源板安装以外的其他一切工作。 无论出于何种原因,IPB将不再允许我login或注销。 在我login的其中一台计算机上,我可以保持login状态。但是,如果我尝试从另一台计算机或浏览器login到ACP或论坛,则无法工作。 以下是我在Varnish中的设置:
sub vcl_recv { if (req.http.host ~ "^(www\.)?domain1\.net$") { set req.http.host = "domain1.net"; set req.backend = domain1; return (lookup); } if (req.http.host == "old.domain1.net") { #You will need the following line only if your backend has multiple virtual host names set req.http.host = "old.domain1.net"; set req.backend = olddomain1; return (lookup); } if (req.http.host ~ "^(www\.)?domain2\.net$") { set req.http.host = "domain2.net"; set req.backend = domain2; return (lookup); } if (req.http.host ~ "^(www\.)?domain3\.com$") { set req.http.host = "domain3.com"; set req.backend = domain3; return (lookup); } if (req.http.host ~ "^(www\.)?domain4\.org$") { set req.http.host = "domain4.org"; set req.backend = domain4; return (lookup); } } # Drop any cookies sent to WordPress. sub vcl_recv { #exclusion for one domain that has low-views and maybe have unexpected results if (!(req.http.host ~ "^(www\.)?domain4\.org$")) { if (!(req.url ~ "wp-(login|admin)")) { if (!(req.url ~ "forums")) { unset req.http.cookie; } } } } # Drop any cookies WordPress tries to send back to the client. sub vcl_fetch { #exclusion for one domain that has low-views and maybe have unexpected results if (!(req.http.host ~ "^(www\.)?domain4\.org$")) { if (!(req.url ~ "wp-(login|admin)")) { if (!(req.url ~ "forums")) { unset beresp.http.set-cookie; } } } }
我对nginx和varnish很新。 我看到另一个问题,但没有好的解决办法。
你在第一个vcl_recv中做显式的return(lookup) 。 这意味着第二个vcl_recv块中的代码只会在请求没有碰到第一个块中的任何一个条件时运行(即,如果它不是^(((www\.|old\.)?domain1\.net)|((www\.)?domain(2\.net|3\.com|4\.org))$ ) 和第二个vcl_recv的所有其他部分( if块成功)。
从根本上说,你在这里覆盖了Varnish的完美的内build逻辑,如果可用的话,它将通过login用户的请求(也就是用cookies的请求)传送到后端,而其余的则从caching中提供。 你可以简单地通过删除所有的return(lookup)来得到你正在查找的结果。 但是如果你坚持以目前的方式来做,你只需要添加:
sub vcl_hash { if ( req.http.Cookie ) { hash_data( req.http.Cookie ); } }
重写Varnish逻辑的好处在于,即使是对服务器处理请求没有任何影响的cookie(例如Google Analytics urchin ID)也会导致每个请求都到达后端。 为了避免这种情况,可以将服务器所关心的cookies列入白名单,或将黑名单列入黑名单。 networking和https://www.varnish-cache.org/提供了许多技术来实现这一目标。
编辑:略有扩展,这里发生的是,你告诉Varnish,如果一个请求来了,比方说,domain1,然后使用domain1的后端,然后尝试从caching中检索该对象。 如果它不在caching中,它将从后端获取并将其存储在caching中。 只要响应中没有Set-Cookie头文件(在default.vcl中,这会导致对象不可caching),下次有人要求同一页面时,他们会将其视为任何用户(或者其中任何一个“非用户”,对于没有login的用户)最后一次看到,假设TTL没有过期。 我们用vcl_hash代码做的vcl_hash就是对Varnish说,它应该考虑caching的对象,这些对象是根据随请求提供的Cookie而不同的。 我们可以很容易地改善这一点 – 例如,我们只能关心那些不以\.(jpg|png|gif|AndSoForth)$结尾的页面,但是正确的位置在vcl_recv ,我们应该简单地删除这些请求的Cookie头。
首先 – 你有两个vcl_recv函数,你需要把它们合并成一个。
但是这只是阻止发送到服务器的cookie。 似乎将cookie发送到客户端就是现有会话保持工作的问题所在。
做一个testinglogin没有清漆; 什么时候由服务器发送Set-Cookie ? find发生的地方,然后再次使用Varnish进行testing,看看在这种情况下是否正确发送Set-Cookie 。 这可能就是if (!(req.url ~ "forums")) {豁免不会捕获发送cookie的资源。