Nginx- oder Varnish-Caching mit mehreren Versionen einer Site

Nginx- oder Varnish-Caching mit mehreren Versionen einer Site

Ich habe eine Website (https://mediacru.sh), die in mehreren Versionen verfügbar ist. Es gibt die normale Desktop-Site, dieselbe Site mit dunklem Design und die mobile Site. Sie alle haben dieselben URLs. Das Design wird mit einem Cookie ausgewählt und die mobile Version wird basierend auf dem Benutzeragenten angezeigt.

Ich habe das Caching wie gesehen eingerichtethier in unserer nginx-Konfiguration. Wir können bis zu 500 Anfragen pro Sekunde erhalten und ich muss einen Großteil dieses Datenverkehrs von unserem Backend fernhalten, damit alles in Ordnung bleibt. Ich habe es mit einem 1- oder 30-Sekunden-Cache eingerichtet (je nachdem, welcher Teil der Site zwischengespeichert wird), aber das hat den unglücklichen Nebeneffekt, dass die Seite eines Benutzers zwischengespeichert wird und einem anderen die falsche Seite angezeigt wird.

Was kann ich tun, um das Caching so anzupassen, dass diese unterschiedlichen Situationen als einzigartig erkannt werden? Wir hatten zuvor Varnish zwischen Nginx und dem Backend eingerichtet, aber wir haben nichts Besonderes damit gemacht. Könnte es vielleicht unseren Anforderungen entsprechen?

Antwort1

Hier ist ein Beispiel für die Implementierung mit Cookie. Wenn der Cookie-Wert einer von ist dark, lightversuchen mobilewir, eine zwischengespeicherte Seite bereitzustellen. Bei jedem anderen Cookie-Wert (einschließlich keinem Wert) umgehen wir den Cache und gehen davon aus, dass Upstream das entsprechende Cookie setzt, sodass die nächste Anfrage den Cache verwendet.

Wir verwenden, proxy_cache_keyum dem Cache-Schlüssel einen Cookie-Wert hinzuzufügen und proxy_cache_bypassden Cache zu überspringen, wenn sich das Cookie nicht im Satz vordefinierter Werte befindet.

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;
    }
}

Anleitungen:

verwandte Informationen