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 !
0 votes
Merci. Si je comprends bien, il n'y a pas d'autre moyen de corriger ce bug pour le moment ? Et si j'ai besoin que sendfile soit activé :-)
0 votes
Ugh, je suis tombé sur ça aussi. Pour plus de clarté, la "configuration du serveur" décrite ci-dessus est le fichier de configuration de nginx.
0 votes
S'il vous plaît, créez un nouveau message avec la réponse et marquez-le en tant que
best answer