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 .