Re: [squid-users] How to make squid ignore max-age?

From: Yang Zhang <yanghatespam_at_gmail.com>
Date: Fri, 22 Apr 2011 15:27:13 -0700

On Tue, Apr 19, 2011 at 8:03 PM, Yang Zhang <yanghatespam_at_gmail.com> wrote:
> On Mon, Apr 18, 2011 at 9:18 PM, Yang Zhang <yanghatespam_at_gmail.com> wrote:
>> On Mon, Apr 18, 2011 at 9:08 PM, Amos Jeffries <squid3_at_treenet.co.nz> wrote:
>>> On Mon, 18 Apr 2011 20:07:33 -0700, Yang Zhang wrote:
>>>>
>>>> We're using squid (3.0.STABLE19-1ubuntu0.1) as an application cache
>>>> and we're trying to cache everything, for a long time, but max-age=0
>>>> is throwing off squid.
>>>
>>> max-age=0 is called "reload" in HTTP terminology.
>>>
>>>>
>>>> I have this refresh_pattern in squid.conf:
>>>>
>>>> $ grep ^refresh_pattern /etc/squid3/squid.conf
>>>> refresh_pattern ^ftp:           1440    20%     10080
>>>> refresh_pattern ^gopher:        1440    0%      1440
>>>> refresh_pattern . 525600 100% 525600 override-expire ignore-private
>>>> ignore-no-cache ignore-no-store
>>>>
>>>
>>> To quote Frankenstein
>>>  "Why? whyyyy?"
>>>
>>>
>>>> I have the following response prepared to be sent from a dummy web server:
>>>>
>>>> $ cat response
>>>> HTTP/1.1 200 OK
>>>> Server: Apache-Coyote/1.1
>>>> Expires: 0
>>>> Pragma: no-cache
>>>> Cache-Control: no-cache, must-revalidate, max-age=0
>>>> Content-Type: text/html;charset=UTF-8
>>>> Date: Mon, 18 Apr 2011 10:06:26 GMT
>>>> Connection: close
>>>
>>> Those headers say two things:
>>>  * that cached content MUST NOT be supplied to the client. EVER.
>>>  * that any existing cached content also MUST be checked for updates on the
>>> next request.
>>>
>>> Ignoring this requirement *from the server*. Again... why?
>>>
>>>
>>> I can only imagine that you have fallen for the myth that "application
>>> caches" must always provide HITs. This is false and following it will break
>>> things for you in potentially nasty ways.
>>>
>>> A cachable application will not send max-age=0 or "Expires: 0", both of
>>> which mean the object was obsolete the second it was produced.
>>>
>>> Squid operating as a reverse-proxy will cache the replies and keep updating
>>> fresh copies as long as the server is available to present new ones. If the
>>> server dies an 5xx start coming back, the stale versions will start to be
>>> used. How long for and whether "must-revalidate" produces 4xx/5xx to the
>>> client depends on particular squid versions.
>>>  I recommend you grab the newest release you can for the best HTTP/1.1
>>> caching behaviour. there are still things we are fixing but work is ongoing
>>> so the newer the release the better things work. I maintain a PPA for Ubuntu
>>> (https://launchpad.net/~yadi/+archive/ppa) with newer versions.
>>>
>>> <snip>
>>>>
>>>> This response prevents anything from being cached; all requests for
>>>> http://localhost:8765 result in TCP_MISS.  I believe it's because of
>>>> the max-age=0 - once I remove that, this request is cached fine.  Yet
>>>> I had set override-expire in the refresh_pattern.
>>>> (Note that I don't think it's a must-revalidate/ignore-revalidate (new
>>>> in v3.1) problem - I can leave that in fine.)
>>>
>>> However "We're using squid (3.0.STABLE19-1ubuntu0.1)" ... not a v3.1
>>> release.
>>>
>>> "ignore-revalidate" blocks the *client* from requesting a revalidation
>>> (max-age=0). But still obeys the server controls.
>>>
>>>>
>>>> Any hints on how to make squid ignore the max-age=0?  I've pored over
>>>> the refresh_pattern documentation a bunch of times but still can't see
>>>> what's wrong.  Thanks in advance for any help.
>>>
>>> If you must;
>>>  * "ignore-reload" to ignore the max-age=0 from either client or server
>>> IIRC.
>>
>> Just tried this out - it doesn't work.  The comments in the squid.conf
>> also say that it's for max-age=0 from the client (no mention of
>> server).
>>
>>>  * "reload-into-ims" to convert a client max-age=0 ("force a new copy or
>>> die") into a soft IMS request ("new content or cached copy").
>>
>> The client is not issuing any max-age=0.  Tried adding this in anyway
>> - didn't work.
>>
>>>
>>> 'must-revalidate' will still have affect until you are using a 3.1 release
>>> with the "ignore-must-revalidate". The result of revalidate should only be
>>> 304 (TCP_IMS_*) or 200 (TCP_REFRESH_UPDATE), not a "TCP_MISS" since the
>>> content being validated *is* in the cache.
>>
>> My point earlier is that the must-revalidate from the server doesn't
>> seem be what's preventing the response from getting cached....
>
> Also, FWIW, these -max-age=0 responses are making it *into* the cache
> (verified by grepping /var/spool/squid3), for whatever reason (not
> sure why Squid is deciding to keep them if only to later not use
> them).
>
> --
> Yang Zhang
> http://yz.mit.edu/
>

Update: using Squid 3.1.12.1 and ignore-must-revalidate fixed this.
Weird since the original problem only arose from the presence of
max-age=0; the revalidate itself wasn't preventing caching.

-- 
Yang Zhang
http://yz.mit.edu/
Received on Fri Apr 22 2011 - 22:27:41 MDT

This archive was generated by hypermail 2.2.0 : Sat Apr 23 2011 - 12:00:04 MDT