Używamy Nginx do obsługi plików statycznych na platformie programistycznej. Ponieważ jest to platforma programistyczna, chcielibyśmy wyłączyć buforowanie, aby każda zmiana była propagowana na serwer. Konfiguracja VHost jest dość prosta:
server {
server_name static.server.local;
root /var/www/static;
## Default location
location / {
access_log off;
expires 0;
add_header Cache-Control private;
}
}
Gdy uzyskujemy dostęp do pliku HTML ( http: //static.server.local/test.html ), nie mamy problemu: serwer zwraca kod 304 Niezmodyfikowany , dopóki plik nie zostanie zmieniony, i odpowiedź 200 OK z zmodyfikowany plik po zmianie pliku.
Wydaje się jednak, że zachowuje się inaczej w przypadku pliku JavaScript lub CSS. Po zmianie pliku otrzymujemy odpowiedź 200 OK zgodnie z oczekiwaniami, ale ze starym tekstem.
Czy w Nginx jest wewnętrzny mechanizm pamięci podręcznej, który mógłby wyjaśnić to zachowanie? Lub jakąś konfigurację, którą powinniśmy dodać?
Na marginesie, oto nagłówek zwracany przez Nginx, gdy plik został zmodyfikowany (wydaje się poprawny):
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
Edytuj
Po wypróbowaniu różnych ustawień expires
dyrektywy i Cache-Control
nagłówka przeprowadziłem dalsze dochodzenia. W rzeczywistości serwer jest zainstalowany na systemie Ubuntu gościa VirtualBox, a dane są odczytywane z folderu współdzielonego na hoście Mac OSX.
Jeśli plik jest edytowany z IDE (NetBeans) na hoście, wydaje się, że zmiany nie pojawiają się, natomiast jeśli edytuję go bezpośrednio na gościu (używając VIM), jest on odświeżany.
Dziwne jest to, że nie zachowuje się podobnie z plikami HTML.
Całkiem zagadkowe.
Edycja 2 (ODPOWIEDŹ)
Rzeczywiście, źródło problemu było bardziej po stronie VirtualBox. A raczej konflikt między VirtualBox a opcją „sendfile” serwera.
Ten link VirtualBox Hates Sendfile dał mi rozwiązanie: wyłącz flagę sendfile w konfiguracji serwera na off :
sendfile off;
Mam nadzieję, że może to również pomóc innej osobie używającej VirtualBox do programowania. :)
Istnieje kilka dodatkowych informacji na forum VirtualBox .
źródło
Odpowiedzi:
Ponieważ odpowiedź jest w jakiś sposób ukryta w pytaniu - oto rozwiązanie dla nginx w środowisku VirtualBox jako samodzielna odpowiedź.
W konfiguracji nginx (zwykle /etc/nginx/nginx.conf) lub pliku konfiguracyjnym vhost zmień
sendfile
parametr naoff
:Choć
sendfile
leży u podstaw sławy Nginx (niesamowicie szybka statyczna obsługa niskiego poziomu plików statycznych), może to być zmorą dla rozwoju lokalnego, np. JavaScript, który często się zmienia i trzeba go ponownie załadować. Niemniej jednak plik wysyłania Nginx jest inteligentny i prawdopodobnie nie jest to problem większości ludzi; sprawdź także opcje „wyłącz pamięć podręczną” w przeglądarce!źródło
sendfile
jest w porządku nawet dla lokalnego środowiska programistycznego; to tylko VirtualBox, w którym jest zepsuty. Z tego powodu (wielu z nich) zalecam unikanie VirtualBox ...ustaw tag wygasania na
i nie powinien w ogóle ustawiać nagłówków wygasających, może to również niepoprawnie buforować pliki przeglądarki
źródło
expires -1
a zachowanie jest nadal takie samo.Jeśli nic nie wspomniane powyżej pomaga i nadal Nginx zwraca starą zawartość twoich plików, może to oznaczać problem
open_file_cache
.Zobacz jako odniesienie:
źródło
Jest to stary błąd w VirtualBox (patrz: # 819 , # 9069 , # 12597 , # 14920 ), w którym vboxvfs wydaje się mieć problemy z dostępem mmapa do synchronizowanych plików.
Może się to zdarzyć, gdy edytujesz plik poza maszyną wirtualną i spodziewasz się tej samej zmiany w maszynie wirtualnej.
Aby obejść ten problem, należy wyłączyć obsługę wysyłania plików jądra w celu dostarczania plików do klienta poprzez wyłączenie
EnableSendfile
opcji . Jest to szczególnie kłopotliwe dla plików montowanych przez NFS lub SMB.Do
Nginx
(zmiananginx.conf
), npPodobne dla Apache (w
httpd.conf
lub w pliku vhosts), npPo zmianie załaduj ponownie Apache.
Innym potencjalnym rozwiązaniem jest po prostu pamiętaj, aby nie edytować plików na hoście lub próbować ponownie edytować ten sam plik, ale na maszynie wirtualnej.
Innym obejściem jest upuszczenie pamięci podręcznej systemu Linux, np
Lub, aby wyczyścić pamięć podręczną co sekundę (jak w tym poście ), spróbuj:
Uwaga: Numer 1 oznacza zwolnienie pamięci podręcznej, 2 dla dentries i i-węzłów, 3 dla pagecache, dentries i i-węzłów.
Powyższy problem może być powielana według następującego programu mmap testu, zob
mmap-problem.c
.źródło
Jest późno, ale wciąż jest zaznaczony bez odpowiedzi, więc wezmę dźgnięcie. Tylko na chichoty, czy próbowałeś:
Sam tego nie próbowałem, ale od czasu do czasu nauczyłem się próbować tego rodzaju z Nginx w kontenerze serwera, gdy mam problemy podobne do tego ...
źródło