如何清除nginx的缓存?

我使用nginx作为前端服务器,我已经修改了CSS文件,但nginx仍然服务于旧的。

我尝试重新启动nginx,没有成功,我已经谷歌了,但没有找到一个有效的方法来清除它。

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

我现在该怎么办?

464779 次浏览

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

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

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

除非你通过< >强proxy_cache_path < / >强配置了缓存区,然后使用它(例如在一个位置块中),否则通过: Proxy_cache 不缓存任何东西。

然而,如果你这样做了,那么根据nginx的作者,简单地从缓存目录中删除所有文件就足够了。

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

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

sudo rm -rf /opt/nginx/cache

在那个目录里。如果你知道nginx的安装路径,并且可以找到缓存目录,同样的方法也适用于你。如果你在错误的目录,你可以删除你的整个硬盘驱动器。

我有完全相同的问题-我在Virtualbox中运行我的nginx。我没有打开缓存。但是看起来sendfilenginx.conf中被设置为on,这就是导致问题的原因。@kolbyjack在上面的评论中提到过。

当我关闭sendfile时,它工作正常。

这是因为:

Sendfile用于“在一个文件描述符和另一个文件描述符之间复制数据”,显然在虚拟机环境中运行时存在一些实际问题,或者至少在通过Virtualbox运行时。在nginx中关闭这个配置会导致静态文件通过不同的方法被服务,你的更改会立即毫无疑问地反映出来

它与这个错误有关:https://www.virtualbox.org/ticket/12597

这个问题有两个答案。

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

使用:

expires modified +90d;

例如:

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

我发现这很有用

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

搜索,如果找到就删除。

你可以在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;


....
}
...
}

在上面,在/tmp/中动态创建了一个名为“nginx_cache”的文件夹来存储缓存的内容。

您还可以在一个文件的基础上使用

proxy_cache_bypass $http_secret_header;

作为奖励,你可以返回这个头,看看你从缓存(将返回'HIT')或从内容服务器(将返回'BYPASS')得到它。

add_header X-Cache-Status $upstream_cache_status;

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

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

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

有一个正确的方法只删除缓存文件,它匹配任何KEY。例如:

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

如果在nginx.conf中设置了KEY "yahoo/*",则删除所有与之匹配的缓存文件:

proxy_cache_key $host$uri;

在我的服务器上,nginx缓存文件夹位于/data/nginx/cache/

所以我只删除了它:sudo rm -rf /data/nginx/cache/

希望这对大家有所帮助。

对于那些其他解决方案不工作,检查你是否使用像CloudFlare的DNS服务。在这种情况下,激活“开发模式”或使用“清除缓存”工具。

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

注意正确指定正确的路径。

请注意,如果你的应用程序没有为你触发的特定请求返回一个可缓存的响应,proxy_cache_bypass会给你带来很大的伤害。

例如,如果你的应用程序在每个第一个请求时都发送一个cookie,那么通过curl触发proxy_pass_bypass的脚本可能会在应答中获得这个cookie, nginx将使用该响应来刷新缓存项。

我也遇到过类似的问题:

系统设置和问题: (在virtualbox上,我使用ubuntu和nginx - PHP网页刷新没有反映到外部css文件的更改)。我正在windows机器上开发网站,并通过共享文件夹将文件传输到nginx。nginx似乎没有接收css文件的更改(以任何方式刷新都没有帮助。改变css文件名是唯一的事情,工作)

<强>解决方案: 在VM上找到共享文件(在我的情况下是css文件)。用nano打开并与windows共享中的文件进行比较(它们看起来是相同的)。在VM上使用nano保存共享文件。所有更改现在都反映在浏览器中。不知道为什么这是有效的,但它在我的情况下

更新:重启虚拟机服务器后,问题返回。遵循解决方案下的说明使css再次响应更新

对于那些尝试删除nginx缓存文件的人,如果它没有工作或工作断断续续,请查看您的open_file_cache设置。如果启用并配置为长时间缓存文件描述符,那么Nginx仍然可以看到缓存文件的一个版本,即使你已经从磁盘上删除了它。我不得不将open_file_cache_valid减少到1s(我不确定这在本质上是否与完全禁用文件缓存相同)。

我也有这个问题。

  • 找不到nginx/cache文件夹
  • 发送文件已关闭

我的域使用cloudflare.com作为DNS(很棒的服务!)啊哈!就是这样:

>缓存->清除缓存(我清除了一切) 这解决了我的问题!< / p >

我运行了一个非常简单的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

我们有一个非常大的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;
}
}

如果你想清除特定文件的缓存,那么你可以使用proxy_cache_bypass指令。这就是你要做的

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

现在如果你想绕过缓存,你可以通过传递nocache参数来访问文件

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

在我的例子中,它是在/etc/php/7.2/fpm/php.ini (Ubuntu)中启用的opcache:

opcache.enable=1

将其设置为0使服务器加载(php)文件的最新版本。

我们使用nginx缓存很多东西。缓存目录中有成千上万的项。为了查找并删除项目,我们开发了一些脚本来简化这个过程。你可以在下面找到包含这些脚本的代码库的链接:

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

这个想法很简单。创建缓存的索引(包含缓存键和相应的缓存文件),并在该索引文件中进行搜索。它确实帮助我们加快了查找项目的速度(从几分钟到亚秒),并相应地删除它们。

在我的例子中,touch那个Css文件,使它看起来像是资源改变了(实际上touch对文件没有做任何事情,除了改变上次修改时间),所以浏览器和nginx将应用最新的资源

好吧,在常见的缓存问题的情况下(浏览器缓存,代理缓存,web服务器缓存),你可以使用常见的缓存问题的决定,如CSS或JS文件的很少变化的内容-通过添加一个URI参数到他们的链接:

不是<link rel="stylesheet" type="text/css" href="https://example.com/stacks.css">

<link rel="stylesheet" type="text/css" href="https://example.com/stacks.css?v=3b16a418cc4c">

就像StackOverflow一样。:)

已经有很多答案了,但我认为我有一个有用的补充;

我正在用Hyper-V运行一个Homestead盒子,我有一个laravel项目,并在nginx上运行。

我在/etc/的nginx文件夹中没有缓存

当我访问我的网站时,我得到了服务器旧视图和css文件。

什么解决了它为我搜索浪费了很多时间看我的nginx配置和尝试的东西是使用PHP工匠。

在artisan安装的文件夹[laravel项目的根目录]中执行如下命令: PHP工匠优化:清除

这个命令清除所有的缓存,当我刷新我的网页,最终它更新了所有的变化。

希望这能帮助像我这样受困的灵魂:)

编辑:如果我有50个名声,我会把这条评论贴在一个已经存在的答案上。[到目前为止我只有43个]

这个回答主要是一个总结:

< p > Expires, Age, Cache-Control are HTTP concepts
检查这些链接:

nginx settings相同,检查下面的链接:

对于not cache,下面可能有帮助:(可以设置更少的时间让缓存更快地重新验证):

expires    0;
add_header Cache-Control private;

clear cache:
. 删除缓存目录(/var/nginx/cache/)
下的文件 . 重新加载(不是重新启动)nginx - nginx -s reload
看到https://forum.nginx.org/read.php?2,2600,2602 < / p >