Nginx ignores proxy_no_cache

Maxim Dounin mdounin at mdounin.ru
Sun Apr 7 13:56:20 UTC 2024


Hello!

On Sun, Apr 07, 2024 at 01:36:21PM +0200, Kirill A. Korinsky wrote:

> Greetings,
> 
> Let assume that I would like behavior on LB from the backend and force it to
> cache only resposnes that have a X-No-Cache header with value NO.
> 
> Nginx should cache a response with any code, if it has such headers.
> 
> This works well until the backend is unavailable and nginx returns a
> hardcoded 502 that doesn't have a control header, but such a response is
> cached anyway.
> 
> Here is the config that allows to reproduce the issue:
> 
>   http {
>       default_type  application/octet-stream;
> 
>       proxy_cache_path        /tmp/nginx_cache keys_zone=the_zone:1m;
>       proxy_cache             the_zone;
>       proxy_cache_valid       any 15m;
>       proxy_cache_methods     GET HEAD POST;
> 
>       add_header              X-Cache-Status $upstream_cache_status always;
> 
>       map $upstream_http_x_no_cache $no_cache {
>           default             1;
>           "NO"                0;
>       }
> 
>       proxy_no_cache          $no_cache;
> 
>       upstream echo {
>           server 127.127.127.127:80;
>       }
> 
>       server {
>           listen       1234;
>           server_name  localhost;
> 
>           location / {
>               proxy_pass http://echo;
>           }
>       }
>   }
> 
> when I run:
> 
>   curl -D - http://127.0.0.1:1234/
> 
> it returns MISS on the first request, and HIT on the second one.
> 
> Here I expect both requests to return MISS.

Thanks for the report.

Indeed, proxy_no_cache is only checked for proper upstream 
responses, but not when caching errors, including internally 
generated 502/504 in ngx_http_upstream_finalize_request(), and 
intercepted errors in ngx_http_upstream_intercept_errors().

Quick look suggests there will be also issues with caching errors 
after proxy_cache_bypass (errors won't be cached even if they 
should), as well as issues with proxy_cache_max_range_offset after 
proxy_cache_bypass (it will be ignored).

This needs cleanup / fixes, added to my TODO list.

-- 
Maxim Dounin
http://mdounin.ru/



More information about the nginx mailing list