我使用 nginx 作为前端服务器,我已经修改了 CSS 文件,但 nginx 仍然服务于旧的。
我试图重新启动 nginx,但没有成功,我用谷歌搜索,但没有找到清除它的有效方法。
有些文章说我们可以直接删除缓存目录:var/cache/nginx
,但是我的服务器上没有这样的目录。
我现在该怎么办?
我使用 nginx 作为前端服务器,我已经修改了 CSS 文件,但 nginx 仍然服务于旧的。
我试图重新启动 nginx,但没有成功,我用谷歌搜索,但没有找到清除它的有效方法。
有些文章说我们可以直接删除缓存目录:var/cache/nginx
,但是我的服务器上没有这样的目录。
我现在该怎么办?
我遇到了完全相同的问题 - 我在 Virtualbox 中运行我的 nginx。我没有打开缓存。但看起来像是sendfile
设置on
在nginx.conf
里面,这就是导致问题的原因。@kolbyjack 在上面的评论中提到了它。
当我关闭时sendfile
- 它工作正常。
Sendfile 用于“在一个文件描述符和另一个文件描述符之间复制数据”,并且在虚拟机环境中运行时,或者至少在通过 Virtualbox 运行时显然存在一些真正的问题。在 nginx 中关闭此配置会导致静态文件通过不同的方法提供服务,您的更改将立即毫无疑问地反映
您还可以使用逐个文件绕过/重新缓存
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"
这将返回该项目的新副本,并且还将替换缓存中的内容。
除非您通过proxy_cache_path配置了缓存区域然后使用它(例如在位置块中),否则通过: proxy_cache不会缓存任何内容。
但是,如果您这样做了,那么根据 nginx 的作者的说法,只需从缓存目录中删除所有文件就足够了。
最简单的方法:find /path/to/your/cache -type f -delete
您可以删除 nginx 的缓存目录,也可以搜索特定文件:
grep -lr 'http://mydomain.pl/css/myedited.css' /var/nginx/cache/*
并且只删除一个文件让nginx刷新它们。
我运行了一个非常简单的 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
这个问题有两个答案。
采用:
expires modified +90d;
例如:
location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
access_log off;
root /path/to/htdocs;
expires modified +90d;
}
我也有这个问题。
我的域使用cloudflare.com作为 DNS(很棒的服务!)。啊哈!那里是:
cloudflare.com -> 缓存 -> 清除缓存(我清除了所有内容)这解决了我的问题!
我发现这很有用
grep -lr 'jquery.js' /path/to/nginx/cache/folder/* | xargs rm
搜索,如果找到则删除。
在我的 nginx 安装中,我发现我必须去:
sudo rm -rf /opt/nginx/cache
在那个目录中。如果您知道 nginx 安装的路径并且可以找到缓存目录,那么它可能对您有用。使用该命令要非常小心rm -rf
,如果您在错误的目录中,您可能会删除整个硬盘驱动器。
我们有一个非常大的 nginx 缓存(千兆字节),我们偶尔需要擦除它。我已经制定了一个脚本,它可以立即清除缓存(就 Nginx 而言),然后删除缓存目录,而不会让主应用程序无法获得磁盘 I/O。
总之:
这是针对 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;
}
}
对于其他解决方案不起作用的人,请检查您是否使用了CloudFlare 之类的 DNS 服务。在这种情况下,激活“开发模式”或使用“清除缓存”工具。
请注意,如果您的应用程序没有针对您触发它的特定请求返回可缓存的响应,proxy_cache_bypass 会给您带来伤害。
例如,如果您的应用程序在每个第一个请求中都发送一个 cookie,那么通过 curl 触发 proxy_pass_bypass 的脚本可能会在答案中获取该 cookie,并且 nginx不会使用该响应来刷新缓存的项目。
对于那些尝试删除 nginx 缓存文件,但它没有工作或间歇性工作的人,请查看您的 open_file_cache 设置。如果启用并配置为长时间缓存文件描述符,则 Nginx 可能仍会看到缓存文件的版本,即使您已将其从磁盘中删除。我不得不将 open_file_cache_valid 减少到 1s(我不确定这是否与完全禁用文件缓存基本相同)。
在我的服务器上,nginx 缓存文件夹位于/data/nginx/cache/
所以我只删除了它:sudo rm -rf /data/nginx/cache/
希望这会帮助任何人。
find /etc/nginx/cache_folder -type d -exec rm -rvf {} \;
mkdir /etc/nginx/cache_folder
service nginx restart
注意正确指定正确的路径。
有一种正确的方法可以仅删除与任何 KEY 匹配的缓存文件。例如:
grep -lr 'KEY: yahoo' /var/lib/nginx/cache | xargs rm -rf
如果在 nginx.conf 中设置了,这将删除所有与 KEY "yahoo/*" 匹配的缓存文件:
proxy_cache_key $host$uri;
如果要清除特定文件的缓存,则可以使用该proxy_cache_bypass
指令。这就是你的做法
location / {
proxy_cache_bypass $cookie_nocache $arg_nocache;
# ...
}
现在,如果您想绕过缓存,您可以通过传递 nocache 参数来访问文件
http://www.example.com/app.css?nocache=true
您可以在 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”的文件夹来存储缓存的内容。
我们使用 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 一样。:)
我遇到了类似的问题:
系统设置和问题:( 在虚拟机上,我使用 ubuntu 和 nginx 进行网络托管 - PHP 网页刷新未反映对外部 css 文件的更改)。我正在 Windows 机器上开发网站并通过共享文件夹将文件传输到 nginx。似乎 nginx 没有接受对 css 文件的更改(以任何方式刷新都无济于事。更改 css 文件名是唯一有效的方法)
解决方案: 在 VM 上找到共享文件(在我的情况下为 css 文件)。使用 nano 打开并与 Windows 共享中的文件进行比较(它们看起来相同)。在 VM 上使用 nano 保存共享文件。所有更改现在都反映在浏览器中。不知道为什么会这样,但在我的情况下确实如此。
更新:重新启动 VM 服务器后,问题又回来了。按照解决方案下的说明使 css 再次响应更新
那里已经有很多答案,但我认为我有一个有用的补充;
我正在使用 Hyper-V 运行 Homestead 盒子,并且我在 nginx 上启动并运行了一个 laravel 项目。
我在 /etc/ 的 nginx 文件夹中没有缓存
当我访问我的网站时,我正在获取服务器旧视图和 css 文件。
在浪费了大量时间查看我的 nginx 配置并尝试使用 PHP artisan 之后,为我解决了这个问题。
在安装 artisan 的文件夹 [laravel 项目的根目录] 中运行以下命令: php artisan optimize:clear
此命令清除所有缓存,当我刷新我的网页时,最后它更新了所有更改。
希望这有助于像我这样被困的灵魂:)
编辑:如果我有 50 名声望,我会将其作为对现有答案之一的评论发布。[到目前为止我只有 43 名]
就我而言,它是 /etc/php/7.2/fpm/php.ini (Ubuntu) 中启用的 opcache:
opcache.enable=1
将其设置为 0 会使服务器加载最新版本的 (php) 文件。