Nginx 或 Varnish 快取網站的多個版本

Nginx 或 Varnish 快取網站的多個版本

我有一個網站(https://mediacru.sh)有幾個版本。有普通的桌面網站、具有深色主題的同一網站和行動網站。它們都共用相同的 URL。使用 cookie 選擇主題,並根據使用者代理顯示行動版本。

我已經設定了緩存,如圖所示在我們的 nginx 設定中。我們每秒鐘可以收到超過 500 個請求,我需要讓大量流量遠離我們的後端,以便一切保持健康。我將其設定為 1 或 30 秒的快取(取決於正在快取網站的哪一部分),但這會帶來不幸的副作用,即快取一個使用者的頁面並向其他人提供錯誤的頁面。

我可以做什麼來調整快取以將這些不同的情況識別為唯一的?我們之前在 nginx 和後端之間設置了 Varnish,但我們沒有對它做任何特別的事情。它也許能夠滿足我們的需求嗎?

答案1

下面是使用 cookie 的範例實作。如果 cookie 值為其中之一darklight或者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;
    }
}

手冊:

相關內容