我网站的几乎每个页面都是动态生成的。但是,它们不会经常更改(有点类似于论坛页面)。所以我想使用缓存反向代理来缓存它们,例如 Squid、varnish 或 Nginx。
问题是,对于我的登录用户,他们每个人都会在页面的右上角看到一个个性化的标题,上面写着“欢迎 John Doe。注销”(就像 serverfault 一样)。而未登录的用户将看到一个标有“登录”的标题。
所以基本上即使每个用户都会看到相同的页面,但由于个性化的标题,他们都会略有不同的版本。
有什么方法可以让我缓存页面的“主要”部分并从缓存中提供它,同时为每个用户动态生成个性化标题?
这一定是一个非常普遍的问题。一般是怎么解决的?
您可以做的一件事(除了 ESI,它不能解决带宽问题或减少您必须服务的请求数量)实际上是将页面分成多个实体。例如,所有公共内容都在一个可缓存的页面上,然后通过 AJAX/iFrame 拉入个性化项目。这有点像 iGoogle 的工作方式,除了相反...在 iGoogle 的情况下,基本页面是自定义的,但您选择的 RSS 提要组件是公开的、可缓存的,并通过 AJAX 进入主页。
使用 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。
或者,您可以在应用程序端进行自己的片段缓存。
是的,缓存主页,但是各个组件通过 AJAX 调用进入,您需要将管道放入 vcl_recv 以获取这些 url。
if (req.url ~ "/some-ajax-call") { return(pipe); }