
我有一個網站(https://mediacru.sh)有幾個版本。有普通的桌面網站、具有深色主題的同一網站和行動網站。它們都共用相同的 URL。使用 cookie 選擇主題,並根據使用者代理顯示行動版本。
我已經設定了緩存,如圖所示在我們的 nginx 設定中。我們每秒鐘可以收到超過 500 個請求,我需要讓大量流量遠離我們的後端,以便一切保持健康。我將其設定為 1 或 30 秒的快取(取決於正在快取網站的哪一部分),但這會帶來不幸的副作用,即快取一個使用者的頁面並向其他人提供錯誤的頁面。
我可以做什麼來調整快取以將這些不同的情況識別為唯一的?我們之前在 nginx 和後端之間設置了 Varnish,但我們沒有對它做任何特別的事情。它也許能夠滿足我們的需求嗎?
答案1
下面是使用 cookie 的範例實作。如果 cookie 值為其中之一dark
,light
或者mobile
我們嘗試提供快取頁面。對於任何其他 cookie 值(包括無值),我們繞過快取並假設上游將設定適當的 cookie,因此下一個請求將使用快取。
我們使用proxy_cache_key
將 cookie 值新增至快取鍵並proxy_cache_bypass
在 cookie 不在預定義值集中時跳過快取。
map $cookie_theme $cache_bypass {
default "1";
"dark" "0";
"light" "0";
"mobile" "0";
}
proxy_cache_path /var/tmp/nginx levels=1 keys_zone=test-cache:10m;
server {
listen 80;
server_name test-cache.localhost;
location / {
proxy_pass http://test-cache;
proxy_cache test-cache;
proxy_cache_valid 1m;
proxy_cache_key "$host$request_uri $cookie_theme";
proxy_cache_bypass $cache_bypass;
}
}
手冊: