![何时在 Nginx 中使用或不使用 sendfile on/off?](https://linux22.com/image/671422/%E4%BD%95%E6%97%B6%E5%9C%A8%20Nginx%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%88%96%E4%B8%8D%E4%BD%BF%E7%94%A8%20sendfile%20on%2Foff%EF%BC%9F.png)
我们已经拥有这个设置nginx.conf
很长一段时间了。
sendfile on;
当我们更新文件时,例如/js/main.js
从浏览器访问https://test.com/js/main.js?newrandomtimestamp,除非我们从浏览器进行完全刷新(清除缓存),否则它仍会加载旧版本。
但是当我们将设置从 sendfile on; 更改为 sendfile off; 时,浏览器将加载更新文件的正确版本。
对于我们的生产 Web 服务器,我们应该使用 sendfile on; 还是 sendfile off;?如果必须使用 sendfile on;(可能是因为更好的缓存?更快的性能?)那么如何解决上述问题?
以下是nginx.conf
我们的生产服务器,我们使用的是 1.7.5 版本:
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_rlimit_nofile 51200;
events {
use epoll;
worker_connections 51200;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
client_max_body_size 8m;
sendfile on;
keepalive_timeout 65;
real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;
large_client_header_buffers 4 32k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript application/javascript text/css application/xml application/json;
gzip_vary on;
include /etc/nginx/conf.d/*.conf;
}
答案1
...除非我们对浏览器进行完全刷新(清除缓存)。
这本身就清楚地表明“问题”出在客户端。
sendfile
与缓存无关,只与 NGINX 如何缓冲/读取文件有关(尝试将内容直接塞入网络“插槽”,或先缓冲其内容)。
唯一合理的解释是,您的特定浏览器将其丢弃?newrandomtimestamp
为没有值的参数,因此它会为和加载相同的缓存example.com?blah
资源example.com?boo
。
如果你尝试一下,然后https://example.com/js/main.js?v=newrandomtimestamp
计划,应该每次提供更新的内容。
答案2
在应用程序级别,可能存在解决文件缓存问题的方法。它是一种知名这是 JavaScript 开发领域中存在的问题。解决方案通常称为“输出哈希”。
基本思想是将文件内容的哈希值添加到文件名中,以便该文件被视为“新”文件并且不会在缓存中找到。
Angular 在构建时执行此操作(参见:--outputHashing
)。
答案3
你 csn 也像我一样使用排除缓存这个文件
location updater/serversettings.xml {
expires -1;
add_header 'Cache-Control' 'no-store, no-cache,
must-revalidate, proxy-revalidate, max-age=0';
}