Configuring Varnish for Caching based on Cookies
Pinakee BIswas
pinakee at waltzz.com
Tue May 24 10:46:18 CEST 2016
Hi Per Buer,
Just figured out that the backend wasn't sending Content-Length and
Varnish seemed to use it. I have updated the backend to send
Content-Length and now the pages are getting rendered.
Will post to the community mailing list if I further stumble upon any
query or roadblock.
Thanks,
Pinakee
On 24/05/16 11:48 am, Pinakee BIswas wrote:
>
> Hi Per Buer,
>
> Thanks for your response and for the tips. Would go through them and
> try to implement.
>
> Regarding the blank pages, I have sent a separate mail.
>
> I have installed Varnish from source. Since this is the first time
> with Varnish, we plan to start with simple scenarios for caching and
> then move on to more sophisticated ones for logged in users etc (also,
> as we scale up further).
>
> Would really appreciate if you could help me resolving the issue so
> that I could move ahead with configuring and deploying Varnish.
> Following is the content of the mail with the issue:
>
> Hi,
>
> I am trying to set Varnish to cache content when login cookie is not
> present. Hence, I have modified the following subroutines:
>
> * vcl_recv: If the login cookie is not present, return hash.
> * vcl_back_response: If the login cookie is not present, cache the
> content (beresp.uncacheable set to false
>
> Whenever the vcl_recv is returning hash, varnish is generating blank
> page with content-length set 0. If vcl_recv returns pass, the page is
> served fine.
>
> Following is the VCL:
>
> sub vcl_recv {
> # Happens before we check if we have this in cache already.
> #
> # Typically you clean up the request here, removing cookies you
> don't need,
> # rewriting the request, etc.
> set req.backend_hint = uwsgi;
>
> if (req.http.Cookie !~ "jivaana_user=") {
> return(hash);
> }
> }
>
> sub vcl_backend_response {
> # Happens after we have read the response headers from the backend.
> #
> # Here you clean the response headers, removing silly Set-Cookie
> headers
> # and other mistakes your backend does.
> if (beresp.http.Set-Cookie !~ "jivaana_user=") {
> if (beresp.ttl <= 0s) {
> set beresp.ttl = 120s;
> }
> set beresp.uncacheable = false;
> return (deliver);
> }
>
> Varnish log:
>
>
> * << BeReq >> 3
> - Begin bereq 2 fetch
> - Timestamp Start: 1463994442.986360 0.000000 0.000000
> - BereqMethod GET
> - BereqURL /catalogue/
> - BereqProtocol HTTP/1.0
> - BereqHeader Host: django_test
> - BereqHeader Accept:
> text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
> - BereqHeader Upgrade-Insecure-Requests: 1
> - BereqHeader User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X
> 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102
> Safari/537.36
> - BereqHeader Accept-Language: en-US,en;q=0.8
> - BereqHeader X-Forwarded-For: 127.0.0.1
> - BereqHeader Accept-Encoding: gzip
> - BereqProtocol HTTP/1.1
> - BereqHeader X-Varnish: 3
> - VCL_call BACKEND_FETCH
> - VCL_return fetch
> - BackendOpen 21 boot.uwsgi 127.0.0.1 9001 127.0.0.1 38213
> - Timestamp Bereq: 1463994442.986883 0.000524 0.000524
> - Timestamp Beresp: 1463994443.734972 0.748612 0.748088
> - BerespProtocol HTTP/1.1
> - BerespStatus 200
> - BerespReason OK
> - BerespHeader Expires: Mon, 23 May 2016 09:07:23 GMT
> - BerespHeader Vary: Cookie
> - BerespHeader Last-Modified: Mon, 23 May 2016 09:07:23 GMT
> - BerespHeader Cache-Control: max-age=0
> - BerespHeader X-Frame-Options: SAMEORIGIN
> - BerespHeader Content-Type: text/html; charset=utf-8
> - BerespHeader Set-Cookie:
> csrftoken=5BUZRL4gdO7uTDtWXnbqQko3CelDmOAg; expires=Mon, 22-May-2017
> 09:07:23 GMT; Max-Age=31449600; Path=/
> - BerespHeader Date: Mon, 23 May 2016 09:07:23 GMT
> - TTL RFC 0 10 -1 1463994444 1463994444 1463994443
> 1463994443 0
> - VCL_call BACKEND_RESPONSE
> - TTL VCL 120 10 0 1463994444
> - VCL_return deliver
> - Storage file s0
> - ObjProtocol HTTP/1.1
> - ObjStatus 200
> - ObjReason OK
> - ObjHeader Expires: Mon, 23 May 2016 09:07:23 GMT
> - ObjHeader Vary: Cookie
> - ObjHeader Last-Modified: Mon, 23 May 2016 09:07:23 GMT
> - ObjHeader Cache-Control: max-age=0
> - ObjHeader X-Frame-Options: SAMEORIGIN
> - ObjHeader Content-Type: text/html; charset=utf-8
> - ObjHeader Set-Cookie:
> csrftoken=5BUZRL4gdO7uTDtWXnbqQko3CelDmOAg; expires=Mon, 22-May-2017
> 09:07:23 GMT; Max-Age=31449600; Path=/
> - ObjHeader Date: Mon, 23 May 2016 09:07:23 GMT
> - Fetch_Body 0 none -
> - BackendReuse 21 boot.uwsgi
> - Timestamp BerespBody: 1463994443.735229 0.748869 0.000257
> - Length 0
> - BereqAcct 393 0 393 336 0 336
> - End
>
> * << Request >> 2
> - Begin req 1 rxreq
> - Timestamp Start: 1463994442.986091 0.000000 0.000000
> - Timestamp Req: 1463994442.986091 0.000000 0.000000
> - ReqStart 127.0.0.1 56147
> - ReqMethod GET
> - ReqURL /catalogue/
> - ReqProtocol HTTP/1.0
> - ReqHeader Host: django_test
> - ReqHeader Connection: close
> - ReqHeader Cache-Control: max-age=0
> - ReqHeader Accept:
> text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
> - ReqHeader Upgrade-Insecure-Requests: 1
> - ReqHeader User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X
> 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102
> Safari/537.36
> - ReqHeader Accept-Encoding: gzip, deflate, sdch
> - ReqHeader Accept-Language: en-US,en;q=0.8
> - ReqHeader Cookie: pagemap=0,0,0,0,0,1,0';
> pagemap=0,0,0,0,0,0,0; jivaana_country=IN; mp_mixpanel__c=1;
> mp_mixpanel__c3=2; mp_mixpanel__c4=2; mp_mixpanel__c5=0;
> _ga=GA1.1.1762020660.1447765749;
> mp_774636c1ed2371eaf99455f71871069c_mixpanel=%7B%22distinct_id%22%3A%20
> - ReqHeader If-Modified-Since: Mon, 23 May 2016 09:03:11 GMT
> - ReqHeader X-Forwarded-For: 127.0.0.1
> - VCL_call RECV
> - ReqUnset Cookie: pagemap=0,0,0,0,0,1,0';
> pagemap=0,0,0,0,0,0,0; jivaana_country=IN; mp_mixpanel__c=1;
> mp_mixpanel__c3=2; mp_mixpanel__c4=2; mp_mixpanel__c5=0;
> _ga=GA1.1.1762020660.1447765749;
> mp_774636c1ed2371eaf99455f71871069c_mixpanel=%7B%22distinct_id%22%3A%20
> - VCL_return hash
> - ReqUnset Accept-Encoding: gzip, deflate, sdch
> - ReqHeader Accept-Encoding: gzip
> - VCL_call HASH
> - VCL_return lookup
> - VCL_call MISS
> - VCL_return fetch
> - Link bereq 3 fetch
> - Timestamp Fetch: 1463994443.735287 0.749196 0.749196
> - RespProtocol HTTP/1.1
> - RespStatus 200
> - RespReason OK
> - RespHeader Expires: Mon, 23 May 2016 09:07:23 GMT
> - RespHeader Vary: Cookie
> - RespHeader Last-Modified: Mon, 23 May 2016 09:07:23 GMT
> - RespHeader Cache-Control: max-age=0
> - RespHeader X-Frame-Options: SAMEORIGIN
> - RespHeader Content-Type: text/html; charset=utf-8
> - RespHeader Set-Cookie:
> csrftoken=5BUZRL4gdO7uTDtWXnbqQko3CelDmOAg; expires=Mon, 22-May-2017
> 09:07:23 GMT; Max-Age=31449600; Path=/
> - RespHeader Date: Mon, 23 May 2016 09:07:23 GMT
> - RespHeader X-Varnish: 2
> - RespHeader Age: 0
> - RespHeader Via: 1.1 varnish-v4
> - VCL_call DELIVER
> - VCL_return deliver
> - Timestamp Process: 1463994443.735341 0.749249 0.000054
> - RespHeader Accept-Ranges: bytes
> - RespHeader Content-Length: 0
> - Debug "RES_MODE 2"
> - RespHeader Connection: close
> - Timestamp Resp: 1463994443.735410 0.749319 0.000070
> - ReqAcct 929 0 929 476 0 476
> - End
>
> * << Session >> 1
> - Begin sess 0 HTTP/1
> - SessOpen 127.0.0.1 56147 0.0.0.0:9003 127.0.0.1 9003
> 1463994442.985890 18
> - Link req 2 rxreq
> - SessClose RESP_CLOSE 0.750
> - End
>
> Thanks,
> Pinakee
> On 23/05/16 11:21 pm, Per Buer wrote:
>>
>>
>> On Fri, May 20, 2016 at 4:38 PM, Pinakee BIswas <pinakee at waltzz.com>
>> wrote:
>>
>> Hi,
>>
>> I am a beginner with Varnish and planning to deploy it for our
>> ecommerce live platform. I am trying to learn Varnish and VCL and
>> having trouble for our specific scenario:
>>
>> I would like to cache pages when a user is not logged in - and
>> this is determined by a cookie (which is standard). The ecommerce
>> platform is based on python Django - and there are bunch of other
>> cookies which are not relevant for caching but they can't be
>> unset/removed as they are needed by the origin/backend server.
>>
>> Hence, the solution would be to check if the login cookie is
>> present or not. If login cookie not present, cache the page and
>> fetch from cache else pass it to the backend.
>>
>>
>> Two tips. One is the cookie VMOD, which helps when dealing with
>> cookies. If you don't wanna use it you can also look at the example
>> here:
>> https://www.varnish-cache.org/docs/4.1/users-guide/increasing-your-hitrate.html#cookies
>> - it will at least point you in the right direction.
>>
>> I tried implementing the above logic in vcl_recv and
>> vcl_backend_response with my limited knowledge, but varnish
>> started serving blank pages.
>>
>>
>> That sounds like a backend bug.
>>
>> --
>> *Per Buer*
>> CTO | Varnish Software AS
>> Cell: +47 95839117
>> We Make Websites Fly!
>> www.varnish-software.com <https://www.varnish-software.com/>
>>
>>
>> <http://info.varnish-software.com/signature>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.varnish-cache.org/lists/pipermail/varnish-misc/attachments/20160524/5e87c0bf/attachment.html>
More information about the varnish-misc
mailing list