שאלה השבת אחסון במטמון בעת ​​הצגת קבצים סטטיים עם 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), אין לנו בעיה: השרת מחזיר קוד לא השתנה כל עוד הקובץ לא השתנה, א 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כותרת, עשיתי כמה חקירות נוספות. למעשה, השרת מותקן על אורח VirtualBox אובונטו, ונתונים נקראים מתיקייה משותפת שנמצאת על המארח של Mac OSX.
אם הקובץ נערך מתוך IDE (NetBeans) במארח, נראה שהשינויים אינם מופיעים, ואילו אני עורך אותו ישירות על האורח (באמצעות VIM), הוא רענן.
הדבר המוזר הוא שזה לא מתנהג באופן דומה עם קבצי HTML.
די תמוה.

ערוך 2 (ANSWER)
ואכן, מקור הבעיה היה יותר בצד VirtualBox. או ליתר דיוק סכסוך בין VirtualBox לבין האפשרות "sendfile" של השרת.
הקישור הזה שונא נתן לי את הפתרון: להחליף את שלח קובץ דגל בתצורת השרת ל כבויYou

sendfile  off;

מקווה שזה יכול גם לעזור לאדם אחר באמצעות VirtualBox לפיתוח. :)
יש מידע נוסף על פורום.


87
2018-05-13 14:18




האם אתה מפעיל nginx ב vmrant vmrant ושימוש משותף fs? היו מספר דוחות על הסימפטומים שלך באמצעות שילוב זה ב- #nginx. - kolbyjack
אני ממש יכול לחבק אותך !! ביליתי 48 שעות מקלל הולך מטורף לגמרי עם בעיה זו .., recompiled nginx כמה פעמים, הקריב כמה יצורים קטנים fluffy לאלים שונים, למדו את ההוראות המטמון לאחור ... כל לגלות שזה אחד מוזרות שורה לתקן תודה VirtualBox להיות מוזר! - James Butler
זה יהיה הרבה יותר ברור אם היית לפרסם את התשובה שלך כמו תשובה ולקבל את זה אז כולם יכולים לראות כי בעיה זו נפתרה. - Zombaya
זה עזר לי הרבה. תודה. - Matt M.
פגעתי בבאג הזה הבוקר. לא הייתי מבין שזה היה למטה לתיקיה משותפת בלי זה. תודה! - Jaffa The Cake


תשובות:


מאחר שהתשובה מוסתרת בצורה כלשהי בשאלה - הנה הפתרון עבור nginx בסביבת VirtualBox כתשובה עצמאית.

בתצורת nginx (usally /etc/nginx/nginx.conf) או בקובץ config vhost לשנות את sendfile פרמטר offYou

sendfile  off;

בזמן sendfile הוא בלב התהילה של Nginx (רמה נמוכה במהירות נמוכה סטטית לשרת יעילות הקובץ) זה עשוי להיות קללה לפיתוח מקומי, למשל. Javascripts כי שינוי לעתים קרובות ויש צורך לטעון מחדש. עם זאת, Nginx Sendfile הוא חכם והוא כנראה לא הבעיה של רוב האנשים; לבדוק את הדפדפן "השבת מטמון" אפשרויות גם כן!


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 / VirtualBox / אובונטו / Wordpress, אני מנחש הסביבה 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
או להסיר את כותרת המטמון לגמרי - סליחה couldnt לערוך תגובה קודמת - 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 גישה לקבצים אשר synched.

הדבר עלול לקרות כאשר אתה עורך את הקובץ מחוץ ל- VM, ואתה מצפה לראות את אותו שינוי בתוך ה- VM.

כדי לעקוף בעיה זו, אתה צריך להשבית את התמיכה sendfile הקרנל כדי לספק קבצים ללקוח על ידי השבתת EnableSendfile אפשרות. זו בעיה במיוחד עבור קבצים נטענים NFS או SMB.

ל Nginx (שינוי nginx.conf), למשל

sendfile off;

דומה עבור Apache (ב httpd.conf או בקובץ vhosts), למשל.

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

לאחר השינוי טען מחדש את אפאצ 'י.


פתרון אפשרי אחר הוא רק לא כדי לערוך את הקבצים על המחשב המארח, או לנסות לערוך מחדש את אותו קובץ, אבל בתוך VM.


שיטה נוספת לעקיפת הבעיה כוללת הפלת ה- pagecache של Linux, למשל.

echo 1 > /proc/sys/vm/drop_caches

או כדי לנקות את המטמון בכל שנייה (לפי הפוסט הזה), נסה:

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

הערה: מספר 1 מייצג שחרור pagecache, 2 עבור dentries ו inodes, 3 עבור pagecache, dentries ו inodes.


את הבעיה לעיל ניתן לשכפל על ידי התוכנית הבאה mmap הבדיקה, ראה: mmap-problem.c.


2
2017-12-13 14:03





זה מאוחר, אבל עדיין מסומן ללא מענה, אז אני אקח דקירה. רק עבור צחקוקים, ניסית:

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

לא ניסיתי את זה בעצמי, אבל למדו לנסות את זה סוג של דבר עם Nginx במיכל שרת מעת לעת, כאשר יש לי בעיות דומות לזה ...


1
2017-12-28 01:47