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

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

我们使用 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 未修改只要文件没有被改变,200 正常当文件更改时,它会对修改后的文件做出响应。
但是,对于 Javascript 或 CSS 文件,它似乎表现不同。一旦文件更改,我们就会得到200 正常响应与预期一致,但文本内容较旧。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)编辑文件,似乎不会出现更改,而如果我直接在客户机上编辑它(使用 VIM),它会刷新。
奇怪的是它对 HTML 文件的行为并不相似。
相当令人费解。

编辑2(答案)
事实上,问题的根源更多在于 VirtualBox 方面。或者更确切地说,是 VirtualBox 与服务器的“sendfile”选项之间的冲突。
此链接VirtualBox 讨厌 Sendfile给了我解决方案:切换发送文件服务器配置中的标志离开

sendfile  off;

希望这也能帮助其他使用 VirtualBox 进行开发的人。:)
有关VirtualBox 论坛

答案1

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

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

sendfile  off;

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

答案2

将你的过期标签设置为

expires off;

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

答案3

虽然已经很晚了,但仍然标记为未答复,所以我会尝试一下。只是为了开个玩笑,你试过吗:

location ~* \.(css|js)$ {
    expires 0;
    break;
}

我自己还没有尝试过这个,但是当我遇到类似的问题时,我已经学会在服务器容器中使用 Nginx 尝试这种事情......

答案4

如果上述内容均无帮助,而 Nginx 仍然返回文件的旧内容,则可能与有关的问题open_file_cache

请参阅参考:

相关内容