Коли використовувати чи не використовувати sendfile увімкнення / вимкнення в Nginx?


12

Цей параметр у нас є nginx.confдосить довгий час.

sendfile on;

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

Але коли ми змінюємо налаштування від sendfile on; to sendfile off; браузер завантажить правильну версію оновленого файлу.

Чи слід використовувати наш веб-сервер виробництва на sendfile; або sendfile off ;? Якщо 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 on; пов'язаний з кешем)
Forestclown

Чи є ваш 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. Рішення зазвичай називають чимось на кшталт "хешування виводу".

Основна ідея - додати хеш вмісту файлу до імені файла, щоб файл вважався "новим" і не знаходився в кеші.

Кутовий робить це під час збирання (див. --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';
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.