2011-06-04 237 views
184

我使用nginx作爲前臺服務器,我修改了CSS文件,但nginx仍然在服務於舊的服務器。如何清除nginx的緩存?

我試圖重啓nginx的,沒有成功,我用Google搜索,但沒有找到有效的方法來清除它。

有些文章說,我們可以刪除緩存目錄:var/cache/nginx,但我的服務器上沒有這樣的目錄。

我應該怎麼辦?

+1

關於你的Nginx配置的更多細節將會有很大的幫助。你使用'proxy_cache'嗎? – 2011-06-04 12:13:56

+0

不,我只是使用了默認配置,並且我搜索了字符串「cache」,但在配置文件中找不到它。 – Freewind 2011-06-04 15:16:30

+5

默認情況下,Nginx不會緩存。 – 2011-06-04 17:12:37

回答

153

我有完全相同的問題 - 我跑我在VirtualBox中nginx的。我沒有緩存打開。但看起來像sendfile被設置爲onnginx.conf這是造成這個問題。 @kolbyjack在評論中提到了它。

當我關掉sendfile - 它工作得很好。在虛擬機環境中運行時,或者至少當通過VirtualBox的運行

This is because:

SENDFILE是「一個文件描述符和另一個之間複製數據」用於和顯然有一些真正的麻煩。在nginx中關閉此配置會導致靜態文件通過不同的方法提供服務,並且您的更改將立即反映並且毫無疑問地被反映出來

+17

像宣傳的那樣,但一個鏈接,並約了sendfile的目的,一些信息會比個人帳戶的讚賞。將其從日記條目更改爲事實答案並獲得我的投票。 – 2013-09-06 19:34:44

+5

請參閱本[鏈接](http://jeremyfelt.com/code/2013/01/08/clear-nginx-cache-in-vagrant/) – 2014-01-20 06:49:48

+0

以我的情況下,可替代的解決方法是打開的gzip這些文件類型。無論哪種方式,問題都解決了。 – Dingle 2014-03-23 00:28:27

17

可以刪除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/*' – 2014-10-17 11:39:48

+1

不幸的是我得到了如下輸出:'grep:/ var/nginx/cache/*:No這樣的文件或目錄我正在使用Ubuntu 14.04.3 LTS和nginx/1.8.1。任何想法? – webtobesocial 2016-02-06 14:46:37

+0

嘗試以下命令來清理/ var/nginx/cache下的文件:'sudo find/var/nginx/cache -type f -exec grep -l'/css/myedited.css'{} \;' – 2017-10-09 20:56:31

50

除非你通過proxy_cache_path配置緩存區,然後(在一個位置塊例如)使用它,通過: proxy_cache沒有將得到緩存。

如果你沒有,但是,再according to the author of nginx,只需從緩存目錄中刪除所有文件就足夠了。

最簡單的方法:find /path/to/your/cache -type f -delete

+0

這在刪除文件後出現在我的錯誤日誌中:'[crit] 1640#0:unlink()「/ path/to/cache/85/1cc5328db278b328f2c200c65179ad85」failed(2:No such file or directory)' – 2013-06-30 20:23:14

+0

重複或只是一次?它不應該是一個實際的問題。這可能意味着緩存管理器試圖刪除已刪除的文件。如果重複獲取消息,也許重新加載nginx(nginx -s reload)可能會有所幫助。 (不知道這是否也重新初始化了緩存管理器。) – Gnarfoz 2013-07-02 17:50:37

+0

是的,每次部署更改時,我都會通過腳本自動清除我網站的緩存,重新加載nginx也不會修復它。 – 2013-07-02 21:13:54

10

在我的nginx的安裝,我發現我不得不去:

/opt/nginx/cache 

sudo rm -rf * 
在該目錄中

。如果你知道你的nginx安裝路徑並且可以找到緩存目錄,那麼你可以使用它。要非常小心rm -rf命令,如果你是在錯誤的目錄,你可以刪除你的整個硬盤驅動器。

+1

你需要 – 2016-09-21 15:21:24

+0

後重新啓動NGINX這就是壞的部分 – kidz 2017-09-07 20:51:54

13

這個問題有兩個答案。

  • 一個用於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; 
} 
+1

「修改」 keywork工作對我來說韓國社交協會 – Humber 2013-11-20 19:14:52

+0

我想是因爲我遇到類似的問題,這個實現然而,當我作出改變 - !。它顯示了默認Nginx的頁面我使用Niginx如LB與代理,我需要改變,也許根本? – Aaron 2015-09-20 08:41:45

10

我發現這個很有用

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

搜索,如果找到則刪除。

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 /創建,用於存儲緩存內容。

+0

正確的答案。 – jwg 2017-03-27 15:57:47

65

您還可以繞過/再高速緩存中的文件使用

proxy_cache_bypass $http_secret_header; 

,並作爲獎勵,你可以回到這個頭,看看您是否從緩存中得到它的文件的基礎上(將返回「重災區」 )或從內容服務器(將返回'BYPASS')。

add_header X-Cache-Status $upstream_cache_status; 

到期/刷新緩存的文件,使用捲曲或任何其他客戶端做出的緩存頁面的請求。

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

這將返回該項目的新副本,它也將替換緩存中的內容。

+4

爲什麼我只能給予好評這一次?我希望做一個gazill ion :) – Spock 2015-10-28 07:42:02

+2

這隻能在新頁面可緩存時更新緩存頁面。如果您刪除了一個頁面(404或其他錯誤現在由後端提供),則頁面現在發送一個Set-Cookie或一個「Content-Control:private」標頭,緩存的內容將不會「失效」。 – rbu 2016-02-02 10:17:20

+2

這個「add_header X-Cache-Status $ upstream_cache_status;」是一個很酷的功能! – 2017-04-24 05:19:19

0

有一種正確的方法可以僅刪除與任何KEY匹配的緩存文件。例如:

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

這將刪除所有緩存文件,這些文件匹配KEY 「雅虎/ *」,如果在nginx.conf設置:

proxy_cache_key $host$uri; 
1

我的服務器上,Nginx的緩存文件夾在/data/nginx/cache/

所以,我只能刪除它:sudo rm -rf /data/nginx/cache/

希望這將幫助任何人。

4

對於那些誰的其他解決方案不工作,檢查,如果您使用的是DNS服務像CloudFlare。在這種情況下,激活「開發模式」或使用「清除緩存」工具。

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

請注意正確指定正確的路徑。

4

請大家注意,proxy_cache_bypass可以給你傷害的世界,如果你的應用程序不返回,你觸發它特定請求的緩存響應。

例如,如果你的應用程序將與每一個第一次請求一個cookie,然後通過捲曲觸發proxy_pass_bypass腳本可能會得到答案,那個cookie和nginx的將使用該響應刷新緩存項。

0

我正經歷着一種類似的問題:

系統設置和問題: (在VirtualBox的我使用Ubuntu和nginx的Web託管 - PHP網頁刷新並沒有反映對外部CSS文件)。我正在開發Windows機器上的網站,並通過共享文件夾將文件傳輸到nginx。這似乎nginx的不拿起的CSS文件的更改(以任何方式不利於刷新更改CSS文件名,僅僅是工作的事情)

解決方案: 虛擬機上查找共享文件(CSS文件在我的情況)。用nano打開並與Windows共享中的文件進行比較(它們看起來相同)。在VM上使用nano保存共享文件。所有更改現在都反映在瀏覽器中。不知道爲什麼這個工程,但它在我的情況。

更新:重新啓動VM服務器後,問題返回。按照「解決方案」中的說明,css響應再次更新

3

對於那些嘗試刪除nginx緩存文件,並且它沒有工作或間歇性工作的人,請查看您的open_file_cache設置。如果啓用此選項並將其配置爲長時間緩存文件描述符,則Nginx可能仍會看到緩存文件的一個版本,即使您已從磁盤中刪除該文件。我必須將open_file_cache_valid減少到1s(我不確定這是否與完全禁用文件緩存相同)。

0

我也有這個問題。

  • 找不到任何的nginx /緩存文件夾
  • 的sendfile被關

我的網域使用cloudflare.com爲DNS(偉大的服務!)。啊哈!在那裏,它是:

cloudflare.com - >高速緩存 - >清除緩存(我清除一切) 這解決了我的問題!

+0

這清除了Cloudflare的邊緣緩存。它不會在您自己的服務器上清除Nginx緩存。 – mahemoff 2017-06-28 11:24:33

+0

作爲一個建議,我認爲是一個有效的答案。 – 2017-08-20 19:44:21

3

我運行一個非常簡單的bash腳本,完成這項任務需要10秒鐘,並在完成後向我發送郵件。

#!/bin/bash 
sudo service nginx stop 
sudo rm -rf /var/cache/nginx/* 
sudo service nginx start | mail -s "Nginx Purged" [email protected] 
exit 0 
0

我們有一個非常大的nginx緩存(千兆字節),我們需要偶爾擦拭。我已經制定了一個腳本,可以立即清除緩存(就Nginx而言),然後刪除緩存目錄而不會讓磁盤I/O的主應用程序捱餓。

總結:

  1. 移動緩存文件夾到新的位置(在同一文件系統!)(這不會破壞任何打開的文件描述符)
  2. 重建原始的緩存文件夾,空
  3. 刷新的Nginx(優美重裝,其中nginx的老讓工人完成正在進行的請求)
  4. 刪除舊的緩存數據

這裏的腳本,針對Ubuntu的LTS 16.04,與位於/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; 
    } 
}