Nginx

如何避免在 NGINX 中使用“Vary: Cookie”標頭進行瘋狂記憶體

  • July 6, 2021

我知道Vary: Cookie不太受歡迎,因為它會導致記憶體使用者可能報告的每個 cookie 變體。另一方面,如果沒有它,我不得不Cache-Control: no-cache告訴我的 NGINX 記憶體伺服器完全跳過可能有使用者登錄的記憶體內容(順便說一下,我網站的每個頁面,因為頂部有一個帳戶框這頁紙)。

我只在使用者登錄時發送 cookie,因此大多數頁面視圖都會從記憶體中受益。我想縮小範圍,以便只有兩種變體:“差異”是沒有cookie 的使用者的記憶體版本和有 cookie 的使用者的非記憶體版本(例如,使用者已登錄並擁有身份驗證 cookie)。

如果我在我的 Perl 程序中添加“Vary: Cookie”,有沒有辦法告訴 NGINX 在這種情況下它應該只關注sessionIdcookie 是否存在?類似於 - 製作偽標題 - 的東西Vary: Cookie('sessionId')?如果有一種方法可以在 NGINX 會尊重的腳本生成的標頭中實現這一點,我想我更喜歡將它放在 NGINX 配置中,但任何解決方案都會受到讚賞。

我不完全確定如何測試我是否會導致 NGINX 因記憶體而發瘋,但我想知道這些方面是否可行:在未登錄的查看器上,腳本發送Vary: Cookie,但在查看器上登錄後,會發送該標頭和Cache-Control: no-cache. NGINX 會理解這是告訴它記憶體第一個響應而不是變體嗎?或者我會以我現在沒有抓住的方式搞砸一些事情嗎?

*更新:*這是我的一個伺服器塊的範例:

server {
   server_name myservername.tld
   listen 80;

   location / {
       proxy_cache $PROXY_CACHE;

       proxy_cache_valid 200 302 60m;
       proxy_cache_valid 404 1m;
       proxy_cache_use_stale error timeout http_429 http_500 http_502 http_503 http_504;
       proxy_cache_background_update on;
       proxy_cache_revalidate on;
       proxy_cache_min_uses 1;
       proxy_cache_lock on;

       proxy_pass $scheme://$APACHE_PROXY_REQ_IP:$APACHE_PROXY_REQ_PORT;
   }

}

您應該查看指令proxy_no_cacheproxy_cache_bypass.

proxy_no_cache告訴 nginx 在什麼條件下它不應該記憶體來自您的應用程序的響應。您可以將其定義為您想要的任何內容,例如:

proxy_no_cache $cookie_sessionid;

proxy_cache_bypass在另一個方向上執行:它告訴 nginx 何時不應從記憶體中提供請求,而是將其傳遞給您的應用程序,即使存在記憶體條目也是如此。

引用自:https://serverfault.com/questions/1068809