如何清除nginx的缓存?

时间:2011-06-04 10:04:31

标签: caching nginx

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

我试图重新启动nginx,但没有成功,我已经使用Google搜索,但找不到有效的方法来清除它。

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

我现在该怎么办?

24 个答案:

答案 0 :(得分:174)

我有完全相同的问题 - 我在Virtualbox中运行我的nginx。我没有打开缓存。但sendfile中的on似乎设置为nginx.conf,这导致了问题。 @kolbyjack在评论中提到了它。

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

This is because:

  

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

与此错误相关:https://www.virtualbox.org/ticket/12597

答案 1 :(得分:91)

您还可以使用

按文件绕过/重新缓存文件
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"

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

答案 2 :(得分:55)

除非您通过proxy_cache_path配置了缓存区域然后使用它(例如在位置块中),否则通过: proxy_cache 什么都不会被缓存。

如果你这样做,那么according to the author of nginx,只需从缓存目录中删除所有文件即可。

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

答案 3 :(得分:20)

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

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

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

答案 4 :(得分:14)

这个问题有两个答案。

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

使用:

expires modified +90d;

E.G。:

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

答案 5 :(得分:10)

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

/opt/nginx/cache

sudo rm -rf *

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

答案 6 :(得分:10)

我发现这很有用

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

搜索,如果找到则删除。

答案 7 :(得分:6)

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

答案 8 :(得分:5)

请注意,如果您的应用未针对触发该特定请求的特定请求返回可缓存的响应,则proxy_cache_bypass可能会给您带来伤害。

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

答案 9 :(得分:5)

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

答案 10 :(得分:4)

我也有这个问题。

  • 找不到任何nginx / cache文件夹
  • sendfile已关闭

我的域名使用 cloudflare.com 进行DNS(很棒的服务!)。啊哈!那是:

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

答案 11 :(得分:4)

我们偶尔需要擦除一个非常大的nginx缓存(千兆字节)。我已经找到了一个可以立即清除缓存的脚本(就Nginx而言),然后移除缓存目录而不会使主应用程序因磁盘I / O而匮乏。

总结:

  1. 将缓存文件夹移动到新位置(在同一文件系统上!)(这不会破坏任何打开的文件描述符)
  2. 重新创建原始缓存文件夹,为空
  3. 重新加载Nginx(优雅重新加载,其中nginx允许旧工作人员完成正在进行的请求)
  4. 删除旧的缓存数据
  5. 这是为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;
        }
    }
    

答案 12 :(得分:3)

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

小心正确指定正确的路径。

答案 13 :(得分:3)

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

答案 14 :(得分:2)

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

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

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

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

答案 15 :(得分:1)

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

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

希望这对任何人都有帮助。

答案 16 :(得分:1)

我们使用nginx缓存很多东西。缓存目录中有成千上万的项目。为了找到并删除项目,我们开发了一些脚本来简化此过程。您可以在下面找到此脚本的存储库:

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

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

答案 17 :(得分:0)

有一种正确的方法可以删除与任何KEY匹配的缓存文件。例如:

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

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

proxy_cache_key $host$uri;

答案 18 :(得分:0)

我遇到了类似的问题:

系统设置和问题: (在虚拟机上我使用ubuntu和nginx进行网络托管 - PHP网页刷新并未反映外部css文件的更改)。我在Windows机器上开发网站,并通过共享文件夹将文件传输到nginx。似乎nginx没有接受对css文件的更改(以任何方式刷新都无济于事。更改css文件名只是有用的东西)

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

更新:重新启动VM服务器后,问题又返回了。按照解决方案下的说明,css再次响应更新

答案 19 :(得分:0)

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

    ....
}
...
}

从上面,一个名为&#34; nginx_cache&#34;的文件夹。在/ tmp /中动态创建以存储缓存的内容。

答案 20 :(得分:0)

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

<ul>
  <li><a href="..">Example 1</a></li>
  <li><a href="..">Example 2</a></li>
  <li><a href="..">Example 3</a></li>
</ul>

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

答案 21 :(得分:0)

在我的案例中,touch是Css文件,使其看起来好像资源已更改(实际上touch对文件没有任何作用,除了上次修改时间有所更改),因此浏览器和Nginx将应用最新资源

答案 22 :(得分:0)

好吧,在常见的缓存问题情况下(浏览器缓存,代理缓存,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一样。 :)

答案 23 :(得分:0)

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

我正在使用 Hyper-V 运行 Homestead box,并且我在 nginx 上启动并运行了一个 Laravel 项目。

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

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

在浪费了大量时间查看我的 nginx 配置并尝试使用 PHP artisan 进行搜索后,为我解决了这个问题。

在安装artisan的文件夹[laravel项目的根目录]中运行以下命令: php artisan 优化:清除

此命令清除所有缓存,当我刷新网页时,它最终更新了所有更改。

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

编辑:如果我有 50 个声望,我会将此作为对现有答案之一的评论发布..[到目前为止我只有 43 个]