我可以使用光盘caching与我的cookies

我很想利用清的力量来caching我的PHP密集型应用程序,每天为大约40万人提供服务。

应用程序通过触发多个卷起XML的线程来search数据,因此您可以想象新线程会产生很multithreading,并且线程会保持打开状态几秒钟,从而使页面加载时间缩短了几秒。

每个search结果页面的caching将显着加快用户体验。

所以这是我的问题的基础。

我们的search结果页面需要转换代码跟踪。 因此,用户来自源/引用者A,到我们的页面domain.com/search/?q=something&source=A,select适当的转换跟踪代码(涉及引用者A)并将其输出到页面。 Cookie也被丢弃,所以下次用户返回页面时检查cookie是否存在,如果是,则select在HTML中显示正确的转换代码。

通过这种方式,转化跟踪可以在会话中进行。

问题是,鉴于我们的cookie要求的知识是否有可能在这种情况下使用清漆caching? 我们可以以某种方式configurationVCL来处理这些cookie,如果是的话,我们应该写什么?

谢谢

我发现考虑Varnish的有效性和实现的最简单的方法是通过组合考虑。 每个variables创build指数更多的组合。 简而言之,这些variables是:host,URI和headers / cookies。

例如,这些是Varnishcaching中的不同对象

domain.com/search/?q=something domain.com/search/?q=something&source=A domain.com/search/?q=something&source=B domain.com/search/?q=something&source=A + nocookie domain.com/search/?q=something&source=A + cookie1 domain.com/search/?q=something&source=A + cookie2 domain.com/search/?q=something&source=B + nocookie domain.com/search/?q=something&source=B + cookie1 domain.com/search/?q=something&source=B + cookie2 

但是,只要源文件的变化不大,只要服务器不负责根据源文件输出不同的内容,使用Varnish应该是半直接的,但是只有当你做了一些操纵第一。

由于您可以使用Varnish操作客户端的大部分请求,因此在将请求的URI发送到后端服务器之前,实际上可能会从请求的URI中除去&source = A或&source = B。 这本质上是所有这些请求:

 domain.com/search/?q=something&source=A + nocookie domain.com/search/?q=something&source=A + cookie1 domain.com/search/?q=something&source=A + cookie2 domain.com/search/?q=something&source=B + nocookie domain.com/search/?q=something&source=B + cookie1 domain.com/search/?q=something&source=B + cookie2 

变成这样:

 domain.com/search/?q=something 

什么是6错过,没有命中现在是1小姐和5点击

所以客户从Varnish请求这个:

 domain.com/search/?q=something&source=A + cookie1 

而Varnish实际上是从后端(如Apache)请求第一个请求:

 domain.com/search/?q=something 

然后被caching用于后续请求(从而显着提高命中率)。 这被称为“正常化”。

那么静态JavaScript文件当然会通过引用URI查询string来完成它的工作,并根据源查询string做一些DOM操作(Google Analytics的types)。

所以对于客户端,&source = A将被维护,JavaScript可以使用它; 只要JavaScript负责dynamic地更改内容,在Varnish将请求发送到后端之前,您应该没有问题将所有或大部分Cookie或查询string从您的请求中剥离出来。


只要它们是GET请求,您也可以caching您的XML请求。

基本上,Varnish的游戏名称都是关于“规范化”后端请求,以便不影响从服务器返回的URIs / cookies / headers在被发送到后端之前应该被统一处理

重新格式化varnish中的URI: https : //stackoverflow.com/questions/3547384/can-i-reformat-my-url-parameters-with-varnish

如果您需要基于Cookiedynamiccaching内容,可以使用vcl_hash来实现: https ://www.varnish-cache.org/trac/wiki/VCLExampleCacheCookies这当然会降低您的命中率,所以更好将这些function传递给JavaScript来处理并告诉Varnish不要caching特定的端点:例如,

 // don't cache this endpoint, this content changes based on the referrer if (req.url ~ '/ajax/get_referrer/') { return (pass); } 

我不明白你的问题的唯一部分是:

Cookie也被丢弃,所以下一次用户返回页面时会检查cookie是否存在,如果是的话,select在HTML中显示正确的转换代码。

只要后端服务器不需要查看cookie或设置cookie,也就是说,只要JavaScript负责处理DOM工作,就应该清楚了。 请注意,如果每个用户的“源/引用者”不同,则应该告诉Varnish不要caching用于获取所需数据的任何端点。

您还应该注意,您应该只在caching中cachingGET和HEAD请求。 如果您的search或JavaScript使用POST或任何其他请求types,他们不应该被caching。


我绝对build议在开发服务器上做所有事情。 您将需要考虑许多其他因素,例如传送PDF /video/audio(又名pipe道请求),忽略页面以及更多独特的考虑因素。