سؤال كيفية إعداد Nginx بمثابة بروكسي عكس مخبأ؟


سمعت مؤخرًا أن Nginx أضافت ميزة التخزين المؤقت إلى ميزة الوكيل العكسي. نظرت حولي ولم أستطع العثور على معلومات كثيرة عنها.

أرغب في إعداد Nginx كخادم عكسي للتخزين المؤقت أمام Apache / Django: للحصول على طلبات وكيل Nginx لبعض الصفحات الديناميكية (وليس كلها) إلى Apache ، ثم تخزين الصفحات التي تم إنشاؤها وتقديمها لطلبات لاحقة لتلك الصفحات من ذاكرة التخزين المؤقت.

من الناحية المثالية ، أريد إلغاء صلاحية ذاكرة التخزين المؤقت بطريقتين:

  1. قم بتعيين تاريخ انتهاء الصلاحية على العنصر المخبأ
  2. لإلغاء صلاحية العنصر المخبأ بشكل صريح. مثلا إذا قمت بتحديث بياناتي الخلفية لـ Django ، فأنا أريد إخبار Nginx بإلغاء صلاحية ذاكرة التخزين المؤقت للصفحات المتأثرة

هل من الممكن ضبط Nginx للقيام بذلك؟ ماذا؟


139
2018-06-24 01:35


الأصل




الأجوبة:


لا أعتقد أن هناك طريقة لإبطال العناصر المخبأة بشكل صريح ، ولكن هنا مثال على كيفية القيام بالباقي. تحديث: كما ذكر Piotr في إجابة أخرى ، هناك وحدة تطهير مخبأ التي يمكنك استخدامها. يمكنك أيضًا فرض تحديث لعنصر مخبأة باستخدام وكيل nxx's proxy_cache_bypass - راجع جواب شيريان للمزيد من المعلومات.

في هذا التكوين ، سيتم استرداد العناصر التي لا يتم تخزينها مؤقتًا من example.net وتخزينها. سيتم تقديم الإصدارات المخبأة إلى العملاء المستقبليين إلى أن تصبح غير صالحة (60 دقيقة).

سيتم تكريم رؤوس Cache-Control و Expires HTTP ، لذلك إذا كنت تريد تعيين تاريخ انتهاء صريح بشكل صريح ، يمكنك القيام بذلك عن طريق تعيين الرؤوس الصحيحة في كل ما تقوم بالبروكسي.

هناك الكثير من المعلمات التي يمكنك ضبطها - راجع وثائق وحدة البرمجي nginx لمزيد من المعلومات حول كل هذا بما في ذلك تفاصيل حول معنى الإعدادات / المعلمات المختلفة: http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}

94
2017-09-23 20:01



هذه خطوة أولى معقولة للتطبيقات الجديدة التي لا تحتوي على 20k / req / s. - Barry
Barry ما يجب أن يكون steP الثاني؟ - Jürgen Paul
Legit - أنا لا أعرف ، ولكن تقليديا الخطوة الأخيرة هي "الربح" :-) - Stephen C
للأسف ، لا يعمل مع nginx 1.11. منذ آخر تحديث كان منذ حوالي 3 سنوات ، يبدو أن هذا لم يعد الحل. - izogfif
ماذا يكون ال: inactive=600m تعني؟ ليس inactive لنفترض أن الوقت؟ ` [inactive=time] - NeverEndingQueue


يمكنك على وجه التحديد إبطال ذاكرة التخزين المؤقت صفحات من خلال

proxy_cache_bypass       

لنفترض أنك تريد تخزين صفحة مخبأة ، وعيّن ذاكرة التخزين المؤقت بهذه الطريقة

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

الآن ، عندما تريد ذلك إبطال تلك الصفحة وذاكرة التخزين المؤقت مرة أخرى 

قم بإجراء مكالمة سرية مع الرأس

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

وسوف تبطل وذاكرة التخزين المؤقت.

يعمل من nginx 0.7.

كمكافأة إضافية add_header X-Cache-Status يمكن استخدامها للتحقق مما إذا كانت الصفحة من ذاكرة التخزين المؤقت أم لا.


46
2017-11-26 04:00



يمكن فقط تحديث الصفحات المخزنة مؤقتًا عندما تكون الصفحة الجديدة قابلة للتخزين المؤقت أيضًا. إذا أزلت صفحة (404 أو أي أخطاء أخرى يتم عرضها الآن بواسطة الواجهة الخلفية) ، فستقوم الصفحة الآن بإرسال رأس مجموعة ملفات تعريف الارتباط أو رأس "التحكم في المحتوى: خاص" ، ولن يتم "إبطال" المحتوى المخبأ. - rbu


أقترح عليك أن تعطي ورنيش المحاولة. تم تصميم الورنيش على وجه التحديد كمخزن بديل للخادم الوكيل. سيحترم جميع عناوين التحكم في التخزين المؤقت التي ترسلها من خادم المصدر ، والتي تلبي طلبك الأول.

لطلبك الثاني ، إلغاء صريح. توصيتي القوية هي تغيير اسم عنوان url الخاص بالمورد الذي تريد إبطاله ، إما عن طريق إعادة تسمية الملف أو استخدام شكل من أشكال خوارزمية سلسلة الاستعلام المؤقتة. ورنيش لديه PURGE العملية التي ستقوم بإزالة المورد من ذاكرة التخزين المؤقت للورنيش ، لكنها لن تعطيك التحكم في أي مخابئ أخرى بينك وبين المستخدم. كما قلت أنك تريد تطهير أحد الموارد بشكل صريح ، فإن رؤوس التحكم القياسية في http لن تساعدك. في هذه الحالات ، فإن الطريقة الأكثر مضمونة لهزيمة التخزين المؤقت للمورد هي إعادة تسميته.


36
2018-06-24 02:43



هل يمكن أن توضح ما الذي كنت تقصده بـ "إعادة تسمية الملف أو استخدام شكل من أشكال الاستعلام المؤقت للذاكرة المؤقتة"؟ لست متأكدًا من أنني أفهم سبب عدم استخدام فكرة مثل PURGE فكرة جيدة. - Continuation
+1 للطلاء. من الأفضل دائمًا استخدام الأدوات المناسبة لهذا المنصب. - Tom O'Connor
below: لا يوجد أمل تقريبًا في لمس الورنيش في ساحات الأداء وتعدد الاستخدامات. هذا مدعوم من قبل أحد مطوري نواة FreeBSD الرائد وفريق متخصص في أوروبا. الورنيش في الإنتاج في تويتر ، heroku وغيرها الكثير. - Barry
أبسط مثال على cache-buster هو إلحاق رقم إصدار في سلسلة استعلام بمورد ثابت ، بحيث يصبح style.css style.css؟ 123. عندما ترغب في دفع إصدار جديد من الملف ، يمكنك تغيير عنوان url للمورد إلى style.css؟ 124 ، والآن سوف تستلمه ذاكرة التخزين المؤقت كأصل جديد تمامًا ليتم تخزينه مؤقتًا بشكل منفصل. سيقدم Apache ملف style.css مع أي سلسلة استعلام ملحقة ، لذلك لا يلزم إجراء أية تغييرات على الملف الفعلي. - chmac
إذا كان ذلك ممكنًا ، فمن الأفضل وضع bache buster في اسم الملف نفسه ، مثل style.v123.css لأن بعض ذاكرات التخزين المؤقت لن تخزين طلبات التي تحتوي على سلسلة استعلام ذاكرة التخزين المؤقت. - Noah McIlraith


لإبطال الصفحات المختارة ، يمكنك استخدام تصحيح "cache_purge" لـ nginx-0.8.x والذي لا يتضمن ما تريد ؛)

إنه موجود هنا.


7
2017-11-17 07:38





تسمح معظم أدوات التخزين المؤقت (Citrix) بتحديث القوة (Ctrl + r) لإعادة ملء صفحة مخزنة مؤقتًا.

وهنا خدعة وجدت أن تفعل شيئا مماثلا في nginx.

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

يفترض هذا أنه عند إجراء Ctrl + r في المستعرض لديك ، يكون رأس Cache-Control هو max-age = 0 في طلبه. أعرف أن Chrome يفعل ذلك ، ولكن لم أحاول في متصفحات أخرى. يمكن إضافة المزيد من حقول العناوين بسهولة ، وذلك بإضافة المزيد فقط إذا كانت العبارات التي تم تعيينها $eac متغير إلى 1.


6
2018-04-10 23:02





التخزين المؤقت هو وظيفة جديدة في nginx (وليس موثقة بشكل جيد حتى الآن) ، ولكن مستقرة بما يكفي لاستخدامها في الإنتاج.


4
2018-06-24 02:25





أعتقد NginxHttpProxyModule قادر على caheing طلبات http. ابحث عن التوجيهات التي تبدأ بـ:

proxy_cache

نعم ، من الممكن التحكم في سلوك ذاكرة التخزين المؤقت من خلال توجيهات مثل:

proxy_cache_valid

3
2018-06-24 10:12





استنادًا إلى حقيقة أنه لا يمكنك العثور على المستندات عليه ، سأكون حذرة قليلاً بشأن الاعتماد عليه في الإنتاج. هل فكرت في الورنيش؟ إنه "nginx من الوكلاء العكسيين" ، صغير ، خفيف الوزن ، يقوم بعمل واحد ويقوم بعمل جيد.


2
2018-06-24 01:38



الوثائق هنا: wiki.nginx.org/NginxHttpProxyModule#proxy_cache - rmalayter


إذا كنت تستخدم eTags على التطبيق الخاص بك ووضعت nginx أمامه ، فسوف يهتم بانتهاء الصلاحية بالنسبة لك ، لأنه إذا تغير eTag فإنه سيؤدي إلى إبطال ذاكرة التخزين المؤقت.


1
2017-11-16 15:20



هل حقا؟ من النهم مثل ngnix يتطابق مع etag ولا يتحدث أبدا إلى التطبيق لمعرفة ما إذا كان هناك نسخة محدثة. - John Naegle


يمكنك التحكم في انتهاء صلاحية ذاكرة Nginx باستخدام أوامر / معلمات متعددة:

  • proxy_cache_valid 200 302 10m;
  • إضافة أحد رؤوس HTTP أدناه (الأولوية مهمة - تحقق من ذلك بلدي بلوق وظيفة):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • ال inactive المعلمة في proxy_cache_path التوجيه:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

انصح بلدي بلوق وظيفة إذا كنت تريد معرفة المزيد حول التخزين المؤقت Nginx.

موضوع التطهير مثير للاهتمام حقاً لأن هذه الميزة موجودة فقط في Nginx Plus (الإصدار التجاري Nginx). أنا حقا أحب الإجابة @ راندي والاس. ولكن هناك احتمالات أخرى مثل وحدة ngx_cache_purge.

إن أبسط شيء يمكنك القيام به هو إزالة الملف المخزن مؤقتًا يدويًا:

  • توليد مفتاح التجزئة الخاص بك:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • قم بإزالة الملف من نظام الملفات:

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    

1
2018-03-31 18:06