هل يمكن تكوين الورنيش لتجربة خادم ثانٍ لبعض الموارد إذا حصل على 404 من الخادم الأساسي؟

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

  •  29-09-2019
  •  | 
  •  

سؤال

سيكون هذا حلاً مثاليًا بالنسبة لي لأنني بحاجة إلى تقديم بعض المحتوى الذي تم إنشاؤه لمتصفحات الويب. خطتي هي إنشاء المحتوى عند الطلب وتخزينه في المرة القادمة. لا أريد أن تتصل المتصفحات بخدمتي (التي تنشئ المحتوى) في كل مرة. أريدهم أن يذهبوا مباشرة إلى المورد "المخحيط" إذا كان متاحًا ويتصل بالخدمة فقط إذا لم يكن كذلك. لذلك كنت أضع Varinsh أمام الخادم A الذي يقوم بتشغيل الخدمة والخادم B الذي يخزن إصدارات المحتوى التي تم إنشاؤها مسبقًا. إذا حصل على طلب للحصول على مورد ، فإنه لم يتم تخزينه مؤقتًا ، فسوف يجرب الخادم B. عند الحصول على استجابة 404 ، فسوف تطلب نفس المورد من الخادم A.

هل يمكن تكوين الورنيش بهذه الطريقة مع VCL؟ إذا لم يكن هناك حل كهذا تعرف عنه؟

ملاحظة: لا أريد إرسال 302 إعادة توجيه إلى المتصفح بالإضافة إلى أنه ليس لدي تحكم في الخادم B لجعله يرسل هذه عمليات إعادة التوجيه بدلاً من 404

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

المحلول

هذا ممكن تماما في الورنيش. تأكد من أنه في VCL_Fetch (وربما في VCL_ERROR) يمكنك التحقق من رمز حالة الإرجاع (على سبيل المثال تحقق من الحالة> 400) ، قم بإعادة التشغيل إذا فشلت ، وفي VCL_RECV حدد الواجهة الخلفية الأخرى إذا req.restarts> 0. على سبيل المثال:

backend serverA {
   .host="192.168.0.1";
   .port = "80";
}

backend serverB {
   .host = "192.168.0.2";
   .port = "80";
}

sub vcl_recv {
   if (req.restarts == 0) {
       set req.backend = serverB;
   } else {
       set req.backend = serverA;
   }
}

sub vcl_fetch {
    if (obj.status >= 400 && req.restarts == 0) {
        restart;
    }
}

sub vcl_error {
   if (req.restarts == 0) {
       restart;
   }
}

ولكن هذا يقال ، يبدو أنك تعيد اختراع مفهوم خادم ذاكرة التخزين المؤقت. والورنيش هو خادم ذاكرة التخزين المؤقت الرائعة. لماذا لا يكون لديك خادم خلفي واحد (Servera) ولديك ذاكرة التخزين المؤقت الورنيش التي تم إنشاؤها؟ يمكنك إعداد قواعد معقدة وستكون ستحصل على انتهاء صلاحية (من ذاكرة التخزين المؤقت) ، وإدارة التطهير والأداء مجانًا! قون

نصائح أخرى

في هذا المثال ، تُظهر الورنيش محاولة العثور في 6 خوادم ، إن لم يتم العثور عليها ، آخر MSG.

# cat /etc/varnish/default.vcl 
backend serverA {
   .host="10.42.4.104";
   .port = "80";
}

backend serverB {
   .host = "10.42.4.102";
   .port = "80";
}

backend serverC {
   .host = "10.42.4.103";
   .port = "80";
}

backend serverD {
   .host = "10.42.4.101";
   .port = "80";
}

backend serverE {
   .host = "10.42.4.105";
   .port = "80";
}

backend serverF {
   .host = "10.42.4.106";
   .port = "80";
}




sub vcl_recv {
   if (req.restarts == 0) {
       set req.backend = serverA;
   } elseif (req.restarts == 1){
       set req.backend = serverB;
   } elseif (req.restarts == 2){
       set req.backend = serverC;
   } elseif (req.restarts == 3){
       set req.backend = serverD;
   } elseif (req.restarts == 4){
       set req.backend = serverE;
   } else {
       set req.backend = serverF;
   }
}


sub vcl_fetch {
    if (beresp.status >= 400 && req.restarts == 0) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 1) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 2) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 3) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 4) {
        return(restart);
    }
}

sub vcl_error {
   if (req.restarts == 0) {
       return(restart);
   }
   if (req.restarts == 1) {
       return(restart);
   }
   if (req.restarts == 2) {
       return(restart);
   }
   if (req.restarts == 3) {
       return(restart);
   }
   if (req.restarts == 4) {
       return(restart);
   }

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