程式如何控制NGINX不要cache

NGINX有提供以下專用的header,讓後端的程式可以藉由這些HTTP header和NGINX溝通。這些HTTP header都不會傳送到client端。
  1. X-Accel-Expires: set the parameters of response caching;
  2. X-Accel-Redirect: performs an internal redirect to the specified URI;
  3. X-Accel-Limit-Rate: sets the rate limit for transmission of a response to a client;
  4. X-Accel-Buffering: enables or disables buffering of a response;
  5. X-Accel-Charset: sets the desired charset of a response.
導入NGINX後都沒什麼情境去使用這些專用header。最近發現到有個情境可使用到X-Accel-Expires。簡單說明如下…

某網頁的內容會被NGINX所cache。但是該網頁其會呈現A、B兩種內容。B內容是異常資訊、很極端的狀況才會出現。但當B內容一出現,依舊會被NGINX所cache,直到expire。

B內容出現時不要讓NGINX存入cache,該如何處理?其實就是使用 X-Accel-Expires。當程式發現異常時,丟出以下HTTP header即可
X-Accel-Expires: 0

當NGINX收到上述HTTP header,因為cache時間為0就不會將B內容放入cache。官方文件的說法為The zero value disables caching for a response.

但是,如果在短暫時間內該網頁仍然呈現B內容時,而該網頁正常的A內容又曾經被NGINX所cache過、且已經超過所設定的cache時間。此時NGINX回應的狀態為 X-Cache-Status: EXPIRED(我原本誤以為此時是MISS)。直到A內容再度出現被NGINX cache後,回應狀態才會改為 X-Cache-Status: HIT

X-Accel-Expires有其他設定方式,可參考官方文件-Module ngx_http_proxy_module內的說明。

如果覺得使用X-Accel-Expires沒效果時,建議可檢查proxy_ignore_headers這個設定。


參考資料

留言