如何清除nginx的缓存?

Fre*_*ind 230 caching nginx

我使用nginx作为前端服务器,我修改了CSS文件,但是nginx仍在服务旧的.

我试图重新启动nginx,没有成功,我有谷歌搜索,但没有找到一个有效的方法来清除它.

有些文章说我们可以删除缓存目录:var/cache/nginx但是我的服务器上没有这样的目录.

我现在应该怎么做?

Dee*_*thy 178

我有完全相同的问题 - 我在Virtualbox中运行我的nginx.我没有打开缓存.但看起来像是sendfile设置onnginx.conf,这导致了问题.@kolbyjack在评论中提到了它.

当我关闭sendfile- 它工作正常.

这是因为:

Sendfile用于"在一个文件描述符和另一个文件描述符之间复制数据",并且在虚拟机环境中运行时显然有一些真正的麻烦,或者至少在通过Virtualbox运行时.在nginx中关闭此配置会导致静态文件通过不同的方法提供,您的更改将立即反映出来并毫无疑问

  • 按照广告的方式工作,但是关于sendfile目的的链接和一些信息将比个人帐户更受欢迎.将此从日记条目更改为事实答案并获得我的投票. (20认同)
  • 我关掉了sendfile.没运气. (10认同)
  • 请参阅[link](http://jeremyfelt.com/code/2013/01/08/clear-nginx-cache-in-vagrant/) (6认同)
  • 我使用了以下'sudo vim /etc/nginx/nginx.conf'并将'sendfile on'更改为'sendfile off' (2认同)

Jas*_*ner 98

您还可以使用基于文件的文件绕过/重新缓存

proxy_cache_bypass $http_secret_header;
Run Code Online (Sandbox Code Playgroud)

作为奖励,您可以返回此标题以查看是否从缓存中获取(将返回'HIT')或从内容服务器(将返回'BYPASS').

add_header X-Cache-Status $upstream_cache_status;
Run Code Online (Sandbox Code Playgroud)

要使缓存文件过期/刷新,请使用curl或任何其他客户端向缓存页面发出请求.

curl http://abcdomain.com/mypage.html -s -I -H "secret-header:true"
Run Code Online (Sandbox Code Playgroud)

这将返回项目的新副本,它也将替换缓存中的内容.

  • 为什么我一次只能投票?我想做一个gazillion :) (4认同)
  • 这个"add_header X-Cache-Status $ upstream_cache_status;" 是一个很酷的功能! (3认同)
  • 自您发布以来,这有变化吗?我可以成功获得带有"secret-header"的新副本,但是一旦我删除了标题,我就会再次获得缓存版本... (3认同)
  • 这只能在新页面可缓存时更新缓存页面.如果您已删除页面(404或其他错误现在由后端提供),则页面现在发送Set-Cookie或"Content-Control:private"标头,缓存的内容将不会"无效". (2认同)

Gna*_*foz 59

除非您通过proxy_cache_path配置了缓存区域然后使用它(例如在位置块中),否则通过: proxy_cache将不会缓存任何内容.

但是,如果你这样做了,那么根据nginx的作者,只需从缓存目录中删除所有文件就足够了.

最简单的方法: find /path/to/your/cache -type f -delete


小智 20

您可以删除nginx的缓存目录,也可以搜索特定文件:

grep -lr 'http://mydomain.pl/css/myedited.css' /var/nginx/cache/*
Run Code Online (Sandbox Code Playgroud)

并且只删除一个文件到nginx刷新它们.


小智 15

这个问题有两个答案.

  • 一个用于nginx作为反向缓存
  • 另一个用于通过标头输入清理浏览器缓存(这个)

使用:

expires modified +90d;
Run Code Online (Sandbox Code Playgroud)

例如:

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


小智 10

我发现这很有用

grep -lr 'jquery.js' /path/to/nginx/cache/folder/* | xargs rm
Run Code Online (Sandbox Code Playgroud)

搜索,如果找到则删除.


Gan*_*kar 9

在我的nginx安装中,我发现我必须去:

/opt/nginx/cache
Run Code Online (Sandbox Code Playgroud)

sudo rm -rf *
Run Code Online (Sandbox Code Playgroud)

在那个目录中.如果您知道nginx安装的路径并且可以找到缓存目录,则可能对您有用.请小心使用该rm -rf命令,如果您在错误的目录中,则可以删除整个硬盘.

  • 之后你需要重新启动NGINX (2认同)

Asl*_*sle 7

我也有这个问题。

  • 找不到任何Nginx /缓存文件夹
  • sendfile已关闭

我的域使用cloudflare.com进行DNS(优质服务!)。啊哈!在那里:

cloudflare.com->缓存->清除缓存(我清除了所有内容)解决了我的问题!

  • 这是一个很好的答案。我花了几个小时研究为什么有些文件仍然被缓存,但无法猜测这是 CloudFlare 的“故障”。谢谢! (3认同)
  • 这将清除Cloudflare的边缘缓存。它不会清除您自己服务器上的Nginx缓存。 (2认同)

Mit*_*llK 7

我运行一个非常简单的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
Run Code Online (Sandbox Code Playgroud)


Dav*_*Eyk 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
Run Code Online (Sandbox Code Playgroud)

如果有帮助,请使用以下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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Leo*_*zyk 5

对于其他解决方案无效的用户,请检查您是否使用了CloudFlare等DNS服务.在这种情况下,激活"开发模式"或使用"清除缓存"工具.


dwt*_*dwt 5

请注意,如果您的应用未在触发该请求的特定请求中返回可缓存的响应,则proxy_cache_bypass可能会给您造成很大的伤害。

例如,如果您的应用程序在每个第一个请求中发送一个cookie,那么一个通过curl触发proxy_pass_bypass的脚本可能会在响应中获取该cookie,而nginx 不会使用该响应来刷新缓存的项目。