Làm thế nào để xóa bộ nhớ cache của nginx?


250

Tôi sử dụng nginx làm máy chủ phía trước, tôi đã sửa đổi các tệp CSS, nhưng nginx vẫn phục vụ các tệp cũ.

Tôi đã cố gắng khởi động lại nginx, nhưng không thành công và tôi đã Googled, nhưng không tìm thấy một cách hợp lệ để xóa nó.

Một số bài viết nói rằng chúng tôi chỉ có thể xóa thư mục bộ đệm: var/cache/nginxnhưng không có thư mục đó trên máy chủ của tôi.

Tôi nên làm gì bây giờ?


1
Thông tin chi tiết về cấu hình Nginx của bạn sẽ giúp ích rất nhiều. Bạn đang sử dụng proxy_cache?
Alexander Azarov

Không, tôi chỉ sử dụng cấu hình mặc định và tôi đã tìm kiếm về chuỗi cache, không tìm thấy nó trong các tệp cấu hình
Freewind

5
Nginx không lưu trữ theo mặc định.
Alexander Azarov

30
Bạn đang chạy trong vm ảo / vargant? Nếu vậy, hãy thử tắt sendfile, vì chúng không chơi tốt với nhau.
kolbyjack

5
Bạn có chắc bộ nhớ đệm ở phía nginx không? Bạn đã xác minh hành vi với một công cụ như curl? Thông thường, một vấn đề như thế này chỉ là bộ nhớ đệm phía máy khách không yêu cầu tài nguyên được cập nhật vì người ta nói rằng tài nguyên cũ sẽ có hiệu lực trong một thời gian dài khi hết hạn tối đa; hoặc một cái gì đó tương tự.
kolbyjack

Câu trả lời:


185

Tôi đã có cùng một vấn đề - tôi đã chạy nginx của mình trong Virtualbox. Tôi không bật bộ nhớ đệm. Nhưng có vẻ như sendfileđã được thiết lập để onnginx.confvà điều đó đã gây ra vấn đề. @kolbyjack đã đề cập ở trên trong phần bình luận.

Khi tôi tắt sendfile- nó hoạt động tốt.

Điều này là do:

Sendfile được sử dụng để 'sao chép dữ liệu giữa một bộ mô tả tệp này và một cái khác' và dường như có một số rắc rối thực sự khi chạy trong môi trường máy ảo hoặc ít nhất là khi chạy qua Virtualbox. Tắt cấu hình này trong nginx khiến tệp tĩnh được cung cấp qua một phương thức khác và các thay đổi của bạn sẽ được phản ánh ngay lập tức và không có câu hỏi

Nó có liên quan đến lỗi này: https://www.virtualbox.org/ticket/12597


7
Tham khảo liên kết
Sian Lerk Lau

Trong trường hợp của tôi, cách giải quyết khác là bật gzip cho các loại tệp này. Dù bằng cách nào thì vấn đề được giải quyết.
Dingle

Cảm ơn bạn và kolbyjack rất nhiều cho câu trả lời. Cứu cuộc đời tôi.
T1000

1
Tôi đã sử dụng sau 'sudo vim /etc/nginx/nginx.conf' và thay đổi 'sendfile on' thành 'sendfile off'
Koray Güclü

12
Tôi đã tắt sendfile. Không may mắn.
marukobotto

110

Bạn cũng có thể bỏ qua / re-cache trên một tệp theo cơ sở tệp bằng cách sử dụng

proxy_cache_bypass $http_secret_header;

và như một phần thưởng, bạn có thể trả lại tiêu đề này để xem nếu bạn đã nhận nó từ bộ đệm (sẽ trả về 'HIT') hoặc từ máy chủ nội dung (sẽ trả về 'BYPASS').

add_header X-Cache-Status $upstream_cache_status;

để hết hạn / làm mới tệp đã lưu trong bộ nhớ cache, hãy sử dụng curl hoặc bất kỳ máy khách còn lại nào để thực hiện yêu cầu đến trang được lưu.

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

điều này sẽ trả về một bản sao mới của mục và nó cũng sẽ thay thế những gì trong bộ đệm.


7
Tại sao tôi chỉ có thể upvote này một lần? Tôi muốn làm một công việc :)
Spock

2
Điều này chỉ có thể cập nhật các trang được lưu trong bộ nhớ cache khi trang mới cũng được lưu vào bộ nhớ cache. Nếu bạn đã xóa một trang (404 hoặc các lỗi khác hiện được phục vụ bởi phụ trợ), thì trang hiện sẽ gửi tiêu đề Set-Cookie hoặc tiêu đề "Điều khiển nội dung: riêng tư", nội dung được lưu trong bộ nhớ cache sẽ không bị "vô hiệu".
rbu 2/2/2016

3
Điều này "add_header X-Cache-Status $ upstream_cache_status;" là một tính năng tuyệt vời
Maxim Masiutin

1
cảm ơn rất nhiều. Mẹo hay cho việc vô hiệu hóa bộ đệm, có rất ít hướng dẫn về nginx
Ivan Semochkin

4
Điều này đã thay đổi kể từ khi bạn đăng? Tôi có thể nhận thành công một bản sao mới với "tiêu đề bí mật" nhưng ngay sau khi xóa tiêu đề, tôi lại nhận được phiên bản được lưu trong bộ nhớ cache ...
Pluc

60

Trừ khi bạn định cấu hình vùng bộ đệm thông qua proxy_cache_path và sau đó sử dụng nó (ví dụ: trong khối vị trí), thông qua: proxy_cache, không có gì sẽ được lưu vào bộ đệm.

Tuy nhiên, nếu bạn đã làm, theo tác giả của nginx , chỉ cần xóa tất cả các tệp khỏi thư mục bộ đệm là đủ.

Cách đơn giản nhất: find /path/to/your/cache -type f -delete


Tôi nhận được điều này trong nhật ký lỗi của mình sau khi xóa các tệp:[crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)
Collin Anderson

Lặp đi lặp lại, hay chỉ một lần? Nó không phải là một vấn đề thực tế. Có lẽ nó chỉ có nghĩa là trình quản lý bộ đệm đã cố xóa một tệp mà bạn đã xóa. Có thể tải lại nginx (nginx -s tải lại) có thể hữu ích nếu bạn nhận được thông báo nhiều lần. (Không chắc chắn nếu điều đó cũng khởi động lại trình quản lý bộ đệm.)
Gnarfoz

1
vâng, tôi tự động xóa bộ nhớ cache cho trang web của mình bằng tập lệnh bất cứ khi nào tôi triển khai thay đổi và tải lại nginx cũng không khắc phục được.
Collin Anderson

Nop Nginx lưu trữ một cái gì đó ngay cả khi bạn không sử dụng công cụ proxy, nhưng đó là một lỗi với Nginx + VirtualBox.
Thomas Decaux

1
Nghe có vẻ khá mơ hồ. Bạn có thể giải thích về điều đó? Có vẻ như nó không liên quan đến chủ đề trong tay.
Gnarfoz

20

Bạn có thể xóa thư mục bộ đệm của nginx hoặc Bạn có thể tìm kiếm tệp cụ thể:

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

Và chỉ xóa một tệp để nginx làm mới chúng.


1
Để có được lượt truy cập chính xác, bạn có thể thêm $ vào cụm từ tìm kiếm. Thíchgrep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
Jifeng Zhang

1
Thật không may, tôi đã nhận được đầu ra sau grep: /var/nginx/cache/*: No such file or directoryTôi đang sử dụng Ubuntu 14.04.3 LTS và nginx / 1.8.1. Bất kỳ ý tưởng?
b00r00x0

Hãy thử các cách sau với các tệp grep trong / var / nginx / cache:sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
jaybrau

Tôi tin rằng đó là / var / cache / nginx / * (dir cache trước nginx trong đường dẫn)
Randy Lam

15

Có hai câu trả lời trong câu hỏi này.

  • Một cho nginx là bộ đệm đảo ngược
  • Một cách khác để làm sạch bộ đệm của trình duyệt bằng cách nhập tiêu đề (cái này)

Sử dụng:

expires modified +90d;

VÍ DỤ:

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

Tôi đã thử thực hiện điều này bởi vì tôi đang có vấn đề tương tự. Tuy nhiên, sau khi tôi thực hiện thay đổi - nó hiển thị trang Nginx mặc định. Tôi đang sử dụng Niginx làm LB với proxy, tôi có cần thay đổi root không?
Aaron

10

Tôi thấy điều này hữu ích

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

Tìm kiếm, và nếu tìm thấy thì xóa.


9

Trong cài đặt nginx của tôi, tôi thấy tôi phải đi đến:

/opt/nginx/cache

sudo rm -rf *

trong thư mục đó. Nếu bạn biết đường dẫn đến cài đặt nginx của bạn và có thể tìm thấy thư mục bộ đệm thì điều tương tự có thể phù hợp với bạn. Hãy cẩn thận với rm -rflệnh, nếu bạn ở trong thư mục sai, bạn có thể xóa toàn bộ ổ cứng.


2
bạn cần khởi động lại NGINX sau đó
Eliel Haouzi

Và đó là phần tồi tệ
kidz

9

Tôi chạy một kịch bản bash rất đơn giản, mất tất cả 10 giây để thực hiện công việc và gửi thư cho tôi khi hoàn tất.

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

Tôi cũng có vấn đề này.

  • Không thể tìm thấy bất kỳ thư mục nginx / cache
  • sendfile đã tắt

Tên miền của tôi sử dụng cloudflare.com cho DNS (dịch vụ tuyệt vời!). Aha! Đó là:

cloudflare.com -> bộ nhớ đệm -> Xóa bộ nhớ cache (Tôi đã xóa tất cả mọi thứ) Điều đó đã giải quyết vấn đề của tôi!


2
Điều này thanh trừng bộ nhớ cạnh của Cloudflare. Nó không xóa bộ đệm Nginx trên máy chủ của riêng bạn.
mahemoff

Như một lời khuyên, tôi nghĩ là một câu trả lời hợp lệ.
Fernando Kosh

Đây là câu trả lời tuyệt vời. Tôi đã đào hàng giờ tại sao một số tệp vẫn đang được lưu trong bộ nhớ cache và không thể đoán đó là 'lỗi' của CloudFlare. Cảm ơn!
không xác định

6

Chúng tôi có bộ đệm nginx rất lớn (gigabyte) mà đôi khi chúng tôi cần phải xóa. Tôi đã tạo ra một tập lệnh xóa bộ nhớ cache ngay lập tức (liên quan đến Nginx) và sau đó xóa thư mục bộ đệm mà không bỏ đói ứng dụng chính cho I / O đĩa.

Tóm tắt:

  1. Di chuyển thư mục bộ đệm đến một vị trí mới (trên cùng hệ thống tệp!) (Điều này không phá vỡ bất kỳ mô tả tệp đang mở nào)
  2. Tạo lại thư mục bộ đệm gốc, trống
  3. Tải lại Nginx ( tải lại duyên dáng , trong đó nginx cho phép nhân viên cũ hoàn thành các yêu cầu đang thực hiện)
  4. Xóa dữ liệu lưu trữ cũ

Đây là tập lệnh, được điều chỉnh theo Ubuntu 16.04 LTS, với bộ đệm được đặt tại /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

Và trong trường hợp nó hữu ích, đây là cấu hình Nginx chúng tôi sử dụng:

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

Đối với những người mà các giải pháp khác không hoạt động, hãy kiểm tra xem bạn có đang sử dụng dịch vụ DNS như CloudFlare không . Trong trường hợp đó, kích hoạt "Chế độ phát triển" hoặc sử dụng công cụ "Lọc bộ nhớ cache".


5

Vui lòng lưu ý rằng proxy_cache_bypass có thể mang đến cho bạn một thế giới bị tổn thương nếu ứng dụng của bạn không trả lại phản hồi có thể lưu trong bộ nhớ cache cho yêu cầu cụ thể mà bạn kích hoạt nó.

Ví dụ: nếu ứng dụng của bạn gửi cookie với mỗi yêu cầu đầu tiên, thì tập lệnh kích hoạt proxy_pass_bypass qua curl có thể sẽ nhận được cookie đó trong câu trả lời và nginx sẽ không sử dụng phản hồi đó để làm mới mục được lưu trong bộ nhớ cache.


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

Hãy cẩn thận để xác định đúng đường dẫn chính xác.


3

Đối với những người đã cố gắng xóa các tệp bộ đệm nginx và nó không hoạt động hoặc hoạt động không liên tục, hãy xem cài đặt của bạn cho open_file_cache. Nếu điều này được kích hoạt và được định cấu hình để lưu bộ mô tả tệp trong một thời gian dài, thì Nginx vẫn có thể thấy một phiên bản của tệp được lưu trong bộ nhớ cache, ngay cả sau khi bạn đã xóa nó khỏi đĩa. Tôi đã phải giảm open_file_cache_valid xuống 1 giây (Tôi không chắc chắn nếu điều này về cơ bản giống như vô hiệu hóa hoàn toàn bộ đệm của tệp).


2

Trên máy chủ của tôi, thư mục bộ đệm nginx đang ở /data/nginx/cache/

Vì vậy, tôi chỉ xóa nó: sudo rm -rf /data/nginx/cache/

Hy vọng điều này sẽ giúp được bất cứ ai.


2

Nếu bạn muốn xóa bộ nhớ cache của các tệp cụ thể thì bạn có thể sử dụng lệnh proxy_cache_bypassnày. Đây là cách bạn làm điều đó

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

Bây giờ nếu bạn muốn bỏ qua bộ đệm, bạn truy cập tệp bằng cách chuyển tham số nocache

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


1
Tôi đoán điều này có thể được sử dụng để tấn công và tiêu tốn băng thông trong trang web của bạn.
Marcelo Agimóvel

1
Không phải điều này chỉ đơn giản là bỏ qua bộ đệm cho yêu cầu hiện tại ( app.css?nocache=true) trong khi tệp gốc (không có truy vấn) vẫn còn trong bộ đệm ( app.css)?
adrianTNT

1

Bạn có thể thêm cấu hình trong nginx.conf như sau.

...
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;

    ....
}
...
}

Từ trên, một thư mục có tên "nginx_cache" được tạo động trong / tmp / để lưu trữ nội dung được lưu trong bộ nhớ cache.


1

Có một phương pháp đúng để chỉ xóa các tệp bộ đệm, phù hợp với bất kỳ KEY nào. Ví dụ:

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

Thao tác này sẽ xóa tất cả các tệp bộ đệm, khớp với KEY "yahoo / *", nếu trong nginx.conf đã được đặt:

proxy_cache_key $host$uri;

1

Chúng tôi sử dụng nginx để lưu trữ rất nhiều thứ. Có hàng chục ngàn mục trong thư mục bộ đệm. Để tìm các mục và xóa chúng, chúng tôi đã phát triển một số tập lệnh để đơn giản hóa quá trình này. Bạn có thể tìm thấy kho lưu trữ cho các kịch bản này dưới đây:

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

Ý tưởng rất đơn giản. Để tạo một chỉ mục của bộ đệm (với các khóa bộ đệm và các tệp bộ đệm tương ứng) và tìm kiếm trong tệp chỉ mục này. Nó thực sự giúp chúng tôi tăng tốc tìm kiếm vật phẩm (từ phút đến giây phụ) và xóa chúng cho phù hợp.


1

Trong trường hợp của tôi, touchtệp Css đó, làm cho nó trông giống như tài nguyên đã thay đổi (thực tế touchkhông có gì với tệp, ngoại trừ thay đổi thời gian sửa đổi lần cuối), vì vậy trình duyệt và nginx sẽ áp dụng các tài nguyên mới nhất


0

Tôi đã trải qua một loại vấn đề tương tự:

Sự cố và thiết lập hệ thống: (Trên hộp ảo Tôi đang lưu trữ web bằng cách sử dụng ubfox và nginx - Làm mới trang web PHP không phản ánh các thay đổi đối với tệp css bên ngoài). Tôi đang phát triển trang web trên máy windows và chuyển tập tin sang nginx thông qua thư mục dùng chung. Có vẻ như nginx không nhận các thay đổi đối với tệp css (làm mới theo bất kỳ cách nào không có ích. Thay đổi tên tệp css là điều duy nhất có hiệu quả)

Giải pháp: Trên VM tìm tệp chia sẻ (tệp css trong trường hợp của tôi). Mở bằng nano và so sánh với tệp trong windows share (chúng có vẻ giống hệt nhau). Trên VM lưu tệp chia sẻ với nano. Tất cả các thay đổi hiện được phản ánh trong trình duyệt. Không chắc chắn tại sao điều này hoạt động nhưng nó đã làm trong trường hợp của tôi.

CẬP NHẬT: Sau khi khởi động lại máy chủ VM, sự cố trở lại. Làm theo các hướng dẫn trong Giải pháp đã khiến css phản hồi lại các bản cập nhật


-1

Trong trường hợp của tôi, đó là opcache được kích hoạt trong /etc/php/7.2/fpm/php.ini (Ubuntu):

opcache.enable=1

Đặt nó thành 0 làm cho máy chủ tải phiên bản mới nhất của tệp (php).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.