2012-02-28 21 views
61

Używam programu Vagrant do uruchamiania VirtualBox z systemem Apache2 w systemie Ubuntu.Vagrant/VirtualBox/Apache2 Dziwne zachowanie w pamięci podręcznej

Serwer sieci, między innymi, obsługuje pliki statyczne z katalogu my/vagrant.

To działa dobrze przez większość czasu. Ale kiedy zmieniam obraz w moim udostępnionym folderze i ponownie ładuję stronę, wyświetla się poprzednia wersja obrazu, ale jest obcięta.

Działa, jeśli najpierw usunę stare zdjęcie z folderu udostępnionego, odśwież stronę, aby obraz NIE był wyświetlany, a następnie zapisz nowy plik i ponownie załaduj witrynę.

Czy ktoś wie o tym problemie? Nie mam niczego specjalnego zainstalowanego, tylko Apache 2 z mod_rewrite i PHP z Mongo, APC Plugin, MongoDB oraz nodeJS z mnóstwem skryptów.

+1

miałem ten sam problem, ale z pliku tekstowego (json).Byłem w stanie wykonać tylko wystarczająco szczegółowe wyszukiwanie, aby znaleźć tę odpowiedź po tym, jak spróbowałem Nginx i odkryłem, że ma ten sam problem co Apache. –

Odpowiedz

132

znaleźć odpowiedź here:

JC

Co widzisz to prawdopodobnie dlatego, że serwer służący statycznych plików używa Sendfile "()" syscall, który jest uszkodzony z system VirtualBox system. Musisz wyłączyć użycie sendfile() na swoim serwerze. Apache:

EnableSendfile off

a dla nginx: sendfile off;

Best, Mitchell

+3

Szukając wyjaśnienia dla tego szczególnego problemu, znalazłem twoją odpowiedź. Warto również zauważyć, że jeśli można używać NFS do udostępniania plików, jest to bardziej niezawodne i szybsze rozwiązanie i nie cierpi z powodu tego szczególnego problemu: http://vagrantup.com/v1/docs/nfs.html – Gerry

+17

Oh mój Boże, dziękuję bardzo za opublikowanie tego. Próbowałem ogolić to jak na cały dzień. : D –

+4

Dziękuję bardzo za to. Chcę ostatnie 4 godziny mojego życia. – Deinumite

8

Zostało to doprowadza mnie do szału! Dzięki, że wysłałeś tego Philippa. Dla tych z Was, którzy nie mają pojęcia jak to zrobić zmienić plik konfiguracyjny, oto co zrobiłem:

Aby znaleźć plik: $ sudo find -name "nginx.conf"

kopalnia została tutaj: ./etc/nginx/nginx.conf

Więc wpadłem to zmodyfikować go: $ sudo nano ./etc/nginx/nginx.conf

zmienić linię zawierającą sendfile on; do sendfile off;

nie zapomnij exit i vagrant reload!

+0

Występuje literówka w zmianie pliku send. Powinien być wyłączony, prawda? – user49438

+0

Tak, masz rację. – Kenzo

3

Dla każdego, kto używa Laravel 5, Barryvdh's Debugbar i browserSync przez gulp.watch, możesz dostać ten błąd. Miałem dokładnie ten sam błąd z powodu sposobu, w jaki przeglądarka synchronizowała swoje żądania. Jeśli przeglądałem serwer dev przez: http://127.0.0.1:3000/laravel/page Wystąpił błąd http://127.0.0.1/laravel/page.

Zarchiwizowałem to z naszymi przyjaciółmi w browserSync, wykonują niesamowitą robotę. Jest to więcej powodów niż rozwiązanie, ale zamiast spędzać godziny próbując to naprawić, sprawdź, czy to jest twój problem, zanim zmarnujesz więcej czasu.

Ten problem jest podobne do the errors found in this article

0

Był również odpowiedzialny za dziwne zachowanie odnośnie plików CSS w instalacji CentOS/VirtualBox.

Możesz zmienić zawartość pliku CSS w folderze/vagrant, a przeglądarka wyświetli status 200 (zamiast 304), co oznacza, że ​​wie, że plik był nowy. Ale zawartość nie zmieniłaby się.

4

Jest to stary błąd w VirtualBox (patrz: #819, #9069, #12597, #14920) gdzie vboxvfs wydaje się mieć pewne problemy z mmapped dostęp do plików, które są zsynchronizowane.

Może się to zdarzyć, gdy edytujesz plik poza maszyną wirtualną i spodziewasz się zobaczyć tę samą zmianę w maszynie wirtualnej.

Aby obejść ten problem, należy wyłączyć obsługę plików send jądra jądra, aby dostarczyć pliki do klienta, wyłączając EnableSendfile option, w postaci httpd.conf lub w pliku vhosts, np.

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

Jest to szczególnie kłopotliwe dla plików montowanych przez NFS lub SMB. Po zmianie załaduj ponownie Apache.

(w nginx.conf), np.

sendfile off; 

Inne obejście jest, aby pamiętać, aby nie edytować pliki na komputerze lub spróbuj ponownie edytować ten sam plik, ale w VM.


Kolejne obejście obejmuje upuszczenie strony podręcznej linuksa, np.

echo 1 > /proc/sys/vm/drop_caches 

albo wyczyścić pamięć podręczną co drugi (zgodnie this post), spróbuj:

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

Uwaga: Numer 1 oznacza uwolnienie Obsługi KlientaSchowek, 2 dla dentry i-węzłów, 3 dla Obsługi KlientaSchowek, dentry i i-węzły.


Powyższy problem może być replikowane według następującego programu mmap-testowym, zobacz: mmap-problem.c.

+1

Potwierdzenie 'echo 1>/proc/sys/vm/drop_caches' naprawia problem w konfiguracji Vagrant/VirtualBox. Wydaje się, że jest to znany problem: https://www.virtualbox.org/ticket/9069 przynajmniej ma tylko sześć lat. – jevon

4

Mam podobny problem ze środowiskiem VirtualBox/Docker/Nginx.

Decyzja z porzuceniem pagecache Linux echo 1 > /proc/sys/vm/drop_caches działa dobrze, ale wygląda niezręcznie.

Również dyrektywa sendfile off; w nginx.conf nie rozwiązała problemu i próbowałem użyć go razem z dyrektywą expires off; i zakończyło się pomyślnie.

Więc moja decyzja wygląda

sendfile off; 
expires off;