Vraag Schakel caching uit bij het serveren van statische bestanden met Nginx (voor ontwikkeling)


We gebruiken Nginx om statische bestanden op een ontwikkelingsplatform te serveren. Omdat het een ontwikkelplatform is, willen we caching uitschakelen zodat elke wijziging wordt doorgegeven aan de server. De configuratie van de VHost is vrij eenvoudig:

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

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

Wanneer we een HTML-bestand openen (http: //static.server.local/test.html), we hebben geen probleem: de server retourneert een code 304 niet gewijzigd zolang het bestand niet is gewijzigd, en a 200 OK antwoord met het gewijzigde bestand wanneer het bestand is gewijzigd.
Het lijkt zich echter anders te gedragen met een Javascript- of een CSS-bestand. Zodra het bestand is gewijzigd, krijgen we een 200 OK reactie zoals verwacht, maar met de oude tekst.
Bestaat er een intern cachemechanisme in Nginx dat dit gedrag zou kunnen verklaren? Of een configuratie die we moeten toevoegen?

Als een kanttekening, hier is de header geretourneerd door Nginx wanneer het bestand is gewijzigd (het lijkt 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

Bewerk
Na het proberen van verschillende instellingen met de expires richtlijn en Cache-Controlheader, heb ik wat verder onderzoek gedaan. De server is zelfs geïnstalleerd op een Ubuntu-gast van VirtualBox en gegevens worden gelezen uit een gedeelde map die zich op de Mac OSX-host bevindt.
Als het bestand wordt bewerkt vanuit een IDE (NetBeans) op de host, lijkt het erop dat er geen wijzigingen worden weergegeven, maar als ik het rechtstreeks op de gast bewerk (via VIM), wordt het vernieuwd.
Het vreemde is dat het zich niet op dezelfde manier gedraagt ​​als HTML-bestanden.
Heel raadselachtig.

Bewerk 2 (ANTWOORD)
De oorzaak van het probleem lag inderdaad meer aan de kant van VirtualBox. Of liever een conflict tussen VirtualBox en de "sendfile" -optie van de server.
Deze link VirtualBox haat Sendfile gaf me de oplossing: schakel het verstuur bestand markeer in de serverconfiguratie naar uit:

sendfile  off;

Ik hoop dat dit ook een andere persoon kan helpen die VirtualBox gebruikt voor ontwikkeling. :)
Er is wat aanvullende informatie over de VirtualBox-forum.


87
2018-05-13 14:18


oorsprong


Gebruikt u nginx in een vagrant vm en gebruikt u gedeelde fs? Er zijn verschillende meldingen van uw symptomen met die combinatie in #nginx. - kolbyjack
Ik zou je letterlijk kunnen knuffelen !! Heb 48 uur lang gevloekt en helemaal gek van dit exacte probleem .., een paar keer nginx opnieuw gecompileerd, een paar kleine pluizige wezens opgeofferd aan diverse goden, de cacherichtlijnen achterstevoren geleerd ... allemaal om erachter te komen dat het een een regel eigenaardigheid is om te repareren dankzij VirtualBox is raar! - James Butler
Het zou veel duidelijker zijn als u uw antwoord als antwoord zou plaatsen en het zou accepteren zodat iedereen kan zien dat dit probleem is opgelost. - Zombaya
Dit heeft me veel geholpen. Dank je. - Matt M.
Ik werd vanochtend getroffen door deze bug. Ik zou niet hebben gerealiseerd dat dit zonder de gedeelde map was. Bedankt! - Jaffa The Cake


antwoorden:


Omdat het antwoord op de een of andere manier verborgen zit in de vraag - hier is de oplossing voor nginx in een VirtualBox-omgeving als standalone antwoord.

In je nginx config (gebruikelijk /etc/nginx/nginx.conf) of vhost config-bestand verander je sendfile parameter naar off:

sendfile  off;

Terwijl sendfile is de kern van de bekendheid van Nginx (razendsnelle statische bestandsefficiëntie bij een laag niveau), maar het kan een vloek zijn voor de lokale ontwikkeling, bijvoorbeeld Javascripts die vaak veranderen en opnieuw moeten worden geladen. Desondanks is Nginx sendfile slim en waarschijnlijk niet het probleem van de meeste mensen; controleer ook de "disable cache" -opties van uw browser!


58
2017-11-19 09:52



+1 hoewel het antwoord moet worden uitgelegd waarom dat is nodig in plaats van de lezers effectief te laten zoeken naar de vraag op zoek naar referenties. Laat het antwoord op zichzelf staan ​​-> beter. - AD7six
Dit lijkt het antwoord voor mij te zijn. Het probleem lijkt zich voor te doen met de specifieke combinatie van Sendfile, VirtualBox en een OSX-host. abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile  forums.virtualbox.org/viewtopic.php?f=1&t=24905 - Steve Bennett
sendfile is prima voor zelfs een lokale ontwikkelomgeving; het is alleen VirtualBox waarin het kapot is. Dat is een reden (van veel) raad ik aan om VirtualBox te vermijden ... - Michael Hampton♦
bedankt voor het veilige, vreemde probleem met Vagrant / VirtualBox / Ubuntu / Wordpress, ik vermoed dat mijn PROD-omgeving veilig is met sendfile als standaard. - sonjz
Lost mijn probleem met nginx en docker op - PascalTurbo


stel je verlopen tag in

expires off;

en er mogen helemaal geen verlopen headers worden ingesteld, het kunnen ook onjuiste browsercaching-bestanden zijn


15
2018-05-13 14:20



Helaas heb ik dit ook zo geprobeerd expires -1 en het gedrag is nog steeds hetzelfde. - Olivier Chappe
Wat de browser betreft, heb ik aan deze mogelijkheden gedacht: ik probeerde eerst met Chrome, en na het aanpassen van een bestand werd het voor het eerst geopend in Firefox: ik kreeg nog steeds de eerste versie van het bestand. - Olivier Chappe
ook de cache-control header zou waarschijnlijk CACHE-CONTROL moeten zijn: NO-CACHE - anthonysomerset
of verwijder de header van de cachebesturing helemaal - sorry kon vorige opmerking niet bewerken - anthonysomerset
In Windows "vervalt" wordt het cachen van HTML-bestanden nog steeds niet uitgeschakeld. Super frustrerend als ik een bestand in mijn IDE update, maar! $ #% Ing nginx dient een oude versie. - Dan Dascalescu


Als niets hierboven vermeld helpt en nog steeds Nginx oude inhoud van uw bestanden retourneert, kan dit een probleem zijn open_file_cache.

Zie als referentie:


2
2017-10-14 20:38





Dit is een oude bug in VirtualBox (zie: # 819, # 9069, # 12597, # 14920) waar vboxvfs enige problemen lijkt te hebben met mmapped toegang tot bestanden die gesynchroniseerd zijn.

Dit kan gebeuren wanneer u het bestand buiten de VM bewerkt, en u verwacht dezelfde wijziging binnen de VM te zien.

Om dit probleem te omzeilen, moet je de kernel sendfile-ondersteuning uitschakelen om bestanden naar de client te sturen door deze uit te schakelen EnableSendfile keuze. Dit is vooral een probleem voor aan NFS of SMB gekoppelde bestanden.

Voor Nginx (veranderen in nginx.conf), b.v.

sendfile off;

Vergelijkbaar voor Apache (in httpd.conf of in vhosts-bestand), b.v.

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

Breng na de wijziging de Apache opnieuw aan.


Een andere mogelijke oplossing is alleen dat u de bestanden op de host niet bewerkt of dat u hetzelfde bestand opnieuw probeert te bewerken, maar dan binnen de VM.


Een andere oplossing is het laten vallen van de Linux-paginacache, bijvoorbeeld

echo 1 > /proc/sys/vm/drop_caches

Of om de caches elke seconde te wissen (zoals in deze post), proberen:

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

Opmerking: Nummer 1 staat voor bevrijdend pagecache, 2 voor dentries en inodes, 3 voor pagecache, dentries en inodes.


Het bovenstaande probleem kan worden gerepliceerd door het volgende mmap-testprogramma, zie: mmap-problem.c.


2
2017-12-13 14:03





Dit is laat, maar nog steeds gemarkeerd als onbeantwoord, dus ik zal een steek maken. Alleen voor gegiechel, heb je geprobeerd:

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

Ik heb dit zelf niet geprobeerd, maar heb geleerd om dit soort dingen met Nginx in een servercontainer van tijd tot tijd te proberen, wanneer ik vergelijkbare problemen heb ...


1
2017-12-28 01:47