سؤال تعطيل التخزين المؤقت عند تقديم ملفات ثابتة مع Nginx (للتطوير)


نحن نستخدم Nginx لخدمة ملفات ثابتة على منصة تطوير. نظرًا لأنه منصة تطوير ، نود تعطيل ميزة التخزين المؤقت بحيث يتم نشر كل تغيير على الخادم. تكوين VHost بسيط للغاية:

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

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

عندما ندخل إلى ملف HTML (HTTP: //static.server.local/test.html) ، ليس لدينا مشكلة: الخادم بإرجاع رمز 304 غير معدلة طالما لم يتم تغيير الملف ، و 200 حسنا استجابة مع الملف المعدل عند تغيير الملف.
ومع ذلك ، يبدو أنه يتصرف بشكل مختلف مع ملف Javascript أو ملف CSS. بمجرد تغيير الملف ، نحصل على 200 حسنا الاستجابة كما هو متوقع ، ولكن مع النص القديم.
هل هناك آلية ذاكرة تخزين مؤقت داخلية في Nginx يمكن أن تفسر هذا السلوك؟ أو بعض التكوين الذي يجب أن نضيفه؟

كملاحظة جانبية ، في ما يلي العنوان الذي تم إرجاعه بواسطة Nginx عند تعديل الملف (يبدو صحيحًا):

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

تصحيح
بعد تجربة إعدادات مختلفة مع expires التوجيه و Cache-Controlرأس ، لقد أجريت بعض التحقيقات الأخرى. في الواقع ، يتم تثبيت الخادم على ضيف فيرتثلبوإكس أوبونتو ، ويتم قراءة البيانات من مجلد مشترك موجود على مضيف Mac OSX.
إذا تم تحرير الملف من IDE (NetBeans) على المضيف ، يبدو أن التغييرات لا تظهر بينما إذا قمت بتحريره مباشرة على الضيف (باستخدام VIM) ، يتم تحديثه.
الشيء الغريب هو أنها لا تتصرف بالمثل مع ملفات HTML.
محير جدا.

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

sendfile  off;

نأمل أن يساعد هذا أيضًا شخصًا آخر باستخدام VirtualBox للتطوير. :)
هناك بعض المعلومات الإضافية عن منتدى فيرتثلبوإكس.


87
2018-05-13 14:18


الأصل


هل تقوم بتشغيل nginx في vv المتشرد واستخدام fs المشتركة؟ كانت هناك العديد من التقارير عن أعراضك باستخدام هذه المجموعة في #nginx. - kolbyjack
أنا يمكن أن تعانق حرفيا لك! لقد قضيت 48 ساعة شتمًا وغضبًا تمامًا مع هذه المشكلة الدقيقة .. ، وأعيد تجميع nginx عدة مرات ، وضحى ببعض المخلوقات الصغيرة الرقيقة للآلهة المتنوعة ، وتعلمت توجيهات ذاكرة التخزين المؤقت إلى الوراء ... كل ذلك لمعرفته أنه واحد من خط الغرائب ​​لإصلاحه بفضل فيرتثلبوإكس كونها غريبة! - James Butler
سيكون الأمر أكثر وضوحًا إذا كنت ستنشر إجابتك كإجابة وتقبلها حتى يمكن للجميع رؤية أن هذه المشكلة قد تم حلها. - Zombaya
هذا ساعدني كثيرا. شكرا لكم. - Matt M.
لقد تضررت من هذا الخطأ هذا الصباح. لن أدرك أنها كانت إلى المجلد المشترك دون هذا. شكر! - Jaffa The Cake


الأجوبة:


بما أن الإجابة مخفية نوعًا ما في السؤال - فإليك الحل لـ nginx في بيئة VirtualBox كإجابة مستقلة.

في التكوين الخاص بك nginx (usally /etc/nginx/nginx.conf) أو ملف التكوين vhost تغيير sendfile المعلمة ل off:

sendfile  off;

في حين sendfile في قلب شهرة Nginx (ملف ثابت منخفض المستوى يعمل بكفاءة والذي يخدم الكفاءة) قد يكون لعنة للتنمية المحلية ، على سبيل المثال ، Javascripts التي تتغير في كثير من الأحيان وتحتاج إلى إعادة تحميلها. ومع ذلك ، فإن sendfile Nginx ذكية وربما ليست قضية معظم الناس. تحقق من خيارات "تعطيل ذاكرة التخزين المؤقت" في المتصفح أيضًا!


58
2017-11-19 09:52



+1 على الرغم من أن الإجابة يجب أن تفسر لماذا ا هذا ضروري بدلا من ترك القراء على نحو فعال لإيجاد / إعادة قراءة السؤال تبحث عن المراجع. جعل الإجابة تقف على نفسه -> أفضل. - AD7six
يبدو أن هذا هو الجواب بالنسبة لي. يبدو المشكلة تحدث مع تركيبة معينة من Sendfile و VirtualBox ومضيف OSX. abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile  forums.virtualbox.org/viewtopic.php؟f=1&t=24905 - Steve Bennett
sendfile على ما يرام حتى في بيئة التطوير المحلية ؛ انها فقط VirtualBox الذي كسر فيها. وهو سبب واحد (للكثيرين) أوصي بتجنب VirtualBox ... - Michael Hampton♦
شكرا للحفظ ، مشكلة غريبة مع Vagrant / فيرتثلبوإكس / أوبونتو / ووردبرس ، أنا تخمين بي PROD بيئة آمنة مع sendfile على النحو الافتراضي. - sonjz
يحل مشكلتي مع nginx و docker - PascalTurbo


ضبط علامة انتهاء الصلاحية الخاصة بك

expires off;

ويجب أن لا يتم تعيين أي رؤوس تنتهي صلاحيتها على الإطلاق ، كما يمكن أيضًا أن تكون ملفات التخزين المؤقت للمتصفح بشكل غير صحيح


15
2018-05-13 14:20



لسوء الحظ ، لقد حاولت هذا فضلا عن expires -1 والسلوك لا يزال هو نفسه. - Olivier Chappe
في ما يتعلق بالمتصفح ، لقد فكرت في هذه الاحتمالات: كنت أحاول أولاً استخدام Chrome ، وبعد تعديل ملف فتحه للمرة الأولى في Firefox: لا يزال أمامي الإصدار الأول من الملف. - Olivier Chappe
كما يجب أن يكون رأس التحكم في ذاكرة التخزين المؤقت هو CACHE-CONTROL: NO-CACHE - anthonysomerset
أو إزالة رأس التحكم في ذاكرة التخزين المؤقت تمامًا - تعذّر تعديل التعليق السابق - anthonysomerset
على نظام التشغيل Windows ، لا تزال ميزة "انتهاء الصلاحية" لا تعمل على تعطيل التخزين المؤقت لملفات html. محبط للغاية عندما أقوم بتحديث ملف في IDE الخاص بي ، ولكن! $ #٪ ing nginx يقدم إصدارًا قديمًا. - Dan Dascalescu


إذا لم يكن هناك شيء مذكور أعلاه يساعد وما زال Nginx يعيد المحتوى القديم لملفاتك فقد يكون مشكلة متعلقة به open_file_cache.

انظر كمرجع:


2
2017-10-14 20:38





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

قد يحدث هذا عندما تقوم بتحرير الملف خارج VM ، وتتوقع أن ترى نفس التغيير داخل VM.

لحل هذه المشكلة ، تحتاج إلى تعطيل دعم kernel sendfile لتسليم الملفات إلى العميل عن طريق تعطيل EnableSendfile اختيار. هذا مشكلة خاصة لملفات NFS أو SMB التي تم تحميلها.

إلى عن على Nginx (تغيير في nginx.conf) ، على سبيل المثال

sendfile off;

مماثلة لأباتشي (في httpd.conf أو في ملف vhosts) ، على سبيل المثال

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

بعد التغيير ، أعد تحميل Apache.


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


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

echo 1 > /proc/sys/vm/drop_caches

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

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

ملاحظة: يشير الرقم 1 إلى تحرير pagecache ، و 2 for dontries and inodes ، و 3 for pagecache ، و dentries و inodes.


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


2
2017-12-13 14:03





هذا متأخر ، ولكن لا يزال بدون إجابة ، لذلك سأقوم بطعن. لمجرد الضحك ، هل جربت:

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

لم أحاول هذا بنفسي ، ولكن تعلمت تجربة هذا النوع من الأشياء مع Nginx في حاوية الخادم من وقت لآخر عندما يكون لدي مشكلات مشابهة لهذا ...


1
2017-12-28 01:47