Nginx (বিকাশের জন্য) সাথে স্থির ফাইলগুলি সরবরাহ করার সময় ক্যাচিং অক্ষম করুন


89

আমরা ডেভলপমেন্ট প্ল্যাটফর্মে স্ট্যাটিক ফাইলগুলি পরিবেশন করতে Nginx ব্যবহার করছি। এটি একটি উন্নয়ন প্ল্যাটফর্ম হিসাবে, আমরা ক্যাচিং অক্ষম করতে চাই যাতে প্রতিটি পরিবর্তনটি সার্ভারে প্রচারিত হয়। ভিহস্টের কনফিগারেশনটি বেশ সহজ:

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 ঠিক আছে সঙ্গে প্রতিক্রিয়া ফাইল পরিবর্তন করা হলে পরিবর্তিত ফাইল।
তবে এটি জাভাস্ক্রিপ্ট বা সিএসএস ফাইলের সাথে আলাদা আচরণ করছে বলে মনে হচ্ছে। একবার ফাইল পরিবর্তন হয়ে গেলে, আমরা প্রত্যাশা অনুযায়ী 200 ওকে প্রতিক্রিয়া পাই তবে পুরানো পাঠ্য সহ।
এনগিনেক্সে কোনও অভ্যন্তরীণ ক্যাশে প্রক্রিয়া রয়েছে যা এই আচরণটি ব্যাখ্যা করতে পারে? বা কিছু কনফিগারেশন যা আমাদের যুক্ত করা উচিত?

পার্শ্ব নোট হিসাবে, ফাইলটি সংশোধন করার পরে এনগিনেক্সের দেওয়া শিরোনাম এখানে রয়েছে (এটি সঠিক বলে মনে হচ্ছে):

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হেডার, আমি আরও তদন্ত করেছেন। প্রকৃতপক্ষে, সার্ভারটি ভার্চুয়ালবক্স অতিথি উবুন্টুতে ইনস্টল করা আছে এবং ম্যাক ওএসএক্স হোস্টে থাকা একটি ভাগ করা ফোল্ডার থেকে ডেটা পড়া হয়।
যদি হোস্টের কোনও আইডিই (নেটবিয়ান) থেকে ফাইলটি সম্পাদনা করা হয়, মনে হয় পরিবর্তনগুলি উপস্থিত হয় না, তবে আমি যদি এটি সরাসরি অতিথির (ভিআইএম ব্যবহার করে) সম্পাদনা করি তবে তা রিফ্রেশ হয়।
আশ্চর্যের বিষয় এটি এইচটিএমএল ফাইলগুলির সাথে একই রকম আচরণ করে না।
বেশ চমকপ্রদ।

সম্পাদনা 2 (উত্তর)
প্রকৃতপক্ষে, ভার্চুয়ালবক্স দিকে ইস্যুটির উত্স আরও ছিল। অথবা বরং ভার্চুয়ালবক্স এবং সার্ভারের "সেন্ডফিল" বিকল্পের মধ্যে বিরোধ।
এই লিঙ্কটি VirtualBox ঘৃণা করেন, Sendfile আমাকে সমাধান দিয়েছেন: সুইচ sendfile সার্ভার কনফিগারেশনে পতাকা বন্ধ :

sendfile  off;

আশা করি এটি উন্নয়নের জন্য ভার্চুয়ালবক্স ব্যবহার করা অন্য ব্যক্তিকেও সহায়তা করতে পারে। :) ভার্চুয়ালবক্স ফোরামে
কিছু অতিরিক্ত তথ্য রয়েছে ।


3
আপনি কি কোনও ভ্রমন ভিএম-তে এনগিনেক্স চালাচ্ছেন এবং ভাগ করা fs ব্যবহার করছেন? # লিঙ্কে এই সংমিশ্রণটি ব্যবহার করে আপনার লক্ষণগুলির বেশ কয়েকটি প্রতিবেদন এসেছে।
কলবিজ্যাক

3
আমি আপনাকে আক্ষরিকভাবে আলিঙ্গন করতে পারে !! এই সঠিক সমস্যাটি নিয়ে 48 ঘন্টা অভিশাপ এবং সম্পূর্ণ উন্মত্ত হয়ে কাটিয়েছেন .., এনজিনেক্সকে কয়েকবার পুনরায় কম্পাইল করেছেন, বিভিন্ন দেবদেবীর উদ্দেশ্যে কিছু ছোট ফুঁকড়ানো প্রাণীর ত্যাগ করেছেন, ক্যাশের দিকনির্দেশগুলি পিছনের দিকে শিখলেন ... এটি নির্ধারণের জন্য এটি একটি লাইন বিজোড়তা ভার্চুয়ালবক্সকে অদ্ভুত বলে ধন্যবাদ!
জেমস বাটলার

13
আপনি যদি নিজের উত্তরটি উত্তর হিসাবে পোস্ট করেন এবং তা স্বীকার করেন তবে এটি আরও পরিষ্কার হয়ে যাবে যাতে প্রত্যেকে দেখতে পাবে যে এই সমস্যাটির সমাধান হয়েছে।
লম্বায়া

আমি আজ সকালে এই বাগ দ্বারা আঘাত পেয়েছি। এটি না থাকলে ভাগ করে নেওয়া ফোল্ডারে নেমে যাওয়ার বিষয়টি বুঝতে পারতেন না। ধন্যবাদ!
JaffaTheCake

ধন্যবাদ! আমি যেমন বুঝতে পারি যে এই মুহূর্তে এই বাগটি ঠিক করার কোনও উপায় নেই? আমার যদি প্রেরণ ফাইলটি সক্ষম হওয়ার দরকার হয় তবে? :-)
দিমিত্রি বেলভেন্টেভ

উত্তর:


57

যেহেতু উত্তরটি কোনওভাবে প্রশ্নের মধ্যে লুকানো রয়েছে - একক ভার্চুয়ালবক্স পরিবেশে এনগিনেক্সের সমাধান এখানে একক উত্তর হিসাবে।

আপনার এনগিনেক্স কনফিগারেশনে (usally /etc/nginx/nginx.conf) বা vhost কনফিগারেশন ফাইলটিতে sendfileপ্যারামিটারটি এতে পরিবর্তন করুন off:

sendfile  off;

যদিও sendfileএনগিনেক্সের খ্যাতির কেন্দ্রবিন্দুতে রয়েছে (জ্বলজ্বলে দ্রুত নিম্ন-স্তরের স্ট্যাটিক ফাইল পরিবেশন দক্ষতা) এটি স্থানীয় বিকাশের জন্য নিষিদ্ধ হতে পারে, যেমন জাভাস্ক্রিপ্টগুলি যা প্রায়শই পরিবর্তিত হয় এবং পুনরায় লোড করা প্রয়োজন। তবুও এনগিনেক্স প্রেরণ ফাইলটি স্মার্ট এবং সম্ভবত বেশিরভাগ মানুষের সমস্যা নয়; আপনার ব্রাউজারের "অক্ষম ক্যাশে" বিকল্পগুলিও পরীক্ষা করে দেখুন!


5
+1 যদিও উত্তরটি ব্যাখ্যা করা উচিত কেন প্রয়োজনীয়ভাবে পাঠকদের রেফারেন্সগুলি অনুসন্ধান করতে / পুনরায় পড়ার জন্য উল্লেখগুলি অনুসন্ধানের পরিবর্তে প্রয়োজনীয়। উত্তরটি নিজের পক্ষে স্থির করুন -> আরও ভাল।
AD7six

2
এটি আমার কাছে উত্তর বলে মনে হচ্ছে। সমস্যাটি সেন্ডফিল, ভার্চুয়ালবক্স এবং একটি ওএসএক্স হোস্টের নির্দিষ্ট সংমিশ্রণের সাথে দেখা দিয়েছে। abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile forums.virtualbox.org/viewtopic.php?f=1&t=24905
স্টিভ বেনেট

sendfileএমনকি স্থানীয় উন্নয়নের পরিবেশের জন্যও এটি ঠিক আছে; এটি কেবল ভার্চুয়ালবক্স যা এটি ভেঙে গেছে। কোনটি কারণ (অনেকের) আমি VirtualBox এড়ানো সুপারিশ ... হয়
মাইকেল হ্যাম্পটন

ভ্যাগ্রান্ট / ভার্চুয়ালবক্স / উবুন্টু / ওয়ার্ডপ্রেস সহ অদ্ভুত সমস্যাটি সংরক্ষণের জন্য ধন্যবাদ, আমি অনুমান করছি যে আমার প্রড পরিবেশটি ডিফল্ট হিসাবে সেন্ডফাইলে নিরাপদ।
sonjz

Nginx এবং ডকার দিয়ে আমার সমস্যা সমাধান করে
পাসকাল্টুর্বো

15

আপনার মেয়াদ উত্তীর্ণ ট্যাগ সেট করুন

expires off;

এবং এটিতে কোনও মেয়াদ উত্তীর্ণ শিরোনাম সেট করা উচিত নয়, এটি আপনার ব্রাউজারকে ভুলভাবে ক্যাশে করা ফাইলও হতে পারে


দুর্ভাগ্যক্রমে, আমি এটিও চেষ্টা করেছি expires -1এবং আচরণ এখনও একইরকম।
অলিভিয়ার চ্যাপে

ব্রাউজার সম্পর্কিত, আমি এই সম্ভাবনাগুলি সম্পর্কে ভেবে দেখেছি: আমি প্রথমে ক্রোমের সাহায্যে চেষ্টা করেছিলাম, এবং কোনও ফাইল সংশোধন করার পরে ফায়ারফক্সে এটি প্রথমবারের জন্য খুলল: আমি এখনও ফাইলটির প্রথম সংস্করণ পেয়েছি।
অলিভিয়ার চ্যাপে

এছাড়াও ক্যাশে-নিয়ন্ত্রণ
শিরোনামটি

বা সম্পূর্ণরূপে ক্যাশে নিয়ন্ত্রণ শিরোলেখ সরিয়ে ফেলুন - দুঃখিত পূর্ববর্তী মন্তব্য সম্পাদনা করতে
পারেনি

1
উইন্ডোজে, "মেয়াদ শেষ হয়ে যায়" এখনও এইচটিএমএল ফাইলের ক্যাচিং অক্ষম করে না। আমি যখন আমার আইডিইতে কোনও ফাইল আপডেট করি তখন হতাশাজনক, তবে!% #% Ing এনগিনেক্স একটি পুরানো সংস্করণ পরিবেশন করে।
ড্যান ড্যাসক্লেস্কু

2

উপরে উল্লিখিত কিছুই যদি সহায়তা না করে এবং তবুও এনগিনেক্স আপনার ফাইলগুলির পুরানো সামগ্রী ফেরত দেয় তবে এটি সম্পর্কিত সমস্যা হতে পারে open_file_cache

রেফারেন্স হিসাবে দেখুন:


2

এটি ভার্চুয়ালবক্সের পুরানো বাগ (দেখুন: # 819 , # 9069 , # 12597 , # 14920 ) যেখানে vboxvf গুলি সিঙ্ক হওয়া ফাইলগুলিতে এমএম্যাপ করা অ্যাক্সেস নিয়ে কিছু সমস্যা বলে মনে হচ্ছে।

আপনি যখন ভিএম এর বাইরে ফাইলটি সম্পাদনা করবেন তখন এটি ঘটতে পারে এবং আপনি ভিএম এর মধ্যেও একই পরিবর্তনটি দেখবেন বলে আশা করছেন।

এই সমস্যার সমাধানের জন্য, ক্লায়েন্টের কাছে ফাইলগুলি বিতরণ করতে EnableSendfileঅপশনটি অক্ষম করার মাধ্যমে আপনাকে কার্নেল সেন্ডফিল সমর্থনটি অক্ষম করতে হবে । এটি বিশেষত এনএফএস বা এসএমবি মাউন্ট করা ফাইলগুলির জন্য সমস্যা।

জন্যNginx (পরিবর্তন nginx.conf), যেমন

sendfile off;

অ্যাপাচি ( httpd.confvhosts ফাইলে বা এর মধ্যে) এর জন্য অনুরূপ , যেমন

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

পরিবর্তনের পরে অ্যাপাচি পুনরায় লোড করুন।


অন্যান্য সম্ভাব্য সমাধানটি কেবল হোস্টে থাকা ফাইলগুলি সম্পাদনা না করা, বা একই ফাইলটি পুনরায় সম্পাদনা করার চেষ্টা না করা, তবে ভিএম-এর মধ্যে রাখা উচিত।


লিনাক্সের পেজকেচে ফেলে রাখা যেমন অন্য একটি কাজের অন্তর্ভুক্ত

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


1

এটি দেরি হয়ে গেছে, তবে এখনও উত্তর না পেয়ে চিহ্নিত হয়েছে, তাই আমি ছুরিকাঘাত করব। কেবল গিগলসের জন্য, আপনি কি চেষ্টা করেছেন:

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

এটি নিজে চেষ্টা করে দেখিনি, তবে সময় সময় সময়ে সার্ভার পাত্রে Nginx এর সাথে এই জাতীয় জিনিসটি ব্যবহার করতে শিখেছি যখন আমার এর মতো সমস্যা রয়েছে ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.