gpt4 book ai didi

caching - 使用 Nginx 和 Etags 对动态内容进行服务器端缓存

转载 作者:行者123 更新时间:2023-12-04 18:05:42 25 4
gpt4 key购买 nike

我有一个 CouchDB 数据库,前面有一个 Nginx 反向代理。来自 CouchDB 的一些响应需要很长时间才能生成(是的,这是一个糟糕的选择,但现在需要坚持下去),我想用 Nginx 缓存它们。 (目前 Nginx 只做 SSL。)

CouchDB 支持 Etags,所以理想情况下,我希望 Nginx 也为愚蠢的客户端缓存 Etags。客户端不使用 Etag,他们只会查询 Nginx,Nginx 会使用其缓存的 Etag 进入 CouchDB,然后将缓存的响应或新的响应发送回客户端。

我基于文档的理解是 Nginx 目前无法做到这一点。我错过了什么吗?是否有支持此设置的替代方案?或者唯一的解决方案是手动使 Nginx 缓存失效?

最佳答案

我假设你已经看过 varnish并没有发现它适合您的情况。有两种方法可以实现你想要的。
用 nginx
Nginx 有一个默认的 caching mechanism你可以configure供您使用。
如果这没有帮助,你应该给 Nginx 用第 3 方编译 Ngx_Lua module试一试。这也与其他有用的模块和所需的 Lua 环境一起方便地打包为 Openresty .
使用 Ngx_Lua,您可以使用 shared dictionary缓存你的 couchdb 响应。顾名思义,共享字典在 Ngx_Lua 的执行环境中使用共享内存区域。这类似于 proxy_cache 在 Nginx 中的工作方式(它还在 Nginx 的执行环境中定义了一个共享内存区域),但具有额外的优势,您可以对其进行编程。
构建 couchdb 缓存所需的步骤非常简单(使用这种方法,您不需要将 etag 发送到客户端)

  • 您向 couchdb
  • 发出请求
  • 您保存 {Url-Etag:response}
  • 下次请求到达使用 HEAD 请求的 etags 的相同 url 查询。
  • 如果响应 etag 匹配 {Url-Etag:response}然后发送缓存的响应,否则使用 (get/post) 方法再次查询 couchdb 并更新 {Url-Etag:response}在向客户端发送响应之前配对。

  • 当然,如果您手动编写缓存,则必须定义最大缓存大小和从缓存中删除旧项目的机制。 lua_shared_dict指令可以帮助您定义将缓存响应的内存大小。将值保存在共享字典中时,您可以指定该值将保留在内存区域中的时间,之后它将自动过期。结合共享字典的最大缓存大小参数和缓存时间参数,您应该能够为您的用户编写相当复杂的缓存机制。
    带二郎
    由于 couchdb 是用 erlang 编写的,因此您的机器上已经有了一个 erlang env。因此,如果您可以在其中编程,您可以使用 mnesia 创建一个非常健壮的分布式缓存。步骤是一样的。 Erlang 计时器可以与 gen_* 结合使用为您提供项目自动到期的行为,并且 mnesia 具有监视其内存使用情况并通知您的功能。这两种方法几乎是等价的,唯一的区别是可以分发 mnesia。
    更新
    正如@abyz 建议的 redis在缓存方面也是不错的选择。

    关于caching - 使用 Nginx 和 Etags 对动态内容进行服务器端缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28724753/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com