IT story

nginx의 캐시를 지우는 방법?

hot-time 2020. 4. 18. 09:36
반응형

nginx의 캐시를 지우는 방법?


nginx를 프론트 서버로 사용하고 CSS 파일을 수정했지만 nginx는 여전히 이전 파일을 제공합니다.

나는 nginx를 다시 시작하려고 시도했지만 성공하지 못했지만 Googled가 있지만 그것을 지우는 올바른 방법을 찾지 못했습니다.

일부 기사에서는 캐시 디렉토리를 삭제할 수 var/cache/nginx있지만 내 서버에는 해당 디렉토리가 없습니다.

지금 어떻게해야합니까?


나는 똑같은 문제가 있었다-나는 nginx를 Virtualbox에서 실행하고 있었다. 캐싱을 설정하지 않았습니다. 그러나 외모와 같은 sendfile로 설정 on에서 nginx.conf문제를 일으키는 것을. @kolbyjack은 주석에서 위에서 언급했습니다.

내가 꺼 졌을 때 sendfile-잘 작동했습니다.

이 때문입니다:

Sendfile은 '한 파일 설명자와 다른 파일 설명 사이의 데이터 복사'에 사용되며 가상 시스템 환경에서 실행하거나 적어도 Virtualbox를 통해 실행할 때 실제 문제가 발생합니다. nginx에서이 구성을 끄면 정적 파일이 다른 방법을 통해 제공되며 변경 사항이 즉시 반영됩니다.

이 버그와 관련이 있습니다 : https://www.virtualbox.org/ticket/12597


파일을 사용하여 파일을 무시하고 다시 캐시 할 수도 있습니다.

proxy_cache_bypass $http_secret_header;

또한 보너스 로이 헤더를 반환하여 캐시 ( 'HIT'반환) 또는 콘텐츠 서버 ( 'BYPASS'반환)에서 가져 왔는지 확인할 수 있습니다.

add_header X-Cache-Status $upstream_cache_status;

캐시 된 파일을 만료 / 새로 고치려면 curl 또는 나머지 클라이언트를 사용하여 캐시 된 페이지를 요청하십시오.

curl http://abcdomain.com/mypage.html -s -I -H "secret-header:true"

그러면 항목의 새로운 사본이 반환되고 캐시에있는 내용도 바뀝니다.


당신이를 통해 캐시 영역을 구성하지 않는 한 proxy_cache_path을 하고 (위치 블록에 예를 들어)를 사용을 통해 : proxy_cache 아무것도 캐시되지 얻을 것이다.

그러나 nginx의 저자에 따르면 캐시 디렉토리에서 모든 파일을 제거하면 충분합니다.

가장 간단한 방법 : find /path/to/your/cache -type f -delete


nginx의 캐시 디렉토리를 삭제하거나 특정 파일을 검색 할 수 있습니다.

grep -lr 'http://mydomain.pl/css/myedited.css' /var/nginx/cache/*

그리고 하나의 파일 만 삭제하여 nginx를 새로 고칩니다.


이 질문에는 두 가지 답변이 있습니다.

  • 리버스 캐시로 nginx를위한 것
  • 헤더 입력으로 브라우저 캐시를 정리하기위한 또 하나 (이것)

사용하다:

expires modified +90d;

EG :

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}

내 nginx 설치에서 나는 다음으로 가야한다는 것을 알았습니다.

/opt/nginx/cache

sudo rm -rf *

그 디렉토리에. nginx 설치 경로를 알고 캐시 디렉토리를 찾을 수 있다면 동일하게 작동 할 수 있습니다. 잘못된 디렉토리에 있으면 전체 하드 드라이브를 삭제할 수 있는 명령에 매우주의 하십시오 rm -rf.


나는 이것이 유용하다는 것을 알았다

grep -lr 'jquery.js' /path/to/nginx/cache/folder/* | xargs rm

검색하고 찾은 경우 삭제하십시오.


나는 또한이 문제가 있었다.

  • nginx / cache 폴더를 찾을 수 없습니다
  • sendfile이 해제되었습니다

내 도메인은 DNS를 위해 cloudflare.com사용 합니다 (좋은 서비스!). 아하! 거기 있었다 :

cloudflare.com-> 캐싱-> 캐시 제거 (모든 것을 제거) 내 문제를 해결했습니다!


작업을 수행하는 데 10 초가 걸리고 완료되면 나에게 메일을 보내는 매우 간단한 bash 스크립트를 실행합니다.

#!/bin/bash
sudo service nginx stop
sudo rm -rf /var/cache/nginx/*
sudo service nginx start | mail -s "Nginx Purged" me@gmail.com
exit 0

우리는 때때로 닦아야하는 매우 큰 nginx 캐시 (기가 바이트)를 가지고 있습니다. 캐시를 즉시 지우고 (Nginx에 관한 한) 디스크 I / O의 기본 응용 프로그램을 고갈시키지 않고 캐시 디렉토리를 제거하는 스크립트를 작성했습니다.

요약하자면:

  1. 캐시 폴더를 같은 파일 시스템에서 새로운 위치로 옮기십시오 (이것은 열린 파일 디스크립터를 방해하지 않습니다)
  2. 비어있는 원래 캐시 폴더를 다시 만듭니다.
  3. Nginx 재로드 (Nginx를 사용하여 고령 근로자가 진행중인 요청을 완료 할 수있는 우아한 재로드)
  4. 오래된 캐시 데이터 제거

캐시가 다음 위치에있는 Ubuntu 16.04 LTS에 맞게 조정 된 스크립트는 다음과 같습니다 /mnt/nginx-cache.

#!/bin/bash
set -e

TMPCACHE=`mktemp --directory --tmpdir=/mnt nginx-cache-XXXXXXXXXX`
TMPTEMP=`mktemp --directory --tmpdir=/mnt nginx-temp-XXXXXXXXXX`

# Move the old cache folders out of the way
mv /mnt/nginx-cache $TMPCACHE
mkdir -p /mnt/nginx-cache
chmod -R 775 /mnt/nginx-cache
chown www-data:www-data /mnt/nginx-cache

mv /mnt/nginx-temp $TMPTEMP
mkdir -p /mnt/nginx-temp
chmod -R 775 /mnt/nginx-temp
chown www-data:www-data /mnt/nginx-temp

# Tell Nginx about the new folders.
service nginx reload

# Create an empty folder.
rm -rf /mnt/empty
mkdir -p /mnt/empty

# Remove the old cache and old temp folders w/o thrashing the disk...
# See http://serverfault.com/questions/546177/how-to-keep-subtree-removal-rm-rf-from-starving-other-processes-for-disk-i
# Note: the `ionice` and `nice` may not actually do much, but why not?
ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ $TMPCACHE
ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ $TMPTEMP
rm -rf $TMPCACHE
rm -rf $TMPTEMP

rm -rf /mnt/empty

도움이되는 경우 사용하는 Nginx 구성은 다음과 같습니다.

upstream myapp {
    server localhost:1337 fail_timeout=0;
}

proxy_cache_path /mnt/nginx-cache/app levels=2:2:2 keys_zone=app_cache:100m inactive=1y max_size=10g;
proxy_temp_path  /mnt/nginx-temp/app;

server {
    listen   4316 default;
    server_name  myapp.com;

    location / {
        proxy_pass http://appserv;
        proxy_cache app_cache;
        proxy_cache_valid 200 1y;
        proxy_cache_valid 404 1m;
    }
}

다른 솔루션이 작동하지 않는 사람들을 위해 CloudFlare 와 같은 DNS 서비스를 사용하고 있는지 확인하십시오 . 이 경우 "개발 모드"를 활성화하거나 "캐시 제거"도구를 사용하십시오.


앱이 트리거하는 특정 요청에 대해 캐시 가능한 응답을 반환하지 않으면 proxy_cache_bypass로 인해 상처를 입을 수 있습니다.

예를 들어 앱이 첫 번째 요청마다 쿠키를 보내는 경우 curl을 통해 proxy_pass_bypass를 트리거하는 스크립트는 아마도 해당 쿠키를 응답으로 가져오고 nginx는 해당 응답을 사용하여 캐시 된 항목을 새로 고치지 않습니다 .


find /etc/nginx/cache_folder -type d -exec rm -rvf {} \;
mkdir /etc/nginx/cache_folder
service nginx restart

올바른 경로를 올바르게 지정하십시오.


nginx 캐시 파일을 삭제하려고 시도했지만 작동하지 않거나 간헐적으로 작동 한 경우 open_file_cache 설정을 살펴보십시오. 이 기능을 활성화하고 오랫동안 파일 디스크립터를 캐시하도록 구성한 경우 Nginx는 디스크에서 파일을 삭제 한 후에도 캐시 된 파일의 버전을 계속 볼 수 있습니다. open_file_cache_valid를 1로 줄여야했습니다 (파일 캐시를 완전히 비활성화하는 것과 본질적으로 동일한 지 확실하지 않습니다).


특정 파일의 캐시를 지우려면 proxy_cache_bypass지시문을 사용할 수 있습니다 . 이것이 당신이하는 방법입니다

location / {
    proxy_cache_bypass $cookie_nocache $arg_nocache;
    # ...
}

이제 캐시를 우회하려면 nocache 매개 변수를 전달하여 파일에 액세스하십시오.

http://www.example.com/app.css?nocache=true


내 서버에서 nginx 캐시 폴더는 /data/nginx/cache/

그래서 나는 그것을 제거했다. sudo rm -rf /data/nginx/cache/

이것이 누군가를 도울 수 있기를 바랍니다.


다음과 같이 nginx.conf에 구성을 추가 할 수 있습니다.

...
http {
proxy_cache_path  /tmp/nginx_cache levels=1:2 keys_zone=my-test-cache:8m max_size=5000m inactive=300m;

server {
    proxy_set_header X- Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_cache my-test-cache;
    proxy_cache_valid  200 302  1m;
    proxy_cache_valid  404      60m;
    proxy_cache_use_stale   error timeout invalid_header updating;
    proxy_redirect off;

    ....
}
...
}

위에서 "nginx_cache"라는 이름의 폴더가 / tmp /에 동적으로 생성되어 캐시 된 내용을 저장합니다.


KEY와 일치하는 캐시 파일 만 제거하는 올바른 방법이 있습니다. 예를 들면 다음과 같습니다.

grep -lr 'KEY: yahoo' /var/lib/nginx/cache | xargs rm -rf

nginx.conf에 KEY "yahoo / *"와 일치하는 모든 캐시 파일이 제거됩니다.

proxy_cache_key $host$uri;

비슷한 문제가 발생했습니다.

시스템 설정 및 문제 : (virtualbox에서 우분투와 nginx를 사용하는 웹 호스팅입니다-PHP 웹 페이지 새로 고침에 외부 CSS 파일의 변경 사항이 반영되지 않았습니다). Windows 컴퓨터에서 웹 사이트를 개발하고 공유 폴더를 통해 파일을 nginx로 전송하고 있습니다. nginx가 CSS 파일의 변경 사항을 선택하지 않는 것 같습니다 (어떻게 든 새로 고치는 것이 도움이되지 않습니다. CSS 파일 이름 변경은 효과가 있습니다)

해결책 : VM에서 공유 파일 (필자의 경우 css 파일)을 찾으십시오. nano로 열고 Windows 공유의 파일과 비교하십시오 (동일하게 나타납니다). VM에서 nano로 공유 파일을 저장하십시오. 모든 변경 사항이 브라우저에 반영됩니다. 왜 이것이 효과가 있는지는 모르지만 제 경우에는 그랬습니다.

업데이트 : VM 서버를 재부팅 한 후 문제가 발생했습니다. 솔루션의 지침에 따라 CSS가 다시 업데이트에 응답하게했습니다.


제 경우에는 /etc/php/7.2/fpm/php.ini (우분투)에서 활성화 된 opcache였습니다.

opcache.enable=1

0으로 설정하면 서버가 최신 버전의 (php) 파일을로드하게됩니다.


우리는 많은 것들을 캐싱하기 위해 nginx를 사용합니다. 캐시 디렉토리에는 수만 개의 항목이 있습니다. 항목을 찾아 삭제하기 위해이 프로세스를 단순화하는 몇 가지 스크립트를 개발했습니다. 이 스크립트의 저장소는 아래에서 찾을 수 있습니다.

https://github.com/zafergurel/nginx-cache-cleaner

아이디어는 간단하다. 캐시 키 (캐시 키 및 해당 캐시 파일 포함)를 작성하고이 인덱스 파일 내에서 검색합니다. 실제로 항목 검색 속도를 높이고 (분에서 1 초 미만으로) 그에 따라 항목을 삭제하는 데 실제로 도움이되었습니다.

참고 URL : https://stackoverflow.com/questions/6236078/how-to-clear-the-cache-of-nginx

반응형