97 votes

Désactiver la mise en cache lors du service de fichiers statiques avec Nginx (pour le développement)

Nous utilisons Nginx pour servir des fichiers statiques sur une plateforme de développement. Comme il s'agit d'une plateforme de développement, nous aimerions désactiver la mise en cache afin que chaque changement soit propagé sur le serveur. La configuration du VHost est assez simple :

server {
  server_name  static.server.local;
  root /var/www/static;

  ## Default location
  location / {
    access_log        off;
    expires           0;
    add_header        Cache-Control private;
  } 
}

Lorsque nous accédons à un fichier HTML ( http://static.server.local/test.html ), nous n'avons aucun problème : le serveur renvoie un code 304 Non modifié tant que le fichier n'est pas modifié, et d'un 200 OK réponse avec le fichier modifié lorsque le fichier est modifié.
Cependant, il semble se comporter différemment avec un fichier Javascript ou CSS. Une fois que le fichier est modifié, nous obtenons un 200 OK réponse comme prévu, mais avec l'ancien texte.
Existe-t-il un mécanisme de cache interne à Nginx qui pourrait expliquer ce comportement ? Ou une configuration que nous devrions ajouter ?

A titre d'information, voici l'en-tête renvoyé par Nginx lorsque le fichier a été modifié (il semble correct) :

Accept-Ranges:bytes
Cache-Control:max-age=0
private
Connection:keep-alive
Content-Length:309
Content-Type:text/css
Date:Fri, 13 May 2011 14:13:13 GMT
Expires:Fri, 13 May 2011 14:13:13 GMT
Last-Modified:Fri, 13 May 2011 14:13:05 GMT
Server:nginx/0.8.54

Modifier
Après avoir essayé différents réglages avec le expires et Cache-Control tête, j'ai fait quelques investigations supplémentaires. En fait, le serveur est installé sur un invité VirtualBox Ubuntu, et les données sont lues depuis un dossier partagé qui se trouve sur l'hôte Mac OSX.
Si le fichier est édité à partir d'un IDE (NetBeans) sur l'hôte, il semble que les modifications n'apparaissent pas alors que si je l'édite directement sur l'invité (en utilisant VIM), il est actualisé.
Ce qui est étrange, c'est qu'il ne se comporte pas de la même manière avec les fichiers HTML.
C'est assez déroutant.

Edit 2 (REPONSE)
En effet, l'origine du problème se situait plutôt du côté de VirtualBox. Ou plutôt un conflit entre VirtualBox et l'option "sendfile" du serveur.
Ce lien VirtualBox déteste Sendfile m'a donné la solution : changer le sendfile dans la configuration du serveur pour off :

sendfile  off;

J'espère que cela pourra également aider d'autres personnes utilisant VirtualBox pour le développement :)
Il y a quelques informations supplémentaires sur le Forum VirtualBox .

3 votes

Je pourrais littéralement vous serrer dans mes bras ! J'ai passé 48 heures à maudire et à devenir complètement fou avec ce problème exact..., j'ai recompilé nginx plusieurs fois, j'ai sacrifié quelques petites créatures duveteuses à des divinités assorties, j'ai appris les directives de cache à l'envers... tout ça pour découvrir que c'est une bizarrerie d'une ligne à réparer grâce à VirtualBox qui est bizarre !

15 votes

Ce serait beaucoup plus clair si vous postiez votre réponse comme réponse et l'acceptiez afin que tout le monde puisse voir que ce problème a été résolu.

0 votes

J'ai été frappé par ce bug ce matin. Sans cela, je n'aurais pas réalisé que c'était dû au dossier partagé. Merci !

61voto

slank Points 11

Puisque la réponse est en quelque sorte cachée dans la question - voici la solution pour nginx dans un environnement VirtualBox comme réponse autonome.

Dans le fichier de configuration de nginx (généralement /etc/nginx/nginx.conf) ou dans le fichier de configuration du serveur virtuel, modifiez l'élément suivant sendfile pour off :

sendfile  off;

Alors que sendfile est au cœur de la renommée de Nginx (efficacité fulgurante du service de fichiers statiques de bas niveau), il peut être un fléau pour le développement local, par exemple pour les Javascripts qui changent souvent et doivent être rechargés. Néanmoins, Nginx sendfile est intelligent et n'est probablement pas le problème de la plupart des gens ; vérifiez également les options "désactiver le cache" de votre navigateur !

5 votes

+1 bien que la réponse doive expliquer pourquoi qui est nécessaire au lieu de laisser effectivement les lecteurs trouver/relire la question en cherchant les références. Faites en sorte que la réponse se suffise à elle-même -> mieux.

2 votes

Cela semble être la solution pour moi. Le problème semble se produire avec la combinaison spécifique de Sendfile, VirtualBox et un hôte OSX. abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile forums.virtualbox.org/viewtopic.php?f=1&t=24905

2 votes

sendfile est parfait, même pour un environnement de développement local ; c'est seulement dans VirtualBox qu'il ne fonctionne pas. C'est une des raisons (parmi d'autres) pour lesquelles je recommande d'éviter VirtualBox...

16voto

anthonysomerset Points 3953

Définissez votre balise expires à

expires off;

et il ne devrait pas définir d'en-têtes expires, il se peut également que votre navigateur mette en cache des fichiers de manière incorrecte.

1 votes

Malheureusement, j'ai essayé cela aussi bien que expires -1 et le comportement est toujours le même.

0 votes

En ce qui concerne le navigateur, j'ai pensé à cette possibilité : J'ai d'abord essayé avec Chrome, et après avoir modifié un fichier, je l'ai ouvert pour la première fois dans Firefox : J'ai toujours obtenu la première version du fichier.

0 votes

De plus, l'en-tête de contrôle du cache devrait probablement être CACHE-CONTROL:NO-CACHE.

5voto

user2229607 Points 11

Cette question est tardive, mais elle est toujours marquée sans réponse, alors je vais tenter le coup. Juste pour rire, avez-vous essayé :

location ~* \.(css|js)$ {
    expires 0;
    break;
}

Je n'ai pas essayé moi-même, mais j'ai appris à essayer ce genre de choses avec Nginx dans un conteneur de serveur de temps en temps lorsque j'ai des problèmes similaires à celui-ci...

4voto

Zafar Points 241

Il s'agit d'un ancien bug de VirtualBox (voir : #819 , #9069 , #12597 , #14920 ) où vboxvfs semble avoir quelques problèmes avec l'accès mmappé aux fichiers qui sont synchronisés.

Cela peut se produire lorsque vous modifiez le fichier en dehors de la VM, et que vous vous attendez à voir la même modification dans la VM.

Pour contourner ce problème, vous devez désactiver la prise en charge de sendfile par le noyau pour livrer les fichiers au client en désactivant la fonction EnableSendfile option . Ceci est particulièrement problématique pour les fichiers montés par NFS ou SMB.

Pour Nginx (changement dans nginx.conf ), par exemple

sendfile off;

Similaire pour Apache (en httpd.conf ou dans le fichier vhosts), par ex.

<Directory "/path-to-nfs-files">
  EnableSendfile Off
</Directory>

Après le changement, rechargez Apache.


Une autre solution possible est de ne pas modifier les fichiers sur l'hôte, ou d'essayer de rééditer le même fichier, mais dans la VM.


Une autre solution consiste à supprimer le cache de pages de Linux, par ex.

echo 1 > /proc/sys/vm/drop_caches

Ou pour vider les caches toutes les secondes (comme dans le cas de ce poste ), essayez :

watch -n 1 $(sync; echo 1 > /proc/sys/vm/drop_caches)

Note : Le numéro 1 signifie libérer le cache de la page, le numéro 2 signifie libérer les dentries et les inodes, le numéro 3 signifie libérer le cache de la page, les dentries et les inodes.


Le problème ci-dessus peut être reproduit par le programme mmap-test suivant, voir : mmap-problem.c .

2voto

k2s Points 121

Si rien de ce qui précède ne vous aide et que Nginx renvoie toujours l'ancien contenu de vos fichiers, il se peut que le problème soit lié aux éléments suivants open_file_cache .

Voir comme référence :

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X