我使用nginx作为前端服务器,我修改了CSS文件,但是nginx仍在服务旧文件。
我试图重新启动nginx,但没有成功,我已经使用Google搜索,但找不到有效的方法来清除它。
有些文章说我们可以删除缓存目录:var/cache/nginx
,但我的服务器上没有这样的目录。
我现在该怎么办?
答案 0 :(得分:174)
我有完全相同的问题 - 我在Virtualbox中运行我的nginx。我没有打开缓存。但sendfile
中的on
似乎设置为nginx.conf
,这导致了问题。 @kolbyjack在评论中提到了它。
当我关闭sendfile
时 - 它工作正常。
Sendfile用于“在一个文件描述符和另一个文件描述符之间复制数据”,并且在虚拟机环境中运行时显然有一些真正的麻烦,或者至少在通过Virtualbox运行时。在nginx中关闭此配置会导致静态文件通过不同的方法提供,您的更改将立即反映出来并且毫无疑问
答案 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)
这个问题有两个答案。
使用:
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)
我也有这个问题。
我的域名使用 cloudflare.com 进行DNS(很棒的服务!)。啊哈!那是:
cloudflare.com - >缓存 - >清除缓存(我清除了所有内容) 这解决了我的问题!
答案 11 :(得分:4)
我们偶尔需要擦除一个非常大的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;
}
}
答案 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 个]