I use nginx as a forward proxy, with content caching.

My app first performs a HEAD request to a Google Cloud Storage object. Then it 
may perform a GET request to the same object.

The HEAD request (which comes first) causes a cache MISS. The content body 
length returned to the client is 0 (which is obviously correct).

However, I think that the actual object is still included in the body from the 
upstream response. The reason I believe why the object gets added to the HEAD 
response from the upstream service (GCS) is for two reasons:

a) When I subsequently do the GET request, I don't get a cache MISS (even 
though this is my first GET request to that object), but a cache REVALIDATED. 
The response from the upstream service is just a 304 with no body saying the 
cached object is still valid ($upstream_header_time and $upstream_response_time 
are identical == 0.421, which would then be correct if the cached object is 
still valid).
So - this seems like the initial HEAD request cached the response also as a GET 
request with the body of the object that seemed to have been in the HEAD request

b) Also, when I do the initial HEAD request, I can see that the 
$upstream_header_time==0.832, and the $upstream_response_time==2.459 ... If 
it's a HEAD request there really shouldn't be a body, so I would expect both 
$upstream_header_time and $upstream_response_time to be identical. However the 
1.5sec time difference shows me that there is something in the body (even 
though when the request returns to the client it all seems correct again in 
terms of that the actual response.body.length is indeed 0.)

So - the way this is working is messing with my app and HTTP analytics. I 
believe this to be behaving incorrectly.


I don't know where the "error" lies. If it is a Google Cloud Storage bug that 
it passes along the object in the body of the HEAD request, or whether the 
issue lies with nginx, or with my configuration, or whether it is with the 
content caching part of nginx?
Or perhaps it is behaving exactly as it should, and there is something about 
the HEAD/GET requests in combination with caching that I am not understanding.

Any help to shed light on this strange behaviour would be greatly appreciated.


My server block config is as follows:

      proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=image_cache:10m 
inactive=60d use_temp_path=off;

      server {
         listen 3128;

         location / {
            proxy_cache image_cache;

            proxy_cache_revalidate on;

            proxy_cache_lock on;
            proxy_cache_lock_timeout 5s;

            proxy_ignore_headers Cache-Control;
            proxy_cache_valid 200 60d;

            add_header X-Cache-Status $upstream_cache_status;

            resolver 8.8.8.8 ipv6=off;
            proxy_pass http://$http_host$uri$is_args$args;
         }
      }

_______________________________________________
nginx mailing list
nginx@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx

Reply via email to