
Es gibt einen Fall bei der Verwendung des Reverse-Proxy-Cache von Nginx, wenn:
proxy_cache_background_update on;
proxy_cache_use_stale updating;
Wenn für dieselbe URL eine einzige Antwort vom Upstream mit maximalem Alter eingeht und alle anderen Antworten keinen Cache aufweisen, kann sich Nginx nie aus dieser Situation erholen.
Stellen Sie sich folgendes Szenario vor:
- Client -> Nginx (MISS) -> Upstream200(Cache-Steuerung: kein Cache)
- Client -> Nginx (MISS) -> Upstream200(Cache-Steuerung: kein Cache)
- Client -> Nginx (MISS) -> Upstream200(Cache-Steuerung: kein Cache)
- Client -> Nginx (MISS) -> Upstream503(Cache-Steuerung: max-age=10)
- Client -> Nginx (HIT,503, Alter: 3)
- Client -> Nginx (HIT,503, Alter: 8)
- Client -> Nginx (STALE,503, Alter: 13) ->BGStromaufwärts200 (Cache-Steuerung: kein Cache)
- Client -> Nginx (STALE,503, Alter: 18) ->BGStromaufwärts200 (Cache-Steuerung: kein Cache)
- Client -> Nginx (STALE,503, Alter: 23) ->BGStromaufwärts200 (Cache-Steuerung: kein Cache)
- ... Der Kunde sieht503für die Ewigkeit
Im obigen Szenario ist einmal ein Fehler im Upstream aufgetreten und hat ein max-age zurückgegeben (dieses Verhalten kann leider nicht beeinflusst werden). Da die echte 200-Antwort kein Cache ist, ist sie nie in der Lage,überschreibenSTALE 503 und gibt den Fehler dauerhaft aus, bis er manuell gelöscht wird.
Ich konnte im Internet nichts zu diesem Szenario finden, also frage ich hier. Wie gehe ich damit um? Ich verwendeOpenRestyDaher bin ich auf beide Open-Source-Module von Nginx und Lua zugreifen.
Mögliche Lösungen und meine Recherche:
stale-if-error
undstale-while-revalidate
Erweiterungen des Cache-Control-Headers scheinen dieses Problem zu lösen. Leider können Upstream-Header nicht geändert werden (und es gibt keine Möglichkeit, diese hackend einzufügen, bevor Nginx die Header verarbeitet, wie erwartet).Verwenden eines Lua-Skripts, um manuell ein Timeout für veraltete Caches festzulegen und diese zu löschen, wenn es überschritten wird. Ich verwende aber viel lieber eine Lösung, wenn Standard/Nginx eine solche bereitstellt.
Fügen Sie standardmäßig einen zweiten Reverse-Proxy hinzu, um Header hinzuzufügen
stale-if-error
(stale-while-revalidate
ich würde das Problem lieber bestehen lassen, als dies zu tun).Verwenden Sie Lua, um das Cache-Alter zu verfolgen, setzen Sie dann eine Variable auf „true“, wenn es überschritten wird, und verwenden Sie sie dann in
proxy_cache_bypass
Nginx. (Eine kleine Grauzone, die Ausführungsreihenfolge wäre bei Anweisungen für die Inhaltsphase wichtig)