Forward single request to upstream server via proxy_store !!

Reinis Rozitis r at roze.lv
Thu Sep 25 14:39:12 UTC 2014


> 3 clients requested for test.mp4 (file size is 4mb) --> nginx --> file not 
> existed (proxy_store) --> varnish --> backend (fetch the file from 
> origin).
> When nginx proxied these three requests subsequently towards the varnish,, 
> despite of filling 4mb of tmp dir it was filled with 12MB which means 
> nginx is proxying all three requests towards the varnish server and 
> creating tmp files as long as the file is not downloaded. (The method was 
> failed)

That is expected, this setup only “guards” the content server.



> Now varnish also has a flaw to send subsequent requests for same file 
> towards the nginx i.e

It's not a really flaw but default behaviour (different urls mean different 
content/cachable objects), but of course you can implement your own 
scenario:


By adding:

sub vcl_recv {
    set req.url = regsub(req.url, "\?.*", "");
}

will remove all the the arguments behind ? from the uri when forwarding to 
the content backend.


For static content I usually also add something like:

unset req.http.Cookie;
unset req.http.Accept-Encoding;
unset req.http.Cache-Control;

to normalise the request and so varnish doesnt try to cache different 
versions of the same object.


If you insist on using proxy_store I would probably also add 
proxy_ignore_client_abort on;  ( 
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort 
 ) to the nginx configuration. So the requests don't get repeated if the 
client closes/aborts the request early etc.

rr



More information about the nginx mailing list