캐싱 리버스 프록시로 Nginx를 설정하는 방법은 무엇입니까?


143

최근 Nginx가 리버스 프록시 기능에 캐싱을 추가했다고 들었습니다. 나는 둘러 보았지만 그것에 관한 많은 정보를 찾을 수 없었습니다.

Nginx를 Apache / Django 앞에서 캐싱 리버스 프록시로 설정하고 싶습니다. 일부 (전부는 아님) 동적 페이지에 대한 Nginx 프록시 요청을 Apache에 요청한 다음 생성 된 페이지를 캐시하고 캐시에서 해당 페이지에 대한 후속 요청을 제공합니다.

이상적으로는 두 가지 방법으로 캐시를 무효화하고 싶습니다.

  1. 캐시 된 항목에 만료 날짜 설정
  2. 캐시 된 항목을 명시 적으로 무효화합니다. 예를 들어 Django 백엔드가 특정 데이터를 업데이트 한 경우 Nginx에 영향을받는 페이지의 캐시를 무효화하도록 지시하고 싶습니다

Nginx를 설정하는 것이 가능합니까? 어떻게?


테스트되지 않았지만 gumroad.com/l/ngx_purge에서 : "ngx_purge는 Nginx 용 순수 Lua 모듈로, 사용자는 nginx 캐시에서 객체를 제거 할 수 있습니다."
Jaime Hablutzel

답변:


97

캐시 된 항목을 명시 적으로 무효화하는 방법은 없다고 생각하지만 나머지는 수행하는 방법의 예입니다. 업데이트 : 다른 답변에서 Piotr이 언급했듯이 사용할 수 있는 캐시 제거 모듈 이 있습니다. nginx의 proxy_cache_bypass를 사용하여 캐시 된 항목을 강제로 새로 고칠 수도 있습니다 . 자세한 내용 은 Cherian의 답변 을 참조하십시오.

이 구성에서 캐시되지 않은 항목은 example.net에서 검색되어 저장됩니다. 캐시 된 버전은 더 이상 유효하지 않을 때까지 (60 분) 향후 클라이언트에 제공됩니다.

Cache-Control 및 Expires HTTP 헤더가 적용되므로 만료 날짜를 명시 적으로 설정하려는 경우 프록시하려는 대상에 올바른 헤더를 설정하여이를 수행 할 수 있습니다.

조정할 수있는 많은 매개 변수가 있습니다. 다른 설정 / 매개 변수의 의미에 대한 세부 사항을 포함하여이 모든 것에 대한 자세한 정보는 nginx 프록시 모듈 문서를 참조하십시오. http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}

7
이는 20k / req / s가없는 새로운 앱의 경우 합리적인 첫 단계입니다.

5
@ 배리 두 번째 단계는 무엇입니까?
Jürgen Paul

42
@Legit-잘 모르겠지만 전통적으로 마지막 단계는 "Profit"입니다. –-)
Stephen C

슬프게도 nginx 1.11에서는 작동하지 않습니다. 마지막 업데이트는 약 3 년 전이므로 더 이상 해결책이 아닌 것 같습니다.
izogfif

무엇을 inactive=600m의미합니까? 되지 않는 inactive시간으로 가정? `[inactive=time]
NeverEndingQueue

47

캐시 된 페이지를 구체적으로 무효화 할 수 있습니다.

proxy_cache_bypass       

페이지를 캐시하고 싶다면 캐시를 이렇게 설정하십시오.

location = /pageid {
  proxy_pass http://localhost:82;
  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_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

이제 해당 페이지무효화하고 다시 캐시 하려는 경우

헤더를 사용하여 비밀 컬 호출

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

무효화되고 캐시됩니다.

nginx 0.7에서 작동합니다.

추가 보너스로 add_header X-Cache-Status페이지가 캐시에 있는지 여부를 확인하는 데 사용할 수 있습니다.


새 페이지를 캐시 할 수있는 경우에만 캐시 된 페이지를 업데이트 할 수 있습니다. 페이지를 제거하면 (404 또는 기타 오류가 백엔드에 의해 제공됨) 이제 페이지가 Set-Cookie 또는 "Content-Control : private"헤더를 보내면 캐시 된 내용이 "유효하지 않습니다".
rbu

36

바니쉬 에게 시도해볼 것을 권합니다 . 바니시는 특별히 리버스 프록시 캐시로 설계되었습니다. 오리진 서버에서 보내는 모든 캐시 제어 헤더를 준수하며 첫 번째 요청을 충족시킵니다.

두 번째 요청의 경우 명시 적 무효화 필자는 파일 이름을 바꾸거나 특정 형식의 쿼리 문자열 캐시 버스터를 사용하여 무효화하려는 리소스의 URL 이름을 변경하는 것이 좋습니다. 바니시는 PURGE바니시 캐시에서 리소스를 제거 하는 작업을 가지고 있지만 사용자와 사용자 사이의 다른 캐시를 제어 할 수는 없습니다. 당신이 명시 적으로 리소스를 제거하고 싶다고 말했듯이 표준 http 컨트롤 헤더는 도움이되지 않습니다. 이 경우 리소스 캐싱을 막는 가장 확실한 방법은 리소스 이름을 바꾸는 것입니다.


"파일 이름을 바꾸거나 어떤 형식의 쿼리 문자열 캐시 버스터를 사용하여"의 의미를 설명 할 수 있습니까? PURGE와 같은 연산을 사용하는 것이 좋지 않은 이유를 잘 모르겠습니다.
계속

5
니스의 경우 +1 작업에 적합한 도구를 사용하는 것이 항상 훨씬 좋습니다.
Tom O'Connor

4
@ 아래 : 성능과 다양성의 영역에서 광택을 만질 희망은 거의 없습니다. 이는 주요 FreeBSD 커널 개발자 중 하나와 유럽에 본사를 둔 전담 팀의 지원을받습니다. 바니시는 트위터, 헤 로쿠 등에서 제작되고 있습니다.

2
캐시 버스터의 가장 간단한 예는 쿼리 문자열의 버전 번호를 정적 리소스에 추가하는 것이므로 style.css는 style.css? 123이됩니다. 파일의 새 버전을 푸시하려고 할 때 리소스의 URL을 style.css? 124로 변경하면 이제 캐시가 완전히 새로운 자산으로 선택되어 개별적으로 캐시됩니다. Apache는 쿼리 문자열이 추가 된 style.css 파일을 제공하므로 실제 파일을 변경할 필요가 없습니다.
chmac

3
가능하면 캐시 버스터를 파일 이름 자체에 넣는 것이 가장 좋습니다. 예를 들어 style.v123.css일부 캐시는 쿼리 문자열이있는 요청을 캐시하지 않기 때문입니다.
Noah McIlraith

8

선택한 페이지를 무효화하려면 nginx-0.8.x에 대해 "cache_purge"패치를 사용하면 원하는 결과를 정확하게 얻을 수 있습니다.)

여기에서 사용할 수 있습니다 .


8

대부분의 캐싱 도구 (Citrix)는 강제 새로 고침 (Ctrl + r)을 사용하여 캐시 된 페이지를 다시 채울 수 있습니다.

다음은 nginx에서 비슷한 것을 수행하는 트릭입니다.

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

이는 브라우저에서 Ctrl + r을 수행 할 때 요청의 Cache-Control 헤더에 max-age = 0이 있다고 가정합니다. Chrome 에서이 작업을 수행하지만 다른 브라우저에서는 시도하지 않았습니다. $eac변수를 1로 설정하는 if 문을 추가하면 헤더 필드를 더 쉽게 추가 할 수 있습니다 .



4

NginxHttpProxyModule 이 http 요청을 caheing 할 수 있다고 생각 합니다. 다음으로 시작하는 지시문을 찾으십시오.

proxy_cache

예, 다음과 같은 지시문을 통해 캐시 동작을 제어 할 수 있습니다.

proxy_cache_valid

3

문서를 찾을 수 없다는 사실을 바탕으로 프로덕션 환경에서 문서에 의존하는 것에 대해 약간 조심해야합니다. 니스를 고려 했습니까? 작고 가벼우 며 하나의 작업을 수행하고 잘 수행하는 내 "역방향 프록시의 nginx"입니다.


문서는 여기에 있습니다 : wiki.nginx.org/NginxHttpProxyModule#proxy_cache
rmalayter

2

응용 프로그램에서 eTag를 사용하고 nginx를 앞에두면 eTag가 변경되면 캐시가 무효화되므로 만료를 처리합니다.


정말? ngnix가 etag와 일치하고 업데이트 된 etag가 있는지 찾기 위해 애플리케이션과 대화하지 않는 것 같습니다.
John Naegle

2

여러 지시문 / 매개 변수를 사용하여 Nginx의 캐시 만료를 제어 할 수 있습니다.

  • proxy_cache_valid 200 302 10m;
  • 아래에 HTTP 헤더 중 하나를 추가하십시오 (우선 순위가 중요합니다- 내 블로그 게시물을 확인하십시오 ).
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • 지시문 의 inactive매개 변수 proxy_cache_path:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

Nginx 캐싱에 대해 더 자세히 알고 싶다면 내 블로그 게시물을 추천 합니다.

이 기능은 Nginx Plus (Nginx의 상용판)에만 존재하므로 제거 주제는 정말 흥미 롭습니다. 나는 @ randy-wallace 답변을 정말로 좋아합니다. 그러나 ngx_cache_purge 모듈 과 같은 다른 가능성도 있습니다 .

가장 간단한 방법은 캐시 된 파일을 수동으로 제거하는 것입니다.

  • 해시 키를 생성하십시오.

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • 파일 시스템에서 파일을 제거하십시오.

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    

1

향후 방문자 : nginx 리버스 프록시에는 캐싱이 통합되어 있으며 다음에서 문서를 사용할 수 있습니다.

구문 : proxy_cache zone | 떨어져서;

기본값 : proxy_cache off;

컨텍스트 : http, 서버, 위치

캐싱에 사용되는 공유 메모리 영역을 정의합니다. 여러 곳에서 동일한 구역을 사용할 수 있습니다. 매개 변수 값은 변수 (1.7.9)를 포함 할 수 있습니다. off 매개 변수는 이전 구성 수준에서 상속 된 캐싱을 비활성화합니다.


안녕하세요 Tarik,이 질문은 무엇을 달성해야하는지에 대해 매우 구체적이며, '캐시 사용 가능'을 넘어서는 것입니다.
asdmin

0
fastcgi_cache_path / opt / nginx- 캐시 레벨 = 2 : 2 keys_zone = img : 50m;

    위치 / img / {
        fastcgi_pass $ backend;
        fcgi_params를 포함하십시오;
        fastcgi_intercept_errors 꺼짐;   
        fastcgi_cache_key $ server_addr $ request_uri;       
        fastcgi_cache img;
        fastcgi_cache_valid 1m;
        fastcgi_hide_header 세트 쿠키;
    }

/ img / 위치에 대한 캐시를 만듭니다. / opt / nginx-cache에 있습니다. 개체는 1 분 동안 캐시됩니다.

대신 다른 응답 코드를 작성할 수 있습니다.

이제 선택한 페이지에 대한 캐시를 무효화 할 수 없습니다. 아마 0.8.x에서는 가능할 것입니다.


원래 질문은 nginx가 처리하는 fastcgi 응용 프로그램이 아닌 Apache 앞에서 nginx를 사용하는 것에 관한 것입니다.
Graham Dumpleton

0

"nginx 웹 서버에 웹 캐시 시스템 기반. 오징어보다 빠르고 효율적" 이라고 주장하는 ncache 라는 nginx 플러그인 이 있습니다.

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