如果后端关闭,nginx使用代理缓存


11

如果后端服务器关闭,我需要nginx代理使用缓存:

这是我的配置。但似乎是nginx使用不带检查后端服务器的缓存。

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;
    }
  }
}

问题是,如果后端服务器启动,如何绕过代理缓存?当后端服务器启动时,我的代理服务器根本不使用缓存。


到底是什么问题?
珍妮D

问题是,如果后端服务器启动,如何绕过代理缓存?
sweb

一个开箱即用的解决方案可能是运行2个“服务器”,其中一个具有缓存,一个不带缓存,并使用上游模块 nginx.org/en/docs/http/ngx_http_upstream_module.html?最好的解决方案可能是能够使用proxy_cache_bypass并检查后端是否存在...虽然我不知道如何使该工作正常...有趣的情况。
SvennD

可以在SO
Dayo

Answers:


8

似乎与此重复:

/programming/16756271/how-to-configure-nginx-to-serve-cached-content-only-when-backend-is-down-5xx-re

简而言之,使用proxy_cache_use_stale

作为更新,我对此进行了测试,并且效果很好。我在我所在的工作站中进行了测试(出于完整性考虑):

Fedora 23 Nginx 1.8.1配置为ssl终结器+缓存+反向代理Apache 2.4.18配置为侦听端口80

使用apache作为上游,只提供一个静态文件,我做了这个测试:

  1. Apache向上,nginx向上,将浏览器指向nginx服务的反向代理URL,我看到来自Apache的代理内容。此时,nginx将其保留在缓存中。
  2. 停止阿帕奇
  3. 连接到nginx我看到Apache之前提供的缓存文件。

我使用的Nginx配置是(仅是有趣的部分):

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;
}

根本无法尝试。
sweb

万一您应该向Nginx团队报告错误。顺便说一下,您尝试了什么?万一我会尝试重制它
Fredi

好吧,我做了一个测试,它工作正常。使用测试详细信息更新了我的答案。
弗雷迪

因此,我对sweb原始问题的理解是,在Apache和nginx都处于运行状态下,所有请求都应传递到Apache后端。仅当Apache关闭时,才应从NginX缓存提供请求
abhishekmukherg

@abhishekmukherg,您可以说什么,但是为什么呢?当两者都启动并且文件是静态的时(想像jpg / css / html),当您有实际的前端时,为什么要使用更多的network / cpu / ecc资源转到后端?顺便说一句,这是另一个问题
弗雷迪(Fredi)2016年

0

使用proxy_intercept_errors和proxy 500s到已启用缓存的服务器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.