【问题标题】:How to clear the cache of nginx?如何清除nginx的缓存?
【发布时间】:2025-12-24 20:05:10
【问题描述】:

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

我尝试重新启动 nginx,但没有成功,我搜索了谷歌,但没有找到清除它的有效方法。

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

我现在该怎么办?

【问题讨论】:

  • 有关您的 Nginx 配置的更多详细信息将有很大帮助。你在使用proxy_cache 吗?
  • 没有,我只是使用默认配置,我搜索了关于字符串cache,在配置文件中没有找到它
  • Nginx 默认不缓存。
  • 您是否在 virtualbox/vargant vm 中运行?如果是这样,请尝试关闭 sendfile,因为它们不能很好地配合使用。
  • 那么你确定缓存在 nginx 端吗?您是否使用 curl 之类的工具验证了该行为?很多时候,这样的问题只是客户端缓存没有请求更新的资源,因为它被告知旧资源将通过 expires max 长时间有效;或类似的东西。

标签: css nginx caching server nginx-cache


【解决方案1】:

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

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

This is because:

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

和这个bug有关:https://www.virtualbox.org/ticket/12597

【讨论】:

  • 参考这个link
  • 就我而言,另一种解决方法是为这些文件类型打开 gzip。不管怎样,问题都解决了。
  • 我使用了以下'sudo vim /etc/nginx/nginx.conf'并将'sendfile on'更改为'sendfile off'
  • 这是我在任何地方都能找到的唯一解决方案,但我实际上需要使用sendfile 所以无法禁用它:(
  • 我关闭了 sendfile。没有运气。
【解决方案2】:

您还可以使用

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

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

【讨论】:

  • 为什么我只能投票一次?我想做一个巨大的:)
  • 这只能在新页面也可缓存时更新缓存页面。如果您删除了一个页面(404 或其他错误现在由后端提供),该页面现在发送一个 Set-Cookie 或“Content-Control: private”标头,缓存的内容将不会“无效”。跨度>
  • 这个“add_header X-Cache-Status $upstream_cache_status;”真是一个很酷的功能!
  • 非常感谢。缓存失效的好技巧,关于 nginx 的教程太少了
  • 自您发布以来,这是否发生了变化?我可以使用“secret-header”成功获得一个新副本,但是一旦我删除标题,我就会再次获得缓存版本...
【解决方案3】:

除非你通过proxy_cache_path 配置了一个缓存区然后使用它(例如在一个位置块中),通过: proxy_cache 不会缓存任何内容。

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

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

【讨论】:

  • 删除文件后,我的错误日志中出现了这个:[crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)
  • 多次,还是一次?这不应该是一个实际问题。这可能只是意味着缓存管理器试图删除您已经删除的文件。如果您反复收到消息,也许重新加载 nginx (nginx -s reload) 可能会有所帮助。 (不确定这是否也会重新初始化缓存管理器。)
  • 是的,每当我部署更改时,我都会通过脚本自动清除我网站的缓存,并且重新加载 nginx 也无法修复它。
  • 这听起来很模糊。你能详细说明一下吗?似乎与这里的主题无关。
  • 在 nginx conf 文件中搜索 proxy_cache_path 以找到缓存的路径,例如 grep -r proxy_cache_path /etc/nginx/ 我在 /etc/nginx/conf.d/proxy_cache.conf 中设置为 /var/lib/nginx/proxy
【解决方案4】:

你可以删除nginx的缓存目录或者你可以搜索特定文件:

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

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

【讨论】:

  • 要获得准确的命中,您可以将 $ 附加到搜索词。喜欢grep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
  • 不幸的是,我得到了以下输出grep: /var/nginx/cache/*: No such file or directory 我使用的是 Ubuntu 14.04.3 LTS 和 nginx/1.8.1。有什么想法吗?
  • 尝试下面的grep文件在/var/nginx/cache下:sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
  • 我相信是 /var/cache/nginx/* (路径中 nginx 之前的目录缓存)
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    这个问题有两个答案。

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

    用途:

    expires modified +90d;
    

    例如:

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

    【讨论】:

    • 我尝试了这个实现,因为我遇到了类似的问题。但是,在我进行更改后 - 它显示了默认的 Nginx 页面。我正在使用 Niginx 作为 LB 代理,是否需要更改 root?
    【解决方案7】:

    我也有这个问题。

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

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

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

    【讨论】:

    • 这会清除 Cloudflare 的边缘缓存。它不会清除您自己服务器上的 Nginx 缓存。
    • 作为一个建议,我认为是一个有效的答案。
    • 这是一个很好的答案。我一直在研究为什么某些文件仍在缓存中,并且无法猜测这是 CloudFlare 的“错误”。谢谢!
    【解决方案8】:

    我觉得这很有用

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

    搜索,如果找到则删除。

    【讨论】:

      【解决方案9】:

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

      sudo rm -rf /opt/nginx/cache
      

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

      【讨论】:

      • 之后需要重启NGINX
      • 这是不好的部分
      【解决方案10】:

      我们有一个非常大的 nginx 缓存(千兆字节),我们偶尔需要擦除它。我已经制定了一个脚本,它可以立即清除缓存(就 Nginx 而言),然后删除缓存目录,而不会使主应用程序无法获得磁盘 I/O。

      总结:

      1. 将缓存文件夹移动到新位置(在同一个文件系统上!)(这不会破坏任何打开的文件描述符)
      2. 重新创建原始缓存文件夹,为空
      3. 重新加载 Nginx(graceful 重新加载,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;
          }
      }
      

      【讨论】:

        【解决方案11】:

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

        【讨论】:

          【解决方案12】:

          请注意,如果您的应用没有针对您触发它的特定请求返回可缓存的响应,proxy_cache_bypass 会给您带来极大的伤害。

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

          【讨论】:

            【解决方案13】:

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

            【讨论】:

              【解决方案14】:

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

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

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

              【讨论】:

                【解决方案15】:
                find /etc/nginx/cache_folder -type d -exec rm -rvf {} \;
                mkdir /etc/nginx/cache_folder
                service nginx restart
                

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

                【讨论】:

                  【解决方案16】:

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

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

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

                  proxy_cache_key $host$uri;
                  

                  【讨论】:

                    【解决方案17】:

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

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

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

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

                    【讨论】:

                    • 我猜这可能被用来攻击和消耗您网站的带宽。
                    • 这不是简单地绕过当前请求的缓存(app.css?nocache=true),而原始文件(没有查询)保留在缓存中(app.css)?
                    【解决方案18】:

                    您可以像下面这样在 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”的文件夹,用于存放缓存的内容。

                    【讨论】:

                      【解决方案19】:

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

                      【讨论】:

                        【解决方案20】:

                        好吧,在常见的缓存问题情况下(浏览器缓存、代理缓存、网络服务器缓存),您可以使用常见的已知缓存问题决策来解决 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">

                        就像 * 一样。 :)

                        【讨论】:

                          【解决方案21】:

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

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

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

                          【讨论】:

                            【解决方案22】:

                            我遇到了类似的问题:

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

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

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

                            【讨论】:

                              【解决方案23】:

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

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

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

                              当我访问我的网站时,我正在获取服务器旧视图和 css 文件。

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

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

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

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

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

                              【讨论】:

                              • 这实际上与问题所涉及的nginx缓存有关吗?
                              • 与nginx无关,但我认为我的问题是,我最终到了这里。由于已经有很多关于 nginx 的答案,我希望能帮助那些没有意识到这是一个宅基地/laravel 问题(比如我)并最终被困在这里的人。基本上,如果其他人会回答我写的内容,那会为我节省很多时间。所以这就是我花时间回复的原因。但如果我的意见不受欢迎,我会删除我的帖子。。
                              【解决方案24】:

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

                              opcache.enable=1
                              

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

                              【讨论】:

                              • 您的回答可能会有所帮助,但如果是这样,它需要更多详细信息,以及发生了什么以及为什么对您有帮助。