익명 사용자를 위해 특정 페이지만 캐시하도록 Varnish 4 VCL 구성(Django 사용)

익명 사용자를 위해 특정 페이지만 캐시하도록 Varnish 4 VCL 구성(Django 사용)

저는 Varnish 4와 함께 Django를 사용하고 있습니다.

나는 그것을 달성하려고 노력하고 있습니다 :

  • 요청이 홈 페이지에 대한 것이 아닌 경우 통과합니다(현재 홈 페이지만 캐시하여 테스트하려고 합니다 등).
  • 쿠키 'sessionid'가 있는 경우 각 세션에 대해 전달하거나 캐시합니다.
  • 그 외 : 합격

하위 vcl_recv의 구성은 다음과 같습니다.

# cache only home page
    if (! req.url == "/") {
            return(pass);
    }

    # not caching if cookie sessionid is present
    if (req.http.Cookie ~ "sessionid") {
            return(pass);
    }

    unset req.http.cookie;

지금까지 Varnish는 홈 페이지를 익명으로 호출할 때 항상 각 페이지에 대해 새 페이지를 생성하는 것으로 보입니다. Varnish 전송 헤더를 사용하여 알 수 있습니다('age'는 항상 0이고 'X-Varnish'는 항상 다른 숫자입니다).

내 구성에 뭔가가 누락되었기 때문인가요, 아니면 Django가 응답으로 'Vary: Cookie'를 보내기 때문인가요? 그렇다면 이 경우 Varnish에서 쿠키를 어떻게 '숨길' 수 있습니까(익명 사용자에게만 해당)?

답변1

'문제'는 Django가 'Vary: Cookie' 헤더를 보냈다는 것입니다.항상. 'auth' 플러그인 때문인 것 같은데, 조사하지는 않았고, 서버에서 응답이 돌아왔을 때 헤더만 삭제했습니다.

Varnish의 문서에서 'vary: cookie'에 대해 설명하는 내용은 다음과 같습니다.

잘못된 사용의 또 다른 예는 응답을 구별하기 위해 Vary: Cookie만 사용하는 경우입니다. 다시 말하지만, 매우 많은 수의 쿠키가 있을 수 있으므로 매우 많은 수의 캐시된 개체가 있을 수 있으며, 이는 원래 요청자에 의해서만 검색될 가능성이 높습니다.

원천:https://www.varnish-software.com/book/4.0/chapters/HTTP.html#vary

내 VCL 구성은 다음과 같습니다(단순히 서버 구성인 상단 부분을 제거했습니다).

sub vcl_recv
{
        # caching only home page
        if (! req.url == "/") {
                return(pass);
        }

        # not caching if cookie sessionid present
        if (req.http.Cookie ~ "sessionid") {
                return(pass);
        }

        unset req.http.cookie;

}

sub vcl_backend_response
{

        if (bereq.url == "/") {
                unset beresp.http.Vary;
                return(deliver);
        }
}

관련 정보