
Hay un caso en el uso de caché de proxy inverso de Nginx, cuando;
proxy_cache_background_update on;
proxy_cache_use_stale updating;
Para la misma URL, si una única respuesta proviene del flujo ascendente con edad máxima, cuando todas las demás respuestas no tienen caché, Nginx nunca podrá recuperarse de esta situación.
Imagina el escenario:
- Cliente -> Nginx (MISS) -> Upstream200(Control de caché: sin caché)
- Cliente -> Nginx (MISS) -> Upstream200(Control de caché: sin caché)
- Cliente -> Nginx (MISS) -> Upstream200(Control de caché: sin caché)
- Cliente -> Nginx (MISS) -> Upstream503(Control de caché: edad máxima = 10)
- Cliente -> Nginx (HIT,503, Edad: 3)
- Cliente -> Nginx (HIT,503, Edad: 8)
- Cliente -> Nginx (ESTADO,503, Edad: 13) ->bgRío arriba200 (Control de caché: sin caché)
- Cliente -> Nginx (ESTADO,503, Edad: 18) ->bgRío arriba200 (Control de caché: sin caché)
- Cliente -> Nginx (ESTADO,503, Edad: 23) ->bgRío arriba200 (Control de caché: sin caché)
- ... El cliente ve503para la eternidad
En el escenario anterior, se produjo un error en el flujo ascendente una vez y se devolvió una edad máxima (desafortunadamente, este comportamiento no se puede intervenir). Debido a que la respuesta 200 real no tiene caché, nunca podráSobrescribirel STALE 503 y siempre dará el error hasta que se purgue manualmente.
No pude encontrar nada en la web sobre este escenario, así que aquí estoy preguntando. Como lidiar con esto. estoy usandoAbiertoRestypor lo que puedo acceder a los módulos Nginx Open Source y Lua.
Posibles soluciones y mi investigación:
stale-if-error
ystale-while-revalidate
las extensiones del encabezado Cache-Control parecen resolver este problema. Desafortunadamente, los encabezados ascendentes no están abiertos a modificación (y no hay forma de insertarlos de forma pirateada antes de que Nginx procese los encabezados, como se esperaba).Usar un script Lua para establecer manualmente un tiempo de espera para cachés STALE y purgarlo cuando se excede. Pero prefiero usar una solución si estándar/Nginx la proporciona.
Agregue un segundo proxy inverso para agregar encabezados
stale-if-error
ystale-while-revalidate
de forma predeterminada (prefiero dejar que el problema exista, en lugar de hacer esto).Use Lua para realizar un seguimiento de la antigüedad del caché, luego establezca una variable verdadera si se excede y luego úsela
proxy_cache_bypass
desde Nginx. (Un área un poco gris, el orden de ejecución sería importante con las directivas de la fase de contenido)