Nous utilisons Nginx pour servir des fichiers statiques sur une plate-forme de développement. S'agissant d'une plate-forme de développement, nous aimerions désactiver la mise en cache afin que chaque modification soit propagée au 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’a pas été modifié et une réponse 200 OK avec le fichier modifié lors de la modification du fichier.
Cependant, il semble se comporter différemment avec un fichier Javascript ou CSS. Une fois le fichier modifié, nous obtenons une réponse 200 OK comme prévu, mais avec l'ancien texte.
Existe-t-il un mécanisme de cache interne dans Nginx qui pourrait expliquer ce comportement? Ou une configuration que nous devrions ajouter?
En remarque, voici l'en-tête renvoyé par Nginx lorsque le fichier a été modifié (cela 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 paramètres avec la expires
directive et l’en- Cache-Control
tête, j’ai effectué quelques recherches supplémentaires. En fait, le serveur est installé sur un invité VirtualBox Ubuntu et les données sont lues à partir d'un dossier partagé situé sur l'hôte Mac OSX.
Si le fichier est modifié à partir d'un IDE (NetBeans) sur l'hôte, il semble que les modifications ne s'affichent pas. Si je le modifie directement sur l'invité (à l'aide de VIM), il est actualisé.
La chose étrange est qu'il ne se comporte pas de la même manière avec les fichiers HTML.
Assez curieux.
Edit 2 (REPONSE)
En effet, l'origine du problème était davantage du côté de VirtualBox. Ou plutôt un conflit entre VirtualBox et l'option "sendfile" du serveur.
Ce lien VirtualBox Hates Sendfile m'a donné la solution: changer le sendfile drapeau dans la configuration du serveur hors :
sendfile off;
J'espère que cela pourrait également aider une autre personne utilisant VirtualBox pour son développement. :)
Il y a quelques informations supplémentaires sur le forum VirtualBox .