285

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

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

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

我现在该怎么办?

4

24 回答 24

194

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

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

这是因为:

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

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

于 2012-10-29T06:21:23.293 回答
134

您还可以使用逐个文件绕过/重新缓存

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"

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

于 2014-05-21T04:58:27.233 回答
67

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

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

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

于 2011-08-01T10:07:57.323 回答
22

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

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

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

于 2011-07-14T10:23:49.393 回答
17

我运行了一个非常简单的 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
于 2017-03-24T13:21:00.370 回答
15

这个问题有两个答案。

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

采用:

expires modified +90d;

例如:

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}
于 2012-12-06T18:11:17.763 回答
13

我也有这个问题。

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

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

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

于 2017-01-19T09:39:24.107 回答
11

我发现这很有用

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

搜索,如果找到则删除。

于 2013-10-19T22:35:26.767 回答
10

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

sudo rm -rf /opt/nginx/cache

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

于 2012-02-03T04:50:21.170 回答
8

我们有一个非常大的 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;
    }
}
于 2017-12-07T22:57:57.307 回答
5

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

于 2015-09-18T07:07:32.650 回答
5

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

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

于 2016-02-02T10:17:07.567 回答
4

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

于 2016-05-18T02:00:46.603 回答
3

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

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

希望这会帮助任何人。

于 2015-05-13T01:47:24.573 回答
3
find /etc/nginx/cache_folder -type d -exec rm -rvf {} \;
mkdir /etc/nginx/cache_folder
service nginx restart

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

于 2016-01-03T14:27:43.393 回答
2

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

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

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

proxy_cache_key $host$uri;
于 2015-02-24T19:21:15.813 回答
2

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

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

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

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

于 2018-11-19T16:48:39.017 回答
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;

    ....
}
...
}

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

于 2014-04-07T03:53:22.527 回答
1

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

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

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

于 2019-10-01T19:38:33.530 回答
1

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

于 2019-11-08T06:48:07.963 回答
1

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

于 2020-11-10T20:56:57.783 回答
0

我遇到了类似的问题:

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

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

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

于 2016-05-16T15:09:52.337 回答
0

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

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

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

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

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

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

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

希望这有助于像我这样被困的灵魂:)

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

于 2021-01-28T14:22:34.473 回答
-2

就我而言,它是 /etc/php/7.2/fpm/php.ini (Ubuntu) 中启用的 opcache:

opcache.enable=1

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

于 2019-05-13T10:18:08.350 回答