如何使用缓存反向代理(如 Squid、Varnish 或 Nginx)缓存具有个性化标头的网页

如何使用缓存反向代理(如 Squid、Varnish 或 Nginx)缓存具有个性化标头的网页

我网站上的几乎每个页面都是动态生成的。但是它们不会经常更改(有点类似于论坛页面)。因此,我想使用缓存反向代理(例如 Squid、varnish 或 Nginx)来缓存它们。

问题是,对于我的已登录用户,他们每个人都会在页面右上角看到一个个性化标题,上面写着“欢迎 John Doe。注销”(就像 serverfault 一样)。而未登录的用户将看到一个标题,上面写着“登录”。

因此基本上,尽管每个用户总体上都会看到相同的页面,但由于个性化的标题,他们看到的版本都略有不同。

有什么方法可以让我缓存页面的“主要”部分并从缓存中提供它,同时为每个单独的用户动态生成个性化标题?

这肯定是一个很常见的问题。一般是怎么解决的?

答案1

使用 Varnish,您可以使用 ESI,但是,如果不增加一些复杂性,则无法压缩 ESI 处理的页面。 http://varnish-cache.org/wiki/ESIfeatures

我还没有在生产中使用过这个功能,但是 Nginx 也通过插件提供了 ESI 功能,http://wiki.github.com/taf2/nginx-esi/

Nginx 确实通过以下方式提供缓存http://wiki.nginx.org/NginxHttpProxyModule#proxy_cache并与另一个插件一起处理片段组装和缓存。

http://www.trygve-lie.com/blog/entry/esi_explained_simple解释 ESI。

或者,您可以在应用程序端执行自己的片段缓存。

答案2

您可以做的一件事(除了 ESI,它不会解决带宽问题或减少您必须处理的请求数量)实际上是将页面拆分成多个实体。例如,所有公共内容都放在一个可缓存的页面上,然后通过 AJAX/iFrame 提取个性化项目。这有点像 iGoogle 的工作方式,只是反过来……在 iGoogle 的情况下,基本页面是自定义的,但您选择的 RSS 提要组件是公共的、可缓存的,并通过 AJAX 带入主页。

答案3

是的,缓存主页,但各个组件通过 AJAX 调用进入,并且您需要将管道放入这些 url 的 vcl_recv 中。

如果(req.url ~ “/some-ajax-call”){返回(管道);}

相关内容