Nginx 或 Varnish 缓存多个版本的网站

Nginx 或 Varnish 缓存多个版本的网站

我有一个网站(https://mediacru.sh) 有几个版本。有普通桌面网站、带有深色主题的相同网站和移动网站。它们都共享相同的 URL。主题是通过 cookie 选择的,移动版本是根据用户代理显示的。

我已经设置了缓存,如下所示在我们的 nginx 配置中。我们每秒可以收到 500 个以上的请求,我需要将大量流量从后端移开,以便一切保持正常。我已将其设置为 1 秒或 30 秒的缓存(取决于要缓存网站的哪个部分),但这会带来不良的副作用,即缓存一个用户的页面,并将错误的页面提供给其他人。

我该如何调整缓存以识别这些不同的情况?我们之前在 nginx 和后端之间设置了 Varnish,但我们没有对它做任何特殊处理。它能满足我们的需求吗?

答案1

以下是使用 cookie 的示例实现。如果 cookie 值为 之一darklightmobile我们尝试提供缓存页面。对于任何其他 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;
    }
}

手册:

相关内容