On 30/03/2012 12:47 p.m., Daniele Segato wrote:
Hi,
This is what I want to obtain:
Environment:
* everything on the same machine (Debian GNU\Linux)
* server running on tomcat, port 8080
* squid running on port 280
* client can be anywhere, but for now it's on the localhost machine too
I want to set up an http cache to my tomcat server to reduce the load
on it.
And I expect to obtain a result like this:
First request
1. 9:00 AM (today) client request GET to http://localhost:280/myservice
2. squid receive the request, nothing in cache, contact my server
3. tomcat reply with a 200, the body and some header:
Cache-Control: public, max-age=3600
Last-Modified: //8:00 AM//
4. squid store in cache that result that should be valid until 10:00
AM (today) = 9:00 AM (time of the request) + 3600 seconds (max-age)
5. client receive the response
Second request:
1. 9:05 AM (today) client request GET to
http://localhost:280/myservice with header
If-Modified-Since: //8:00 AM//
2. squid receive the request, see 9:05 AM < 10:00 AM --> cache hit 304
3. client receive the response 304
Third request (after 10:00 AM)
1. 10:05 AM (today) client request GET to
http://localhost:280/myservicewith header
If-Modified-Since: //8:00 AM//
2. squid receive the request, see 10:05 AM > 10:00 AM --> time to see
if the server has a new version, forward the if-modified-since request
to the server
3. suppose the resource is not changed: tomcat reply with a 304 Not
Modified, again with headers:
Cache-Control: public, max-age=3600
Last-Modified: //8:00 AM//
4. squid store update the cache value to be valid until 11:05 AM
(today) = 10:05 AM (time of the request) + 3600 seconds (max-age)
5. client receive the response: 304 Not Modified
Instead squid is ALWAYS requiring the resource to the server:
$ curl -v -H 'If-Modified-Since: Thu, 29 Mar 2012 22:14:20 GMT'
'http://localhost:280/alfresco/service/catalog/products'
* About to connect() to localhost port 280 (#0)
* Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 280 (#0)
GET /alfresco/service/catalog/products HTTP/1.1
User-Agent: curl/7.24.0 (x86_64-pc-linux-gnu) libcurl/7.24.0
OpenSSL/1.0.0h zlib/1.2.6 libidn/1.24 libssh2/1.2.8 librtmp/2.3
Host: localhost:280
Accept: */*
If-Modified-Since: Thu, 29 Mar 2012 22:14:20 GMT
* additional stuff not fine transfer.c:1037: 0 0
* HTTP 1.0, assume close after body
< HTTP/1.0 304 Not Modified
< Date: Thu, 29 Mar 2012 23:27:57 GMT
< Cache-Control: public, max-age=3600
< Last-Modified: Thu, 29 Mar 2012 22:14:20 GMT
"
max-age
The max-age response directive indicates that the response is to
be considered stale after its age is greater than the specified
number of seconds.
"
The logic goes like this:
Object modified ... 22:14:20
Valid +3600
==> fresh until 23:14:50
Current time: 23:27:57
23:14:50 < 23:27:15 ==> currently stale. must revalidate.
Expires header can be used to set an absolute time for invaldation.
max-age is relative to age.
Amos