server {
server_name static.server.local;
root /var/www/static;
## Default location
location / {
access_log off;
expires 0;
add_header Cache-Control private;
}
}
当我们访问HTML文件(http://static.server.local/test.html)时,没问题:只要文件未更改,服务器将返回代码304 Not Modified,并且文件更改后返回200 OK响应。
在Java脚本或Java脚本中,其行为似乎有所不同一个CSS文件。更改文件后,我们会收到预期的200 OK响应,但带有旧文本。
Nginx中是否有内部缓存机制可以解释这种现象?还是我们应该添加的一些配置?
作为旁注,以下是修改文件时Nginx返回的标头(似乎正确):
Accept-Ranges:bytes
Cache-Control:max-age=0
private
Connection:keep-alive
Content-Length:309
Content-Type:text/css
Date:Fri, 13 May 2011 14:13:13 GMT
Expires:Fri, 13 May 2011 14:13:13 GMT
Last-Modified:Fri, 13 May 2011 14:13:05 GMT
Server:nginx/0.8.54
编辑
尝试使用
expires
伪指令和Cache-Control
标头设置不同的设置后,我进行了进一步的研究。实际上,服务器已安装在VirtualBox来宾Ubuntu上,并且从Mac OSX主机上的共享文件夹读取数据。如果从主机上的IDE(NetBeans)编辑文件,不会出现更改,但是如果我直接在guest虚拟机上(使用VIM)对其进行编辑,则会刷新。
奇怪的是,它与HTML文件的行为不同。
令人费解。
>
编辑2(ANSWER)
确实,问题的根源更多在VirtualBox方面。或者说VirtualBox与服务器的“ sendfile”选项之间存在冲突。
VirtualBox讨厌Sendfile的链接给了我解决方案:将服务器配置中的sendfile标志切换为off:
sendfile off;
希望这也可以帮助其他使用VirtualBox进行开发的人。 :)
VirtualBox论坛上还有一些其他信息。
#1 楼
由于答案以某种方式隐藏在问题中-这是VirtualBox环境中Nginx作为独立答案的解决方案。文件将sendfile
参数更改为off
:sendfile off;
虽然
sendfile
是Nginx声誉的核心(快速的低级静态文件服务效率),但这可能是损害当地发展,例如经常更改且需要重新加载的Javascript。尽管如此,Nginx sendfile很聪明,可能不是大多数人的问题。同时检查您浏览器的“禁用缓存”选项!评论
+1尽管答案应该说明为什么这样做是必要的,而不是有效地让读者去查找/重新阅读问题以寻找参考。让答案独立存在->更好。
– AD7six
2014年11月19日在10:00
这似乎是我的答案。该问题似乎是由Sendfile,VirtualBox和OSX主机的特定组合引起的。 abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile forums.virtualbox.org/viewtopic.php?f=1&t=24905
–史蒂夫·贝内特(Steve Bennett)
15年2月28日在23:34
sendfile对于本地开发环境也很好;它只是其中损坏的VirtualBox。这是(其中许多)我建议避免使用VirtualBox的原因之一。
–迈克尔·汉普顿
17年1月1日在6:56
感谢Vagrant / VirtualBox / Ubuntu / Wordpress的保存,奇怪问题,我猜我的PROD环境默认为sendfile时是安全的。
–sonjz
17年3月31日19:46
用nginx和docker解决我的问题
– PascalTurbo
17年9月7日在18:03
#2 楼
将您的expires标记设置为expires off;
,它根本不应该设置任何expires标头,也可能是您的浏览器错误地缓存了文件
评论
不幸的是,我已经尝试过该方法以及使-1过期,并且行为仍然相同。
–奥利维尔·查佩
2011年5月13日15:06
关于浏览器,我已经想到了这种可能性:我首先尝试使用Chrome,并在修改文件后首次在Firefox中打开它:我仍然获得该文件的第一个版本。
–奥利维尔·查佩
2011年5月13日在15:08
缓存控制标头也应该是CACHE-CONTROL:NO-CACHE
–anthonysomerset
2011年5月13日15:11
或完全删除缓存控制标头-很抱歉,无法编辑以前的评论
–anthonysomerset
11年5月13日在15:17
在Windows上,“过期”仍然不会禁用html文件的缓存。当我在IDE中更新文件时,超级沮丧,但是!$#%ing nginx提供了旧版本。
– Dan Dascalescu
2014年10月31日在2:59
#3 楼
这已经很晚了,但是仍然标记为未答复,因此我将采取行动。只是为了咯咯笑,您是否尝试过:location ~* \.(css|js)$ {
expires 0;
break;
}
我自己还没有尝试过,但是已经学会了不时在服务器容器中使用Nginx进行这种尝试。我遇到与此类似的问题的时候...
#4 楼
如果上面提到的方法无济于事,但Nginx仍然返回文件的旧内容,则可能是与open_file_cache
有关的问题。作为参考:
http:// nginx.org/en/docs/http/ngx_http_core_module.html#open_file_cache
https://rtcamp.com/tutorials/nginx/open-file-cache/
#5 楼
这是VirtualBox中的旧错误(请参阅:#819,#9069,#12597,#14920),其中vboxvfs似乎对映射的文件的映射访问存在一些问题。当您编辑VM外部的文件,并且希望在VM内看到相同的更改。
要变通解决此问题,您需要通过禁用
EnableSendfile
选项来禁用内核sendfile支持以将文件传送到客户端。这对于NFS或SMB挂载的文件尤其麻烦。对于
Nginx
(在nginx.conf
中进行更改),例如sendfile off;
httpd.conf
或在vhosts文件中),例如<Directory "/path-to-nfs-files">
EnableSendfile Off
</Directory>
更改后重新加载Apache。
其他可能的解决方案只是记住不要在主机上编辑文件,或尝试重新编辑同一文件,但不要在VM中。
另一种解决方法包括删除Linux页面缓存,例如
echo 1 > /proc/sys/vm/drop_caches
或每秒清除缓存(如本文所述) ),请尝试:
watch -n 1 $(sync; echo 1 > /proc/sys/vm/drop_caches)
注意:数字1表示释放页面缓存,数字2表示牙科和inode,3表示页面缓存,牙科和inode。
以上问题可以通过以下mmap-test程序复制,请参阅:
mmap-problem.c
。
评论
您是否在无所事事的虚拟机中运行nginx并使用共享的fs?在#nginx中有几种使用该组合的症状报告。我真的可以拥抱你!已经花费了48个小时进行诅咒,并对这个确切的问题完全发狂..,重新编译了nginx几次,将一些蓬松的小动物献给了各种神灵,向后学习了高速缓存指令...所有这些都发现修复这一行很奇怪感谢VirtualBox怪异!
如果您将答案发布为答案并接受它,这样每个人都可以看到此问题已解决,那就更加清楚了。
今天早上我被这个虫子击中了。没有这个,就不会意识到它属于共享文件夹。谢谢!
谢谢!据我了解,目前没有其他方法可以修复此错误?如果需要启用sendfile怎么办?:-)