nginx use proxy cache if backend is down
6,437
Seems a duplicate of this:
In short, use proxy_cache_use_stale
As an update, i tested this and it works fine. I did the test in my workstation where i have (for completeness):
Fedora 23 nginx 1.8.1 configured as ssl terminator + cache + reverse proxy Apache 2.4.18 configured to listen at port 80
With apache acting as upstream, serving just a static file i did this test:
- Apache up, nginx up, pointing the browser to the reverse proxied URL served by nginx i see the proxied content from Apache. At this point nginx keeps this on cache.
- Stopped apache
- connecting to nginx i see the cached file as served before by Apache.
The nginx config i used is (only the interesting parts):
nginx.conf :
http {
[...]
location
proxy_cache_path /var/lib/nginx/tmp/proxy/ levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
include /etc/nginx/conf.d/*.conf;
}
/etc/nginx/conf.d/local.conf :
upstream localhost {
server 127.0.0.1:80;
[...]
}
server {
listen 127.0.0.1:443 ssl;
[...]
location /be/ {
proxy_pass http://localhost;
proxy_cache STATIC;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error;
}
Related videos on Youtube
Author by
sweb
Updated on September 18, 2022Comments
-
sweb over 1 year
I need to nginx proxy use cache if backend server down:
this is my configuration. but seems be nginx use cache without check backend server.
http { # ... proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache_path /tmp/nginx levels=1:2 keys_zone=tmpzone:10m inactive=60m; proxy_cache_key "$scheme$request_method$host$request_uri"; server { server_name _; location / { proxy_connect_timeout 5s; proxy_read_timeout 5s; proxy_cache tmpzone; proxy_cache_valid 200 304 1d; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host 'www.example.com'; proxy_pass http://www.example.com; } } }
Question is how can i bypass the proxy cache if backend server is up ? And when backend server is up my proxy server dont use cache at all.
-
Jenny D over 8 yearsWhat exactly is the question?
-
sweb over 8 yearsQuestion is how can i bypass the proxy cache if backend server is up ?
-
SvennD over 8 yearsOne out of the box solution might be to have 2 "servers" running, one with cache, one w/o cache, and use upstream module nginx.org/en/docs/http/ngx_http_upstream_module.html ? The best solution would probably to be able to use proxy_cache_bypass with a check if the backend is there or not... though I have no idea how to get that working ... interesting case.
-
Dayo over 5 yearsSolutions to this instance of an XY Problem can be found over on SO
-
-
sweb over 8 yearsNot work at all try it.
-
Fredi over 8 yearsIn case you should report a bug to the nginx team. What did you tried btw? In case i'll try to reproduce it
-
Fredi over 8 yearsOk, i did a test and it worked fine. Updated my answer with the test details.
-
abhishekmukherg over 7 yearsSo my reading of sweb's original question was that, in the state of both Apache and nginx up, all requests should go through to the Apache backend. Requests should only be served from NginX cache iff Apache is down
-
Fredi over 7 years@abhishekmukherg, you can do what you say, but why? When both are up and the files are static (think jpg / css / html ) why going to the backend using more network / cpu / ecc resources when you have an actual frontend? BTW this is a matter for another question though
-
Toby over 7 years@Fredi Well the original question does say "How can I bypass the proxy cache if backend server is up?" which is what abhishekmukherg is asking. The case I came here looking to solve is an API response that we would like to be fresh whenever possible, but if there is some upstream outage stale data will do.
-
abhishekmukherg over 7 years@Fredi You're totally right, I got this question messed up in my head with the one you linked and ended up commenting on the wrong one XD
-
abhishekmukherg over 7 yearsI do think the title of this question doesn't actually match the description in the question, though. It seems the title should be: nginx use proxy cache only if [the] backend is down