백엔드가 다운 된 경우 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;
    }
  }
}

백엔드 서버가 작동하는 경우 어떻게 프록시 캐시를 우회 할 수 있습니까? 백엔드 서버가 작동하면 프록시 서버가 캐시를 전혀 사용하지 않습니다.


질문은 정확히 무엇입니까?
Jenny D

백엔드 서버가 작동하는 경우 어떻게 프록시 캐시를 우회 할 수 있습니까?
sweb

기본 솔루션 중 하나는 2 개의 "서버"(캐시 포함, 하나는 캐시 없음)를 실행하고 업스트림 모듈 nginx.org/en/docs/http/ngx_http_upstream_module.html을 사용하는 것입니다 . 백엔드가 있는지 여부와 상관없이 가장 좋은 솔루션은 proxy_cache_bypass를 검사와 함께 사용할 수있을 것입니다 ...
SvennD

XY 문제의이 사례에 대한 해결책 은 SO
Dayo

답변:


8

이것의 사본 인 것 같습니다 :

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

요컨대, proxy_cache_use_stale을 사용 하십시오

업데이트로 이것을 테스트했으며 정상적으로 작동합니다. 나는 (완전성을 위해) 가지고있는 내 워크 스테이션에서 테스트를 수행했습니다.

SSL 터미네이터로 구성된 Fedora 23 nginx 1.8.1 + 캐시 + 리버스 프록시 포트 80에서 수신하도록 구성된 Apache 2.4.18

아파치가 업스트림으로 작동하면서 정적 파일 만 제공하면이 테스트를 수행했습니다.

  1. Apache up, nginx up, 브라우저가 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 팀에 버그를보고해야합니다. btw 무엇을 시도 했습니까? 내가 그것을 재현하려고 할 경우
Fredi

좋아, 나는 시험을했고 잘 작동했다. 테스트 세부 정보로 답변을 업데이트했습니다.
Fredi

sweb의 원래 질문에 대한 나의 독서는 Apache와 nginx 상태에서 모든 요청이 Apache 백엔드로 전달되어야한다는 것입니다. 요청 만 아파치 IFF의 nginx 캐시에서 제공해야한다가 다운
abhishekmukherg

@abhishekmukherg, 당신은 당신이 무슨 말을 할 수 있지만 왜? 둘 다 작동하고 파일이 정적 일 때 (jpg / css / html 생각) 실제 프런트 엔드가있을 때 더 많은 네트워크 / cpu / ecc 리소스를 사용하여 백엔드로가는 이유는 무엇입니까? BTW 이것은 또 다른 질문의 문제입니다
Fredi

0

캐싱이 활성화 된 서버에는 proxy_intercept_errors 및 proxy 500을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.