我们正在使用Nginx在开发平台上提供静态文件。由于它是一个开发平台,我们希望禁用缓存,以便将每个更改都传播到服务器。 VHost的配置非常简单:

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论坛上还有一些其他信息。

评论

您是否在无所事事的虚拟机中运行nginx并使用共享的fs?在#nginx中有几种使用该组合的症状报告。

我真的可以拥抱你!已经花费了48个小时进行诅咒,并对这个确切的问题完全发狂..,重新编译了nginx几次,将一些蓬松的小动物献给了各种神灵,向后学习了高速缓存指令...所有这些都发现修复这一行很奇怪感谢VirtualBox怪异!

如果您将答案发布为答案并接受它,这样每个人都可以看到此问题已解决,那就更加清楚了。

今天早上我被这个虫子击中了。没有这个,就不会意识到它属于共享文件夹。谢谢!

谢谢!据我了解,目前没有其他方法可以修复此错误?如果需要启用sendfile怎么办?:-)

#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