Nginx: 파일이 변경된 경우에만 캐시 새로 고침 - 가능합니까?

Nginx: 파일이 변경된 경우에만 캐시 새로 고침 - 가능합니까?

저는 역방향 프록시와 캐싱을 위해 nginx를 사용하고 있습니다. 현재 "/test" 위치에 대한 캐시는 2시간마다 갱신됩니다: "proxy_cache_valid 200 302 301 304 2h;"

파일이 변경된 경우에만 캐시를 갱신할 수 있나요?

감사합니다!

답변1

이 문제는 일반적으로 처리되어야 합니다.

파일이 브라우저에 캐시되어 있고 브라우저가 해당 파일을 다시 요청하고 해당 파일이 서버 캐시에서 제거된 경우 서버는 계속해서 if-modified-since요청의 헤더를 확인합니다.

서버는 해당 날짜/시간 값을 확인하고 발생한 변경 사항이 없다고 판단하면 304브라우저에 캐시된 버전을 로드해도 괜찮고 실제 객체는 서버가 아니며 다시 다운로드된다는 응답을 보냅니다.

값이 변경되면 개체는 서버가 되고 캐시 복사본이 업데이트됩니다.

https://www.keycdn.com/support/if-modified-since-http-header

Cache-ControlIMHO, 캐싱은 서버 구성보다는 헤더로 실제로 제어해야 하는 것입니다 .

서버 구성 옵션은 Cache-Control이 존재하지 않거나 비논리적으로 구성된 경우를 대비하여 안전 장치로 제공됩니다.

답변2

나는 우리가 이미 웹 서버에 있는 정적 파일이 아닌 생성된 콘텐츠에 대해 이야기하고 있다고 가정합니다(웹 서버에 있는 정적 파일은 일반적으로 충분히 빠릅니다).

주요 질문은 캐시된 콘텐츠가 변경되었음을 Nginx에 알리는 방법입니다.

재검증은 좋은 것처럼 들리지만 업데이트를 확인하는 프로세스는 업데이트를 생성하는 것만큼 비용이 많이 든다는 점에서 영향을 미칩니다. 그래서 그것은 실제 옵션이 아닙니다.

가장 좋은 방법은 콘텐츠가 업데이트된 경우(예: CMS에서 변경된 경우) 콘텐츠를 제거하는 것입니다. 제거는 캐시된 개체를 무효화하는 프로세스입니다. Nginx는 NginxPlus 버전에서만 Purge를 지원합니다. 그러나 캐시된 개체를 다시 로드하면 거의 동일한 작업을 수행할 수 있습니다.

간단한 방법은 다음과 같습니다.

Nginx 구성

...

# default location
location / {
    try_files                   $uri @php;
}

# PHP handler
location @php {
    try_files                   $uri /index.php;

    access_log                  /var/log/nginx/access.log;

    # include fastcgi_params
    include                     fastcgi_params;

    # how to connect to PHP-FPM
    fastcgi_pass                php-fpm;

    # enable caching
    fastcgi_cache               phpfpm;

    # don't look for existing cache objects with HTTP header X-Purge
    fastcgi_cache_bypass        $http_x_purge;
}

...

컬링하여 하나의 문서 제거

curl https://example.com/site1/overview.jpeg -s -H "X-Purge: true"

관련 정보