Quand utiliser ou ne pas utiliser sendfile on / off dans Nginx?

12

Nous avons ce paramètre dans notre nginx.confdepuis un certain temps.

sendfile on;

Lorsque nous avons mis à jour un fichier, par exemple /js/main.jset que nous y accédons depuis le navigateur https://test.com/js/main.js?newrandomtimestamp , il chargera toujours l'ancienne version à moins que nous ne rafraîchissions complètement (vider le cache) à partir de notre navigateur.

Mais lorsque nous modifions les paramètres de sendfile; envoyer le fichier; le navigateur chargera la version correcte du fichier mis à jour.

Pour notre serveur Web de production, devrions-nous utiliser sendfile sur; ou envoyer le fichier ;? Si sendfile est activé; est nécessaire (mai pour une meilleure mise en cache? Des performances plus rapides?) alors comment résoudre le problème mentionné ci-dessus?

Ci-dessous se trouve nginx.confdans notre serveur de production, et nous utilisons la version 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
la source
Pour faciliter les choses, devons-nous redémarrer nginx chaque fois que nous déployons de nouveaux fichiers sur notre serveur de production? Si nous ne voulons pas redémarrer nginx, comment pouvons-nous vider le cache nginx autrement? (en supposant que le
fichier d'envoi soit activé
Est-ce que votre nginx dans une sorte d'environnement virtuel (comme virtualbox)?
Alexey Ten
Notre serveur de production est sur Amazon EC2
forestclown
Il existe plusieurs rapports de bogues concernant le sendfilelecteur VirtualBox (par exemple virtualbox.org/ticket/819 ). Il se peut qu'il y ait un problème similaire avec Amazon.
Alexey Ten
Vérifiez les paramètres de configuration de open_file_cache lorsque vous atteignez ce cache interne ici. Vous pouvez le désactiver complètement ou réduire le TTL (open_file_cache_valid). Vous trouverez plus de détails ici: nginx.org/en/docs/http/… Les problèmes mentionnés liés à Virtualbox sont dus au système de fichiers spécifique VBOXSF mais cela ne devrait pas être le cas ici. D'autres problèmes connus sont liés au système de fichiers NFS qui n'est pas ici non plus.
Jens Bradler

Réponses:

1

Il peut y avoir une solution à votre problème de mise en cache de fichiers au niveau de l'application. C'est un problème bien connu dans le monde du développement JavaScript. La solution est généralement appelée quelque chose comme "hachage de sortie".

L'idée de base est d'ajouter un hachage du contenu du fichier au nom du fichier afin que le fichier soit considéré comme "nouveau" et non trouvé dans le cache.

Angular le fait au moment de la construction (voir:) --outputHashing.

Anthony Mastrean
la source
1

... sauf si nous effectuons un rafraîchissement complet (vider le cache) à partir de notre navigateur.

Cela en soi, une manifestation claire que le «problème» est du côté client.

sendfile n'a rien à voir avec la mise en cache, seulement comment NGINX met en mémoire tampon / lit le fichier (en essayant de bourrer le contenu directement dans le "slot" du réseau, ou en tamponnant d'abord son contenu).

La seule explication raisonnable est que votre navigateur spécifique se défait en ?newrandomtimestamptant que paramètre sans valeur, il charge donc la même ressource mise en cache pour l'un example.com?blahet l' autre example.com?boo.

Si vous essayez, le https://example.com/js/main.js?v=newrandomtimestampschéma devrait à chaque fois donner un contenu plus récent.

Danila Vershinin
la source
0

vous csn utilisez également une exclusion de la mise en cache de ce fichier comme je le fais

 location updater/serversettings.xml {
        expires -1;
        add_header 'Cache-Control' 'no-store, no-cache, 
 must-revalidate, proxy-revalidate, max-age=0';
    }
djdomi
la source