11

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.

4
  • What exactly is the question?
    – Jenny D
    Jan 30, 2016 at 12:44
  • Question is how can i bypass the proxy cache if backend server is up ? Jan 30, 2016 at 14:55
  • One 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.
    – SvennD
    Feb 3, 2016 at 13:56
  • Solutions to this instance of an XY Problem can be found over on SO
    – Dayo
    Sep 8, 2018 at 7:15

2 Answers 2

8
+50

Seems a duplicate of this:

https://stackoverflow.com/questions/16756271/how-to-configure-nginx-to-serve-cached-content-only-when-backend-is-down-5xx-re

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:

  1. 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.
  2. Stopped apache
  3. 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;
}
9
  • Not work at all try it. Feb 9, 2016 at 6:29
  • In case you should report a bug to the nginx team. What did you tried btw? In case i'll try to reproduce it
    – Fredi
    Feb 9, 2016 at 13:10
  • Ok, i did a test and it worked fine. Updated my answer with the test details.
    – Fredi
    Feb 9, 2016 at 15:10
  • So 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 Nov 30, 2016 at 17:27
  • @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
    – Fredi
    Dec 1, 2016 at 10:43
0

Use proxy_intercept_errors and proxy 500s to a server that has caching enabled.

0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .