在Nginx中何时使用或不使用sendfile开关?


12

我们已经在nginx.conf相当长的一段时间内拥有此设置。

sendfile on;

当我们更新了文件/js/main.js并从浏览器https://test.com/js/main.js?newrandomtimestamp访问时,除非我们从浏览器进行完全刷新(清除缓存),否则它仍将加载旧版本。

但是,当我们从sendfile更改设置时;发送文件;浏览器将加载正确版本的更新文件。

对于我们的生产Web服务器,是否应该在sendfile上使用;或sendfile关闭;?如果sendfile开启;是必需的(可能是因为更好的缓存吗?性能更快?)然后如何解决上述问题?

以下是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;
}

为了使事情变得容易,每次将新文件部署到生产服务器时,我们都应该重新启动Nginx吗?如果我们不想重新启动Nginx,还可以如何清除Nginx缓存?(假设sendfile是否打开;与缓存有关)
Forestclown 2015年

您的Nginx是否在某种虚拟环境(例如virtualbox)中?
阿列克谢2015年

我们的生产服务器位于Amazon EC2上
Forestclown 2015年

关于sendfileVirtualBox驱动器有一些错误报告(例如,virtualbox.org/ticket/819)。亚马逊可能存在类似问题。
Alexey 2015年

在此处访问此内部缓存时,请检查open_file_cache的配置设置。您可以完全禁用它或减少TTL(open_file_cache_valid)。您可以在此处找到更多详细信息:nginx.org/en/docs/http/… 与Virtualbox关联的上述问题是由于特定的文件系统VBOXSF引起的,但在这里情况并非如此。其他已知问题链接到NFS文件系统,该文件系统在这里也没有放置。
詹斯·布拉德勒

Answers:


1

在应用程序级别可能有解决文件缓存问题的方法。这是JavaScript开发界中众所周知的问题。该解决方案通常称为“输出哈希”。

基本思想是在文件名中添加文件内容的哈希值,以便将该文件视为“新”文件,而不是在缓存中找到。

Angular在构建时就完成了(请参阅:)--outputHashing


1

...除非我们从浏览器中进行完全刷新(清除缓存)。

这本身就清楚地表明“问题”在客户端。

sendfile 与缓存无关,仅与NGINX缓存/读取文件的方式有关(试图将内容直接填充到网络“插槽”中,或先对其内容进行缓存)。

唯一合理的解释是,您的特定浏览器?newrandomtimestamp会将无值的参数丢弃为参数,因此它将为example.com?blah和加载相同的缓存资源example.com?boo

如果您尝试一下,那么https://example.com/js/main.js?v=newrandomtimestamp方案应该每次提供较新的内容。


0

您csn也像从我一样在缓存此文件时使用排除项

 location updater/serversettings.xml {
        expires -1;
        add_header 'Cache-Control' 'no-store, no-cache, 
 must-revalidate, proxy-revalidate, max-age=0';
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.