최근 Nginx가 리버스 프록시 기능에 캐싱을 추가했다고 들었습니다. 나는 둘러 보았지만 그것에 관한 많은 정보를 찾을 수 없었습니다.
Nginx를 Apache / Django 앞에서 캐싱 리버스 프록시로 설정하고 싶습니다. 일부 (전부는 아님) 동적 페이지에 대한 Nginx 프록시 요청을 Apache에 요청한 다음 생성 된 페이지를 캐시하고 캐시에서 해당 페이지에 대한 후속 요청을 제공합니다.
이상적으로는 두 가지 방법으로 캐시를 무효화하고 싶습니다.
- 캐시 된 항목에 만료 날짜 설정
- 캐시 된 항목을 명시 적으로 무효화합니다. 예를 들어 Django 백엔드가 특정 데이터를 업데이트 한 경우 Nginx에 영향을받는 페이지의 캐시를 무효화하도록 지시하고 싶습니다
Nginx를 설정하는 것이 가능합니까? 어떻게?
답변
캐시 된 항목을 명시 적으로 무효화하는 방법은 없다고 생각하지만 나머지는 수행하는 방법의 예입니다. 업데이트 : 다른 답변에서 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;
}
}
}
답변
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페이지가 캐시에 있는지 여부를 확인하는 데 사용할 수 있습니다.
답변
바니쉬 에게 시도해볼 것을 권합니다 . 바니시는 특별히 리버스 프록시 캐시로 설계되었습니다. 오리진 서버에서 보내는 모든 캐시 제어 헤더를 준수하며 첫 번째 요청을 충족시킵니다.
두 번째 요청의 경우 명시 적 무효화 필자는 파일 이름을 바꾸거나 특정 형식의 쿼리 문자열 캐시 버스터를 사용하여 무효화하려는 리소스의 URL 이름을 변경하는 것이 좋습니다. 바니시는 PURGE바니시 캐시에서 리소스를 제거 하는 작업을 가지고 있지만 사용자와 사용자 사이의 다른 캐시를 제어 할 수는 없습니다. 당신이 명시 적으로 리소스를 제거하고 싶다고 말했듯이 표준 http 컨트롤 헤더는 도움이되지 않습니다. 이 경우 리소스 캐싱을 막는 가장 확실한 방법은 리소스 이름을 바꾸는 것입니다.
답변
선택한 페이지를 무효화하려면 nginx-0.8.x에 대해 “cache_purge”패치를 사용하면 원하는 결과를 정확하게 얻을 수 있습니다.)
여기에서 사용할 수 있습니다 .
답변
대부분의 캐싱 도구 (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 문을 추가하면 헤더 필드를 더 쉽게 추가 할 수 있습니다 .
답변
캐싱은 nginx의 새로운 기능이지만 현재로서는 잘 문서화되어 있지 않지만 프로덕션 환경에서 사용할 수있을 정도로 안정적입니다.
답변
NginxHttpProxyModule 이 http 요청을 caheing 할 수 있다고 생각 합니다. 다음으로 시작하는 지시문을 찾으십시오.
proxy_cache
예, 다음과 같은 지시문을 통해 캐시 동작을 제어 할 수 있습니다.
proxy_cache_valid