วิธีการล้างแคชของ nginx?


250

ฉันใช้ nginx เพื่อเป็นเซิร์ฟเวอร์ด้านหน้าฉันได้แก้ไขไฟล์ CSS แต่ nginx ยังคงให้บริการไฟล์เก่า

ฉันพยายามที่จะรีสตาร์ท nginx เพื่อไม่ประสบความสำเร็จและฉันได้ Googled แต่ไม่พบวิธีที่ถูกต้องเพื่อล้างมัน

บางบทความบอกว่าเราสามารถลบแคชไดเรกทอรี: var/cache/nginxแต่ไม่มีไดเรกทอรีดังกล่าวบนเซิร์ฟเวอร์ของฉัน

สิ่งที่ฉันควรทำตอนนี้?


1
รายละเอียดเพิ่มเติมเกี่ยวกับการกำหนดค่า Nginx ของคุณจะช่วยได้มาก คุณกำลังใช้proxy_cache?
Alexander Azarov

ไม่ฉันเพียงแค่ใช้การตั้งค่าเริ่มต้นและผมค้นหาเกี่ยวกับสตริงcacheไม่พบในไฟล์การตั้งค่า
Freewind

5
Nginx จะไม่แคชตามค่าเริ่มต้น
Alexander Azarov

30
คุณกำลังใช้งาน virtualbox / vargant vm อยู่หรือไม่? หากเป็นเช่นนั้นให้ลองปิด sendfile เนื่องจากไฟล์เหล่านี้เล่นได้ไม่ดี
kolbyjack

5
คุณแน่ใจหรือว่าแคชอยู่ด้าน nginx แล้ว? คุณตรวจสอบพฤติกรรมด้วยเครื่องมืออย่างขดแล้วหรือยัง? บ่อยครั้งปัญหาเช่นนี้เป็นเพียงการแคชฝั่งไคลเอ็นต์ไม่ได้ร้องขอทรัพยากรที่อัปเดตเนื่องจากมีการบอกว่าทรัพยากรเก่าจะใช้ได้นานเป็นเวลานานโดยจะหมดอายุสูงสุด หรือสิ่งที่คล้ายกัน
kolbyjack

คำตอบ:


185

ฉันมีปัญหาเดียวกันที่แน่นอน - ฉันใช้ nginx ใน Virtualbox ฉันไม่ได้เปิดแคช แต่รูปลักษณ์ที่เหมือนsendfileถูกกำหนดให้onอยู่ในnginx.confและที่ก่อให้เกิดปัญหา @ kolbyjack พูดถึงข้างบนในความคิดเห็น

เมื่อฉันปิดsendfile- มันทำงานได้ดี

นี้เป็นเพราะ:

Sendfile ใช้เพื่อ 'คัดลอกข้อมูลระหว่างตัวอธิบายไฟล์หนึ่งกับอีกไฟล์หนึ่ง' และเห็นได้ชัดว่ามีปัญหาจริงเมื่อเรียกใช้ในสภาพแวดล้อมของเครื่องเสมือนหรืออย่างน้อยเมื่อทำงานผ่าน Virtualbox การปิดการกำหนดค่านี้ใน nginx ทำให้ไฟล์คงที่จะได้รับการบริการผ่านวิธีการอื่นและการเปลี่ยนแปลงของคุณจะถูกแสดงทันทีและไม่มีคำถาม

มีความเกี่ยวข้องกับข้อผิดพลาดนี้: https://www.virtualbox.org/ticket/12597


7
อ้างถึงลิงค์
Sian Lerk Lau

ในกรณีของฉันวิธีแก้ปัญหาอื่นคือเปิด gzip สำหรับไฟล์ประเภทนี้ วิธีแก้ไขปัญหาทั้งสองวิธี
Dingle

ขอบคุณและ kolbyjack มากสำหรับคำตอบ ช่วยชีวิตฉันไว้.
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 :)
สป็อค

2
การดำเนินการนี้สามารถอัปเดตหน้าเว็บที่แคชไว้เมื่อหน้าใหม่สามารถแคชได้เช่นกัน หากคุณลบหน้า (404 หรือข้อผิดพลาดอื่น ๆ ให้บริการโดยแบ็กเอนด์) ตอนนี้หน้าจะส่ง Set-Cookie หรือส่วนหัว "การควบคุมเนื้อหา: ส่วนตัว" เนื้อหาที่แคชจะไม่ถูก "ทำให้ถูกต้อง"
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 ก็ไม่ได้แก้ไขเช่นกัน
Collin Anderson

Nop Nginx เก็บข้อมูลบางอย่างแม้ว่าคุณจะไม่ได้ใช้งานพร็อกซี แต่เป็นข้อผิดพลาดกับ Nginx + VirtualBox
โทมัส 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 directoryฉันใช้ Ubuntu 14.04.3 LTS และ nginx / 1.8.1 ความคิดใด ๆ
b00r00x0

ลองใช้ไฟล์ grep ต่อไปนี้ภายใต้ / var / nginx / cache:sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
jaybrau

ฉันเชื่อว่าเป็น / var / cache / nginx / * (dir cache ก่อน nginx ที่อยู่ในเส้นทาง)
Randy Lam

15

มีสองคำตอบในคำถามนี้

  • หนึ่งสำหรับ nginx เป็นแคชย้อนกลับ
  • อีกอันสำหรับทำความสะอาดแคชของเบราว์เซอร์ด้วยการป้อนข้อมูลส่วนหัว (อันนี้)

ใช้:

expires modified +90d;

เช่น:

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

ฉันลองใช้งานนี้เพราะฉันมีปัญหาที่คล้ายกัน อย่างไรก็ตามหลังจากที่ฉันทำการเปลี่ยนแปลง - มันแสดงหน้า Nginx เริ่มต้น ฉันใช้ Niginx เป็น LB พร้อมพร็อกซีฉันต้องเปลี่ยนรูทไหม
แอรอน

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

ฉันใช้สคริปต์ทุบตีง่ายมากซึ่งใช้เวลาทั้งหมด 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 (บริการที่ยอดเยี่ยม!) Aha! ที่นั่นมันคือ:

cloudflare.com -> แคช -> ล้างแคช (ฉันล้างทุกอย่าง) ที่แก้ไขปัญหาของฉัน!


2
วิธีนี้จะกำจัดแคชขอบของ Cloudflare มันไม่ได้ล้างแคช Nginx บนเซิร์ฟเวอร์ของคุณเอง
mahemoff

เป็นคำแนะนำฉันคิดว่าเป็นคำตอบที่ถูกต้อง
เฟอร์นันโดโคช

นี่เป็นคำตอบที่ยอดเยี่ยม ฉันขุดชั่วโมงทำไมไฟล์บางไฟล์ยังคงถูกแคชและไม่สามารถเดาได้ว่ามันเป็นความผิดของ CloudFlare ขอบคุณ!
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

สำหรับผู้ที่แก้ปัญหาอื่น ๆ จะไม่ทำงานให้ตรวจสอบว่าคุณกำลังใช้บริการ DNS เช่นCloudFlare ในกรณีนั้นให้เปิดใช้งาน "โหมดการพัฒนา" หรือใช้เครื่องมือ "ล้างแคช"


5

โปรดทราบว่า proxy_cache_bypass สามารถมอบโลกแห่งความเจ็บปวดให้กับคุณได้หากแอปของคุณไม่ส่งคืนการตอบกลับที่แคชได้สำหรับคำขอเฉพาะที่คุณเรียกใช้

หากตัวอย่างเช่นแอปของคุณส่งคุกกี้พร้อมคำขอแรกทุกครั้งสคริปต์ที่ทริกเกอร์ proxy_pass_bypass ผ่าน curl อาจได้รับคุกกี้นั้นในคำตอบและ 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 หากสิ่งนี้ถูกเปิดใช้งานและกำหนดค่าให้แคชไฟล์ descriptor เป็นเวลานาน Nginx อาจยังเห็นเวอร์ชันของไฟล์แคชแม้ว่าคุณจะลบมันออกจากดิสก์แล้วก็ตาม ฉันต้องลด open_file_cache_valid เป็น 1s (ฉันไม่แน่ใจว่าสิ่งนี้จะเหมือนกับการปิดใช้งานแคชไฟล์ทั้งหมดหรือไม่)


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

สิ่งนี้จะลบไฟล์แคชทั้งหมดซึ่งตรงกับ KEY "yahoo / *" หากตั้งไว้ใน nginx.conf:

proxy_cache_key $host$uri;

1

เราใช้ nginx เพื่อแคชสิ่งต่าง ๆ มากมาย มีหลายหมื่นรายการในไดเรกทอรีแคช ในการค้นหาและลบรายการเราได้พัฒนาสคริปต์บางอย่างเพื่อให้กระบวนการนี้ง่ายขึ้น คุณสามารถค้นหาที่เก็บสำหรับสคริปต์นี้ด้านล่าง:

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

ความคิดนั้นง่าย เพื่อสร้างดัชนีของแคช (พร้อมคีย์แคชและไฟล์แคชที่เกี่ยวข้อง) และค้นหาภายในไฟล์ดัชนีนี้ มันช่วยให้เราค้นหารายการได้เร็วขึ้น (จากนาทีถึงวินาทีย่อย) และลบออกตามลำดับ


1

ในกรณีของฉันtouchไฟล์ Css ทำให้ดูเหมือนว่าทรัพยากรเปลี่ยนแปลง (จริง ๆ แล้วtouchไม่ทำอะไรกับไฟล์ยกเว้นเปลี่ยนเวลาแก้ไขล่าสุด) ดังนั้นเบราว์เซอร์และ nginx จะใช้ทรัพยากรล่าสุด


0

ฉันกำลังประสบปัญหาคล้ายกัน:

การตั้งค่าระบบและปัญหา: (บนกล่องเสมือนฉันเป็นเว็บโฮสติ้งโดยใช้อูบุนตูและ nginx - การรีเฟรชหน้าเว็บ PHP ไม่ได้สะท้อนการเปลี่ยนแปลงของไฟล์ CSS ภายนอก) ฉันกำลังพัฒนาเว็บไซต์บนเครื่อง windows และถ่ายโอนไฟล์ไปยัง nginx ผ่านโฟลเดอร์ที่ใช้ร่วมกัน ดูเหมือนว่า nginx จะไม่รับการเปลี่ยนแปลงไปยังไฟล์ css (การรีเฟรชในรูปแบบใด ๆ ก็ไม่ได้ช่วยอะไรการเปลี่ยนชื่อไฟล์ css เป็นสิ่งเดียวที่ทำงานได้)

โซลูชัน: บน VM ค้นหาไฟล์ที่แชร์ (ไฟล์ css ในกรณีของฉัน) เปิดด้วย nano และเปรียบเทียบกับไฟล์ใน windows share (ปรากฏเหมือนกัน) บน VM บันทึกไฟล์ที่แชร์ด้วย nano การเปลี่ยนแปลงทั้งหมดจะปรากฏในเบราว์เซอร์ ไม่แน่ใจว่าทำไมถึงใช้งานได้ แต่มันทำในกรณีของฉัน

UPDATE: หลังจากรีบูตเซิร์ฟเวอร์ VM ปัญหาที่ส่งคืน ทำตามคำแนะนำในโซลูชันทำให้ css ตอบสนองต่อการอัปเดตอีกครั้ง


-1

ในกรณีของฉันมันเป็น opcache ที่เปิดใช้งานใน /etc/php/7.2/fpm/php.ini (Ubuntu):

opcache.enable=1

การตั้งค่าเป็น 0 ทำให้เซิร์ฟเวอร์โหลดไฟล์ (php) เวอร์ชันล่าสุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.