摘要:所以總體上該響應會被緩存兩小時。其次,這個算是一般的多層緩存固有的弊端緩存數據的最大過期時間,取決于各級緩存的總和。這種情況下,緩存只是作為一個臨時救急的方案使用,我們并不希望多緩存更多的時間。
當 Nginx 使用 proxy cache 的文件作為響應時,它會更新其中的一些內容,比如 Date 響應頭;但大部分響應頭都不會得到更新,比如 Expires 和 Cache-Control。眾所周知,Cache-Control 可以通過 max-age=xxx 或者 s-maxage=xxx 指令設置緩存的有效時間。跟 Expires 響應頭不同,這一時間是相對的。假設上游服務器返回 Cache-Control: public; max-age=3600,那么 Nginx 會緩存該響應一小時。如果在這一小時到期之前,Client 訪問了 Nginx,它會獲取到同樣的 Cache-Control 響應頭,因此會再緩存多一小時。所以總體上該響應會被緩存兩小時。
這聽起來很讓人驚訝。但仔細想想,其實也不算什么嚴重的問題。首先,當我們設置 max-age=3600 時,大多數情況下并不要求其嚴格地在一小時后過期。其次,這個算是一般的多層緩存固有的弊端:緩存數據的最大過期時間,取決于各級緩存 TTL 的總和。如果想要避免,你可以選擇根據外層數據剩下的 TTL 設置當前 TTL;或者提供主動 purge 的操作,從最內層開始逐層清理數據。
當然,某些時候下,這一行為會帶來一些問題。舉個例子,假設我們開啟了 proxy_cache_use_stale,在上游服務器出問題時使用過期的內容代替正常的響應。這種情況下,緩存只是作為一個臨時救急的方案使用,我們并不希望 Client 多緩存更多的時間。否則會有上游應用的開發者抱怨,為何上游服務器已經正常了,用戶刷新頁面看到的還是舊數據。作為解決辦法,我們可以在 Nginx 的 header filter 階段,通過 Lua 代碼或者 Nginx C module,把 Cache-Control: max-age=... 修改成 Cache-Control: no-cache。這么一來,Client 會在使用緩存之前先驗證下,如果 Nginx 返回 304 狀態碼,那么該緩存會被繼續使用;如果上游已經 OK 了且更新了響應,那么 Client 就會重新請求,避免使用過期的內容。
這里需要強調下,no-cache 并非如字面上的意義表示不緩存,而是要求 Client 在使用該緩存之前,需要先驗證下被緩存的內容是否還是最新的。MDN 的說法是:
Forces caches to submit the request to the origin server for validation before releasing a cached copy.
對應的,RFC 7234 的說法:
The "no-cache" request directive indicates that a cache MUST NOT use
a stored response to satisfy the request without successful
validation on the origin server.
如果要想讓 Client 不緩存響應的內容,按 MDN 上的說法,需要用 Cache-Control: no-cache, no-store, must-revalidate(https://developer.mozilla.org...)。
仔細看了下 no-cache / no-store / must-revalidate 這三項指令的介紹,似乎 no-store 就能讓 Client 不用這個緩存,因為 no-store 要求:
The cache should not store anything about the client request or server response.
另外 must-revalidate 要求在使用過期緩存前驗證下該內容是否是最新的,而 no-cache 也是要求重新驗證的,那為什么需要兩個都一起用呢?
Google 搜索把我帶到了這個 SO 問答:https://stackoverflow.com/que...。這個回答里面解釋了為何不單單用 no-store:因為臭名昭著的 IE6 瀏覽器在處理 no-store 時有 bug。但可惜的是,這個回答沒有給出這一論斷的證據,比如 IE 的 bug report 之類。MDN 在給出 Cache-Control: no-cache, no-store, must-revalidate 這個例子的時候,也沒有提及更多的上下文。這很像沒有任何注釋的老代碼:我們不知道當初為何這么寫,而把它刪掉似乎不會帶來什么問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40259.html
摘要:入職半年之后,老板給他簽期權合同,簽完后,老板說股份需要董事會簽字,先把合同收回去。且因為長年加班,得了一身病。多次實驗之后,實驗者把狗籠打開,這時候蜂音器響了,狗狗不但不逃,反而倒地呻吟和顫抖,等待電擊的到來。 ...
摘要:不久前,在團隊內部和大家做了一次分享,內容就是這次要講的用認知和人性來提升自己的技術水平,大家反響不錯,所以這次整理一下也分享給大家。 不久前,在團隊內部和大家做了一次分享,內容就是這次要講的用認知和人性來提升自己的技術水平,大家反響不錯,所以這次整理一下也分享給大家。最初我是想用借優秀的產品經理思維來做最棒程序員的這個標題,但想想還是要有同理心,技術同學平時和產品同學已經是相愛相殺了...
摘要:不久前,在團隊內部和大家做了一次分享,內容就是這次要講的用認知和人性來提升自己的技術水平,大家反響不錯,所以這次整理一下也分享給大家。 不久前,在團隊內部和大家做了一次分享,內容就是這次要講的用認知和人性來提升自己的技術水平,大家反響不錯,所以這次整理一下也分享給大家。最初我是想用借優秀的產品經理思維來做最棒程序員的這個標題,但想想還是要有同理心,技術同學平時和產品同學已經是相愛相殺了...
摘要:現有的服務器和應用程序服務器相結合并在一個冒泡中運行,無法直接接觸網絡流量,由反向代理服務器提出填鴨式請求。賦予高可用性讓你的反向代理服務器鏡像到在線備份,同時擁有備用的應用程序服務器,讓你的站點高度可用。 【編者按】本文主要介紹 NGINX 的主要功能以及如何通過 Nginx 優化 Python 應用性能。本文系國內 ITOM 管理平臺 OneAPM 編譯呈現。 本文上一篇系: 利用...
摘要:現有的服務器和應用程序服務器相結合并在一個冒泡中運行,無法直接接觸網絡流量,由反向代理服務器提出填鴨式請求。賦予高可用性讓你的反向代理服務器鏡像到在線備份,同時擁有備用的應用程序服務器,讓你的站點高度可用。 【編者按】本文主要介紹 NGINX 的主要功能以及如何通過 Nginx 優化 Python 應用性能。本文系國內 ITOM 管理平臺 OneAPM 編譯呈現。 本文上一篇系: 利用...
閱讀 3729·2021-09-22 15:49
閱讀 3300·2021-09-08 09:35
閱讀 1422·2019-08-30 15:55
閱讀 2321·2019-08-30 15:44
閱讀 714·2019-08-29 16:59
閱讀 1597·2019-08-29 16:16
閱讀 479·2019-08-28 18:06
閱讀 890·2019-08-27 10:55