이 바니시 코드 블록은 무엇을 합니까?

이 바니시 코드 블록은 무엇을 합니까?

광택 구성에 이 코드가 있는데 그 기능이 무엇인지 잘 모르겠습니다! 이 구성은 내 클라이언트 요청을 캐시할지 여부를 결정합니다. 뭐가 문제야?

sub vcl_backend_response {
    if (beresp.status != 200) {
        return (pass);
    }
    set beresp.http.X-Backend = beresp.backend.name;


    unset beresp.http.cookie;
    unset beresp.http.Set-Cookie;

    if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
        set beresp.http.Cache-Control = "no-store";
    }

    set beresp.http.Cache-Control = "no-store";
    if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
        return (pass);
    }

    return (deliver);
}

답변1

이 VCL 코드 블록은 캐시를 우회할 시기에 대한 몇 가지 규칙을 지정하는 것으로 보입니다. 그러나 작성 방식은 별로 의미가 없습니다.

캐시 우회

return(pass)컨텍스트에서 캐싱을 우회하는 적절한 방법이 아닙니다 vcl_backend_response. 들어오는 요청이 캐시를 우회할 때 return(pass)사용됩니다 .vcl_recv

캐시를 우회한다는 것은 vcl_backend_response들어오는 개체를 캐시에 저장하지 못하게 한다는 의미입니다. 모범 사례에 따르면 set beresp.uncacheable = trueTTL을 할당한 다음 return(deliver). 이렇게 하면 다음 백엔드 응답이 필수 기준을 충족할 때까지 이 객체가 특정 시간 동안 캐시를 우회합니다.

내 활성화를 통해 beresp.uncacheable개체가 대기 목록에 올라가고 요청 통합의 후보가 되도록 보장합니다.

쿠키 제거

적중률을 높이려면 쿠키를 제거하는 것이 좋습니다. 백엔드 컨텍스트에서 헤더를 제거합니다 Set-Cookie. 이는 vcl_backend_responsethrough 에서 올바르게 수행되지만 unset beresp.http.Set-Cookie이는 무조건 수행됩니다.

이는 어떤 Set-Cookie작업도 수행되지 않아 일관되지 않은 동작이 발생할 수 있음을 의미합니다. 이러한 쿠키를 제거하기 위해 사전 조건이 필요한지 확실하지 않습니다.

을 통해 들어오는 쿠키를 제거할 수도 있습니다 unset req.http.Cookie. 하지만 vcl_backend_response그 실행 에도 비슷한 호출이 있는 것 같습니다 unset beresp.http.Cookie.

이는 Cookie응답 헤더가 수신될 것임을 나타냅니다. 그럴 것 같지 않습니다.

VCL 다시 작성

다음은 다른 컨텍스트 없이 이 VCL 코드를 다시 작성하는 방법입니다.

vcl 4.1;

backend default {
    .host = "127.0.0.1";
    .port = "80";
}

sub vcl_recv {
    unset req.http.Cookie;
}

sub vcl_backend_response {
    if(beresp.status != 200) {
        set beresp.ttl = 120s;
        set beresp.uncacheable = true;
        return(deliver);
    }

    set beresp.http.X-Backend = beresp.backend.name;
    unset beresp.http.Set-Cookie;
    set beresp.http.Cache-Control = "no-store";

    if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
        set beresp.ttl = 120s;
        set beresp.uncacheable = true;
        return(deliver);
    }

    return (deliver);
}

경고: 이 내용을 프로덕션 환경에 복사하여 붙여넣는 것은 권장하지 않습니다. 이 VCL을 작성할 때 일부 모서리가 잘린 느낌이 듭니다. 추가 컨텍스트가 없으므로 이 방법을 사용하는 것을 권장하고 싶지 않습니다.

관련 정보