nginx의 캐시를 지우는 방법?


250

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

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

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

지금 어떻게해야합니까?


1
Nginx 구성에 대한 자세한 내용은 많은 도움이 될 것입니다. 사용하고 proxy_cache있습니까?
Alexander Azarov 2016 년

아니, 그냥 기본 구성을 사용하고, 나는 문자열에 대한 검색 cache하지 설정 파일에서 발견
Freewind

5
Nginx는 기본적으로 캐시하지 않습니다.
Alexander Azarov 2016 년

30
virtualbox / vargant vm에서 실행 중입니까? 그렇다면 sendfile이 함께 재생되지 않기 때문에 sendfile을 끄십시오.
kolbyjack

5
캐싱이 nginx쪽에 있는지 확실합니까? curl과 같은 도구로 동작을 확인 했습니까? 종종 이와 같은 문제는 클라이언트 측 캐싱이 업데이트 된 자원을 요청하지 않고 단지 오래된 자원이 최대 유효 기간이 지나서 오랫동안 유효 할 것이라고 들었 기 때문에 갱신 된 자원을 요청하지 않습니다. 또는 비슷한 것.
kolbyjack

답변:


185

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

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

이 때문입니다:

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

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



필자의 경우 다른 해결 방법은 이러한 파일 형식에 대해 gzip을 켜는 것입니다. 어느 쪽이든 문제가 해결됩니다.
Dingle

답변 해 주셔서 감사합니다. 내 생명을 구했습니다.
T1000

1
다음 'sudo vim /etc/nginx/nginx.conf'를 사용하고 'sendfile on'을 'sendfile off'로 변경
Koray Güclü

12
sendfile을 해제했습니다. 불운.
marukobotto

110

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

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"

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


7
한 번만 투표 할 수있는 이유는 무엇입니까? 나는 gazillion하고 싶습니다 :)
Spock

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

3
이 "add_header X-Cache-Status $ upstream_cache_status;" 정말 멋진 기능입니다!
Maxim Masiutin

1
고마워 캐시 무효화에 대한 좋은 팁, nginx에 대한 자습서가 거의 없습니다
Ivan Semochkin

4
게시 한 후에 변경 되었습니까? "secret-header"로 새로운 사본을 성공적으로 얻을 수 있지만 헤더를 제거하자마자 캐시 된 버전을 다시 얻습니다.
Pluc

60

proxy_cache_path 를 통해 캐시 영역을 구성한 다음 (예 : 위치 블록에서) 이를 사용 하지 않으면 proxy_cache 를 통해 캐시되지 않습니다.

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

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


파일을 삭제 한 후 오류 로그에이 메시지가 표시됩니다.[crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)
Collin Anderson

반복적으로 또는 단 한번? 실제 문제가되어서는 안됩니다. 캐시 관리자가 이미 삭제 한 파일을 삭제하려고 시도했을 수도 있습니다. 메시지가 반복적으로 표시되면 nginx (nginx -s reload)를 다시로드하면 도움이 될 수 있습니다. (캐시 관리자도 다시 초기화하는지 확실하지 않습니다.)
Gnarfoz

1
예, 변경 사항을 배포 할 때마다 스크립트로 웹 사이트의 캐시를 자동으로 지우고 nginx를 다시로드해도 수정되지 않습니다.
콜린 앤더슨

Nop Nginx는 프록시를 사용하지 않아도 무언가를 캐시하지만 Nginx + VirtualBox의 버그입니다.
Thomas Decaux

1
다소 모호한 것 같습니다. 그것에 대해 자세히 설명해 주시겠습니까? 여기서 다루는 주제와 관련이없는 것 같습니다.
Gnarfoz

20

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

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

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


1
정확한 결과를 얻으려면 검색어에 $ 를 추가하면 됩니다. 처럼grep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
Jifeng Zhang

1
불행히도 나는 grep: /var/nginx/cache/*: No such file or directoryUbuntu 14.04.3 LTS와 nginx / 1.8.1을 사용 하는 다음과 같은 결과를 얻었습니다 . 어떤 생각?
b00r00x0

/ var / nginx / cache에서 파일을 grep하려면 다음을 시도하십시오.sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
jaybrau

나는 그것이 / var / cache / nginx / * (경로에서 nginx 이전의 dir cache)라고 믿는다
Randy Lam

15

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

  • 리버스 캐시로 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 페이지가 표시됩니다. 프록시를 사용하여 Niginx를 LB로 사용하고 있습니다. 어쩌면 루트를 변경해야합니까?
Aaron

10

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

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

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


9

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

/opt/nginx/cache

sudo rm -rf *

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


2
그 후에 NGINX를 다시 시작해야합니다
Eliel Haouzi

그리고 그것은 나쁜 부분입니다
kidz

9

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

#!/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

8

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

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

내 도메인은 cloudflare.com을 합니다 DNS를 을 합니다 (훌륭한 서비스!). 아하! 거기 있었다 :

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


2
Cloudflare의 엣지 캐시가 제거됩니다. 자신의 서버에서 Nginx 캐시를 지우지 않습니다.
mahemoff

조언으로, 나는 올바른 대답이라고 생각합니다.
페르난도 코시

이것은 훌륭한 답변이었습니다. 일부 파일이 여전히 캐시되고 있으며 CloudFlare 'fault'라고 추측 할 수없는 이유를 몇 시간 동안 파고 들었습니다. 감사!
undefinedman

6

우리는 때때로 닦아야하는 매우 큰 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;
    }
}

5

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


5

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

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


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

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


3

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


2

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

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

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


2

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

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

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

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


1
나는 이것이 귀하의 웹 사이트에서 대역폭을 공격하고 소비하는 데 사용될 수 있다고 생각합니다.
Marcelo Agimóvel

1
app.css?nocache=true쿼리없이 원본 파일이 캐시 ( app.css)에 남아있는 동안 단순히 현재 요청 ( )에 대한 캐시를 우회 하지 않습니까?
adrianTNT

1

다음과 같이 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 /에 동적으로 생성되어 캐시 된 내용을 저장합니다.


1

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

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

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

proxy_cache_key $host$uri;

1

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

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

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


1

필자의 경우, touch해당 CSS 파일은 리소스가 변경된 것처럼 보이게 만듭니다 (실제로 touch는 마지막 수정 시간 변경을 제외하고 파일에 아무런 영향을 미치지 않음). 브라우저와 nginx는 최신 리소스를 적용합니다


0

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

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

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

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


-1

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

opcache.enable=1

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

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