Когда использовать или не использовать sendfile вкл / выкл в Nginx?

12

У нас есть этот параметр в нашем nginx.confдовольно долгое время.

sendfile on;

Когда мы обновили файл, например, /js/main.jsи осуществили доступ из браузера https://test.com/js/main.js?newrandomtimestamp , он все равно загрузит старую версию, если мы не выполним полное обновление (очистить кеш) из нашего браузера.

Но когда мы меняем настройки с sendfile на; отправить файл прочь; браузер загрузит правильную версию обновленного файла.

Для нашего рабочего веб-сервера, мы должны использовать sendfile on; или отправить файл выключен? Если 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;
}
forestclown
источник
Чтобы упростить задачу, следует ли перезапускать nginx каждый раз, когда мы внедряем новые файлы на наш рабочий сервер? Если мы не хотим перезапускать nginx, как еще мы можем очистить кеш nginx? (при условии, что sendfile
включен
Есть ли у вашего nginx какая-то виртуальная среда (например, virtualbox)?
Алексей Тен
Наш производственный сервер находится на Amazon EC2
forestclown
Существует несколько сообщений об ошибках sendfileи диске VirtualBox (например, virtualbox.org/ticket/819 ). Может быть, есть аналогичная проблема с Amazon.
Алексей Тен
Проверьте параметры конфигурации open_file_cache, когда вы попадаете в этот внутренний кеш. Вы можете полностью отключить его или уменьшить TTL (open_file_cache_valid). Более подробную информацию вы найдете здесь: nginx.org/en/docs/http/… Упомянутые проблемы, связанные с Virtualbox, связаны с конкретной файловой системой VBOXSF, но здесь это не должно быть так. Другие известные проблемы связаны с файловой системой NFS, которая также здесь отсутствует.
Дженс

Ответы:

1

Может быть решение вашей проблемы с кэшированием файлов на уровне приложения. Это хорошо известная проблема в мире разработки JavaScript. Решение обычно называется чем-то вроде «выходного хэширования».

Основная идея заключается в добавлении хэша содержимого файла к имени файла, чтобы файл считался «новым» и не был найден в кэше.

Angular делает это во время сборки (см . --outputHashing:).

Энтони Мастреан
источник
1

... если мы не сделаем полное обновление (очистить кеш) из нашего браузера.

Это само по себе явное проявление того, что «проблема» лежит на стороне клиента.

sendfile не имеет никакого отношения к кешированию, только как NGINX буферизует / читает файл (пытаясь вставить содержимое непосредственно в сетевой «слот» или сначала запаковать его содержимое).

Единственное разумное объяснение заключается в том, что ваш конкретный браузер отбрасывает ?newrandomtimestampкак параметр без значения, поэтому он загружает один и тот же кэшированный ресурс для обоих example.com?blahи example.com?boo.

Если вы попробуете, то https://example.com/js/main.js?v=newrandomtimestampсхема должна каждый раз давать новый контент.

Данила Вершинин
источник
0

Вы также используете исключение из кэширования этого файла, как я

 location updater/serversettings.xml {
        expires -1;
        add_header 'Cache-Control' 'no-store, no-cache, 
 must-revalidate, proxy-revalidate, max-age=0';
    }
djdomi
источник