簡體   English   中英

使用Nginx和Etags對動態內容進行服務器端緩存

[英]Server side caching of dynamic content with Nginx and Etags

我有一個CouchDB DB,前面有一個Nginx反向代理。 CouchDB的一些響應需要很長時間才能生成(是的,這是一個糟糕的選擇,但現在需要堅持使用它),我想用Nginx緩存它們。 (目前Nginx只執行SSL。)

CouchDB支持Etags,理想情況下我想要的是Nginx緩存Etags以及啞客戶端。 客戶端不使用Etags,他們只會查詢Nginx,后者使用緩存的Etag訪問CouchDB,然后將緩存的響應或新的響應發送回客戶端。

我基於文檔的理解是Nginx目前無法做到這一點。 我錯過了什么嗎? 是否有支持此設置的替代方案? 或者唯一的解決方案是手動使Nginx緩存無效?

我假設你已經看過清漆並且沒有找到適合你的情況。 有兩種方法可以達到你想要的效果。

有了nginx

Nginx有一個默認的緩存機制 ,您可以配置供您使用。

如果這沒有幫助,你應該嘗試使用第三方Ngx_Lua模塊編譯Nginx。 這也可以方便地與其他有用的模塊和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指令可以幫助您定義將為其緩存響應的內存大小。 在共享字典中保存值時,您可以指定值將保留在內存區域的時間,之后它將自動過期。 結合共享字典的max cache size參數和cache time參數,您應該能夠為用戶編寫相當復雜的緩存機制。

隨着erlang

由於couchdb是用erlang編寫的,因此你的機器上已經有了erlang env。 因此,如果您可以在其中進行編程,則可以使用mnesia創建非常強大的分布式緩存。 步驟是一樣的。 Erlang定時器可以與gen_*行為結合使用,以便您自動使用項目到期,而mnesia具有監視其內存使用情況的功能並通知您。 這兩種方法幾乎相同,唯一的區別是可以分配mnesia。

更新

正如@abyz建議redis在緩存方面也是不錯的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM