{{tag>nginx webserver cache}}
====== Nginx caching ======
Example configuration of caching.
Below should be in http context somewhere
proxy_cache_path /var/cache/nginx/mycache
levels=1:2 keys_zone=de:100M max_size=1G;
Below is valid in http, server, location contexts.
You might want to add ''$http_user_agent'' to cache key below to avoid a situation where for example, a mobile site will be served to desktop users if that site has been cached first.
# caching doesn't work without proxy buffering
proxy_buffering on;
proxy_cache mycache;
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
# caches for responses with status code 200, 301, and 302
proxy_cache_valid 1d;
# cache for any other including errors
proxy_cache_valid any 1m;
proxy_cache_min_uses 2;
# bypass cache by providing query arg nocache=1
proxy_cache_bypass $arg_nocache;
proxy_cache_lock on;
proxy_cache_background_update on;
proxy_cache_use_stale error timeout updating
http_500 http_502 http_503 http_504;
add_header x-nginx-cache-status $upstream_cache_status;
proxy_ignore_headers Cache-Control;
The proxied backend might send some ''cache-control'' headers on its own like with values like ''private, no-cache, no-store, max-age=0, must-revalidate''.
We need to discard this. You might also need to ignore headers like ''Expires'' and ''X-Accel-Expires''.
The response header ''x-nginx-cache-status'' should say "HIT" if the configuration is correct.
====== Tested on ======
* nginx/1.26.0
====== See also ======
====== References ======
* http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_bypass
* https://stackoverflow.com/questions/9230812/nginx-as-cache-proxy-not-caching-anything
* https://dzx.fr/blog/how-to-configure-reverse-proxy-caching-with-nginx/
* https://www.mnot.net/cache_docs/
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control