使用Nginx和Etags进行服务器端dynamic内容caching

我有一个CouchDB数据库,在它前面有一个Nginx反向代理。 CouchDB的一些响应需要很长时间才能生成(是的,这是一个不好的select,但是现在需要坚持下去),我想用Nginxcaching它们。 (目前Nginx只能使用SSL。)

CouchDB支持Etags,所以理想情况下,我希望NginxcachingEtags以及哑客户端。 客户端不使用Etags,他们只是查询Nginx,Nginx使用caching的Etag进入CouchDB,然后将caching的响应或新的响应发送回客户端。

基于文档的理解是,Nginx目前无法做到这一点。 我错过了什么吗? 有没有支持这种设置的替代scheme? 或者唯一的解决办法是手动使Nginxcaching无效?

我假设你已经看清漆 ,并没有发现它适合你的情况。 有两种方法可以实现你想要的。

用nginx

Nginx有一个默认的缓存机制 ,你可以配置使用。

如果这没有帮助,你应该尝试Nginx编译与第三方Ngx_Lua模块 。 这也可以方便地与其他有用的模块和Openresty所需的Lua环境一起打包 。

使用Ngx_Lua,您可以使用共享字典来缓存您的couchdb响应。 顾名思义,共享字典在Ngx_Lua的执行环境中使用共享内存区域。 这与proxy_cache在Nginx中的工作方式类似(它也在Nginx的执行环境中定义了一个共享内存区域),但是还有一个额外的好处,就是你可以对它进行编程。

构建couchdb缓存所需的步骤非常简单(使用这种方法,您不需要将etags发送到客户端)

  1. 你向couchdb发出一个请求
  2. 您保存{Url-Etag:response}
  3. 下次请求使用HEAD请求对etags进行相同的url查询。
  4. 如果响应etag与{Url-Etag:response}对匹配,则发送缓存响应,否则使用(get / post)方法再次查询couchdb,并在将响应发送给客户端之前更新{Url-Etag:response}对。

当然,如果你手工编写一个缓存,你将不得不定义最大缓存大小和一个从缓存中删除旧项的机制。 lua_shared_dict指令可以帮助您定义缓存响应的内存大小。 当将值保存在共享字典中时,您可以指定该值将保留在内存区域的时间,在此之后将自动过期。 结合共享字典的最大高速缓存大小参数和高速缓存时间参数,您应该能够为您的用户编写相当复杂的高速缓存机制。

用erlang

由于couchdb是用erlang编写的,你的机器上已经有了一个erlang env。 所以如果你可以编程,你可以用mnesia创建一个非常健壮的分布式缓存。 步骤是一样的。 Erlang的定时器可以和gen_*行为结合起来,让你的项目自动到期,mnesia有监视内存使用情况的功能,并通知你。 两种方法几乎相同,唯一的区别是mnesia可以分发。

更新

由于@abyz建议redis在缓存方面也是不错的选择。