使用 Nginx 提供静态文件时禁用缓存(用于开发)

Oli*_*ppe 93 nginx virtualbox cache static-content

我们正在使用 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;
  } 
}
Run Code Online (Sandbox Code Playgroud)

当我们访问一个 HTML 文件(http://static.server.local/test.html)时,我们没有问题:只要文件没有改变,服务器就会返回一个代码304 Not Modified,并返回一个200 OK响应更改文件时修改的文件。
但是,对于 Javascript 或 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
Run Code Online (Sandbox Code Playgroud)

编辑
在使用expires指令和Cache-Control标题尝试不同的设置后,我进行了一些进一步的调查。实际上,服务器安装在 VirtualBox 来宾 Ubuntu 上,数据是从 Mac OSX 主机上的共享文件夹读取的。
如果文件是从主机上的 IDE (NetBeans) 编辑的,似乎不会出现更改,而如果我直接在来宾上编辑它(使用 VIM),它会刷新。
奇怪的是它与 HTML 文件的行为不同。
很令人费解。

编辑 2 (ANSWER)
事实上,问题的根源更多是在 VirtualBox 方面。或者更确切地说是 VirtualBox 和服务器的“sendfile”选项之间的冲突。
此链接VirtualBox Hates Sendfile给了我解决方案:将服务器配置中的sendfile标志切换为off

sendfile  off;
Run Code Online (Sandbox Code Playgroud)

希望这也可以帮助其他人使用 VirtualBox 进行开发。:) VirtualBox 论坛
上有一些附加信息。

lor*_*key 59

由于答案以某种方式隐藏在问题中 - 这是 VirtualBox 环境中 nginx 作为独立答案的解决方案。

在您的 nginx 配置(通常为 /etc/nginx/nginx.conf)或 vhost 配置文件中,将sendfile参数更改为off

sendfile  off;
Run Code Online (Sandbox Code Playgroud)

虽然它sendfile是 Nginx 声名鹊起的核心(极快的低级静态文件服务效率),但它可能是本地开发的祸根,例如经常更改且需要重新加载的 Javascript。尽管如此,Nginx 的 sendfile 很聪明,可能不是大多数人的问题;还要检查浏览器的“禁用缓存”选项!

  • +1 虽然答案应该解释_为什么_这是必要的,而不是有效地让读者找到/重新阅读问题以寻找参考。使答案独立 -> 更好。 (5认同)
  • 这似乎是我的答案。问题似乎发生在 Sendfile、VirtualBox 和 OSX 主机的特定组合中。https://abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile/ https://forums.virtualbox.org/viewtopic.php?f=1&t=24905 (2认同)

ant*_*set 15

将您的过期标签设置为

expires off;
Run Code Online (Sandbox Code Playgroud)

并且它根本不应该设置任何过期标头,也可能是您的浏览器缓存文件不正确