Problem with proxy cache misses

Hello! I’m testing out a new configuration and there are two issues with
the proxy cacheing feature I’m getting stuck on.

  1. Everything is a cache miss, and I’m not sure why:

My cache config (anonymized):

proxy_cache_path /var/www/test_cache levels=2:2 keys_zone=TEST:32m
inactive=365d max_size=16g loader_files=256;

upstream haproxy {
keepalive 256;

location ~ “^/[W][A-Za-z0-9_-]{7,13}$” {
limit_except GET {
deny all;
proxy_http_version 1.1;
proxy_set_header Connection “Close”; # Disable Keepalives
proxy_set_header Host “”; # Upstream requires this
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_cache TEST;
proxy_cache_key $uri;
proxy_cache_valid 301 365d;
proxy_cache_valid 302 1d;
proxy_cache_lock on;
proxy_buffering off;
proxy_pass http://haproxy;

A sample response coming back from the upstream (captured with

HTTP/1.1 301 Moved Permanently
Date: Mon, 29 Feb 2016 18:16:02 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
P3P: CP=“some text”
X-Frame-Options: deny
Location: http://some.test.url/


The cache directory is owned by the nginx user, perms 0700.

I’m expecting the 301 in the example above to be cached for a year, but
nothing is created under /var/www/test_cache, and subsequent requests
the same resources are also cache misses.

  1. For each URL which doesn’t match any of the location blocks, I am
    an error in the log file:

2016/02/29 13:55:20 [error] 19524#0: *1509121054 open()
“/var/www/html/W4ud7y1k4jjbj” failed (2: No such file or directory),
client: a.b.c.d,, request: “HEAD /W4ud7y1k4jjbj
host: “

There is a “root /var/www/html” defined in the http block, although
is only one specific location which uses it:

location = /apple-app-site-association {
  default_type application/pkcs7-mime;

And the final location block in my server config is:

location = / {
  rewrite ^ permanent;

So my expectation is that since the request matches none of the location
blocks, nginx will just issue a 404 response. However from the error
it looks like it is trying the root directory first before issuing the
Is there some way to prevent that?

Look at your proxy cache path… (proxy_cache_path
/var/www/test_cache)Are you sure the path exists and had proper


Yes, it does exist:

stat /var/www/test_cache

File: `/var/www/test_cache’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 802h/2050d Inode: 22195081 Links: 2
Access: (0700/drwx------) Uid: ( 497/ nginx) Gid: ( 0/ root)
Access: 2016-02-29 15:14:19.271701729 -0500
Modify: 2016-02-29 15:14:15.894687178 -0500
Change: 2016-02-29 15:14:15.894687178 -0500

I did an su to nginx and touched a file in the directory and removed it
without issue. I did an nginx reload and I didn’t see any warnings or
errors regarding permissions in the error log.

The location = / is a exactly match.
To execute a “catch all” returning a 404 you can do a

location / {
return 404;

The catch-all entry works and don’t conflict with the = /. That solves
second problem, thank you!

On Mon, Feb 29, 2016 at 3:32 PM, Wandenberg P.
[email protected]