Vagrant/VirtualBox/Apache2 سلوك غريب في ذاكرة التخزين المؤقت

StackOverflow https://stackoverflow.com/questions/9479117

  •  13-11-2019
  •  | 
  •  

سؤال

أنا أستخدم Vagrant لتشغيل VirtualBox الذي يعمل بنظام Ubuntu مع Apache2.

يقدم خادم الويب، من بين أمور أخرى، ملفات ثابتة من دليل /vagrant الخاص بي.

وهذا يعمل بشكل جيد في معظم الأوقات.ولكن عندما أقوم بتغيير صورة في المجلد المشترك الخاص بي وإعادة تحميل موقع الويب، يتم عرض الإصدار السابق من الصورة، ولكن يتم اقتطاعها.

ينجح الأمر إذا قمت بحذف الصورة القديمة أولاً من المجلد المشترك الخاص بي، وقمت بتحديث موقع الويب حتى لا تظهر الصورة، ثم احفظ الملف الجديد وأعد تحميل موقع الويب مرة أخرى.

هل يعرف أحد عن هذه المشكلة؟ليس لدي أي شيء خاص مثبت، فقط Apache 2 مع mod_rewrite وPHP مع Mongo وAPC Plugin وMongoDB بالإضافة إلى NodeJS مع مجموعة من البرامج النصية.

هل كانت مفيدة؟

المحلول

وجدت الإجابة هنا :

JC،

ما تراه هو ربما لأن الخادم يخدم الملفات الثابتة يستخدم Syscall "sendfile ()"، والذي يتم كسره مع ملف VirtualBox النظام.تحتاج إلى تعطيل استخدام SendFile () في الخادم الخاص بك.لأباتشي:

enablesendfile قبالة

و for nginx: sendfile قبالة.

أفضل، ميتشل

نصائح أخرى

لقد دفعني هذا للجنون!شكرا لنشر هذا فيليب.لأولئك منكم الذين ليس لديهم أي فكرة عن كيفية تغيير ملف التكوين، إليك ما فعلته:

للعثور على الملف: $ sudo find -name "nginx.conf"

خاصتي كانت هنا: ./etc/nginx/nginx.conf

لذلك قمت بتشغيل هذا لتعديله: $ sudo nano ./etc/nginx/nginx.conf

تغيير السطر الذي يحتوي على sendfile on; ل sendfile off;

لا تنسى أن exit و vagrant reload!

هذا خطأ قديم في VirtualBox (راجع: #819, #9069, #12597, #14920) حيث يبدو أن vboxvfs يواجه بعض المشكلات في الوصول المطبق إلى الملفات التي تتم مزامنتها.

قد يحدث هذا عندما تقوم بتحرير الملف خارج الجهاز الافتراضي، وتتوقع رؤية نفس التغيير داخل الجهاز الافتراضي.

للتغلب على هذه المشكلة، تحتاج إلى تعطيل دعم kernel sendfile لتسليم الملفات إلى العميل عن طريق تعطيل EnableSendfile خيار, ، اما في httpd.conf أو في ملف vhosts، على سبيل المثال.

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

وهذه مشكلة خاصة بالنسبة للملفات المثبتة على NFS أو SMB.بعد التغيير، قم بإعادة تحميل Apache.

مماثلة ل Nginx (في nginx.conf)، على سبيل المثال.

sendfile off;

الحل الآخر هو أن تتذكر عدم تحرير الملفات الموجودة على المضيف، أو محاولة إعادة تحرير نفس الملف، ولكن داخل الجهاز الافتراضي.


يتضمن الحل البديل الآخر إسقاط ذاكرة التخزين المؤقت لصفحات Linux، على سبيل المثال.

echo 1 > /proc/sys/vm/drop_caches

أو لمسح ذاكرة التخزين المؤقت كل ثانية (حسب هذا المشنور)، يحاول:

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

ملحوظة:يرمز الرقم 1 إلى تحرير ذاكرة التخزين المؤقت للصفحات، ورقم 2 لذاكرة التخزين المؤقت والأجزاء الداخلية، و3 لذاكرة التخزين المؤقت للصفحات وأسنان الأسنان والإينودات.


يمكن تكرار المشكلة المذكورة أعلاه بواسطة برنامج اختبار mmap التالي، راجع: mmap-problem.c.

لدي مشكلة مماثلة مع بيئة VirtualBox/Docker/Nginx.

القرار بإسقاط ذاكرة التخزين المؤقت لصفحات Linux echo 1 > /proc/sys/vm/drop_caches يعمل بشكل جيد ولكن يبدو محرجا.

وكذلك التوجيه sendfile off; في ال nginx.conf لم يحل المشكلة وحاولت استخدامه مع expires off; التوجيه معًا وكان ناجحًا.

لذلك، يبدو قراري

sendfile off;
expires off;

لأي شخص يستخدم Laravel 5، Barryvdh's Debugbar و Browsersync عبر Gulp.watch، قد تحصل على هذا الخطأ.كان لدي نفس الخطأ بالضبط بسبب كيفية قيام مزامنة المتصفح بوكالة طلبي. إذا رأيت خادم Dev عبر: http://127.0.0.1:3000/laravel/page حصلت على الخطأ http://127.0.0.1/laravel/page خطأ ذهب.

لقد قمت بسمادها مع أصدقائنا في Browsersync، فهي مهمة رهيبة.لذلك، إنه لأكثر من سبب من الحل، ولكن بدلا من قضاء ساعات في محاولة إصلاحه، لاختبار لمعرفة ما إذا كانت هذه هي مشكلتك قبل إضاعة المزيد من الوقت.

هذه المشكلة تشبه أيضا الأخطاء الموجودة في هذه المقالة

كانت هذه مسؤولة أيضا عن السلوك الغريب فيما يتعلق بملفات CSS في إعداد CentoS / VirtualBox.

يمكنك تغيير محتويات ملف CSS في المجلد / المتشرد، وسيعرض المتصفح حالة 200 (بدلا من 304)، مما يعني أنه كان يعرف أن الملف جديد.لكن المحتويات لم تتغير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top