
Nginx 역방향 프록시 캐시 사용에는 다음과 같은 경우가 있습니다.
proxy_cache_background_update on;
proxy_cache_use_stale updating;
동일한 URL에 대해 단일 응답이 max-age를 사용하여 업스트림에서 나오는 경우 다른 모든 응답이 캐시되지 않으면 Nginx는 이 상황에서 결코 복구할 수 없습니다.
시나리오를 상상해 보세요.
- 클라이언트 -> Nginx(MISS) -> 업스트림200(캐시 제어: 캐시 없음)
- 클라이언트 -> Nginx(MISS) -> 업스트림200(캐시 제어: 캐시 없음)
- 클라이언트 -> Nginx(MISS) -> 업스트림200(캐시 제어: 캐시 없음)
- 클라이언트 -> Nginx(MISS) -> 업스트림503(캐시 제어: max-age=10)
- 클라이언트 -> Nginx(HIT,503, 연령: 3)
- 클라이언트 -> Nginx(HIT,503, 연령: 8)
- 클라이언트 -> Nginx(STALE,503, 나이: 13) ->BG업스트림200 (캐시 제어: 캐시 없음)
- 클라이언트 -> Nginx(STALE,503, 나이: 18) ->BG업스트림200 (캐시 제어: 캐시 없음)
- 클라이언트 -> Nginx(STALE,503, 나이: 23) ->BG업스트림200 (캐시 제어: 캐시 없음)
- ... 클라이언트가 본다503영원히
위 시나리오에서는 업스트림에서 한 번 오류가 발생하여 max-age를 반환했습니다(이 동작은 안타깝게도 개입할 수 없습니다). 실제 200 응답은 캐시가 없기 때문에 결코 캐시할 수 없습니다.덮어쓰기STALE 503이며 수동으로 제거할 때까지 영원히 오류가 발생합니다.
이 시나리오에 대해 웹에서 아무것도 찾을 수 없어서 여기에 질문합니다. 이것을 처리하는 방법. 나는 사용하고있다오픈레스티따라서 Nginx 오픈 소스 모듈과 Lua 모두에 액세스할 수 있습니다.
가능한 해결책과 내 연구:
stale-if-error
stale-while-revalidate
Cache-Control 헤더의 확장을 사용하면 이 문제가 해결되는 것 같습니다 . 불행하게도 업스트림 헤더는 수정이 불가능합니다(그리고 예상대로 Nginx가 헤더를 처리하기 전에 해킹해서 삽입할 수 있는 방법이 없습니다).Lua 스크립트를 사용하여 STALE 캐시에 대한 시간 초과를 수동으로 설정하고 초과된 경우 제거합니다. 그러나 표준/Nginx가 솔루션을 제공한다면 차라리 솔루션을 사용하는 편이 낫습니다.
헤더를 추가하기 위해 두 번째 역방향 프록시를 추가하고
stale-if-error
기본적stale-while-revalidate
으로(이 작업을 수행하는 것보다 문제가 존재하도록 놔두는 것이 좋습니다).Lua를 사용하여 캐시 수명을 추적하고, 초과된 경우 변수를 true로 설정하고
proxy_cache_bypass
Nginx에서 사용하세요. (약간 회색 영역, 실행 순서는 콘텐츠 단계 지시문에 중요함)