أفضل الممارسات لنشر تطبيقات الويب Java بأقل وقت توقف؟

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

سؤال

عند نشر تطبيق ويب Java كبير (> 100 ميجابايت .war)، أستخدم حاليًا عملية النشر التالية:

  • يتم توسيع ملف التطبيق .war محليًا على جهاز التطوير.
  • التطبيق الموسع هو rsync:ed من جهاز التطوير إلى البيئة الحية.
  • تتم إعادة تشغيل خادم التطبيق في البيئة المباشرة بعد rsync.هذه الخطوة ليست مطلوبة بشدة، ولكنني وجدت أن إعادة تشغيل خادم التطبيق عند النشر يتجنب "java.lang.OutOfMemoryError:مساحة PermGen" بسبب التحميل المتكرر للفصل.

الأشياء الجيدة في هذا النهج:

  • يعمل rsync على تقليل كمية البيانات المرسلة من جهاز التطوير إلى البيئة الحية.يستغرق تحميل ملف .war بأكمله أكثر من عشر دقائق، بينما يستغرق rsync بضع ثوانٍ.

الأشياء السيئة في هذا النهج:

  • أثناء تشغيل rsync، تتم إعادة تشغيل سياق التطبيق منذ تحديث الملفات.من الناحية المثالية، يجب أن تتم إعادة التشغيل بعد اكتمال rsync، وليس عندما يكون قيد التشغيل.
  • تؤدي إعادة تشغيل خادم التطبيق إلى توقف العمل لمدة دقيقتين تقريبًا.

أرغب في العثور على عملية نشر بالخصائص التالية:

  • الحد الأدنى من التوقف أثناء عملية النشر.
  • الحد الأدنى من الوقت المستغرق في تحميل البيانات.
  • إذا كانت عملية النشر خاصة بخادم التطبيق، فيجب أن يكون خادم التطبيق مفتوح المصدر.

سؤال:

  • في ضوء المتطلبات المذكورة، ما هي عملية النشر الأمثل؟
هل كانت مفيدة؟

المحلول

لقد لوحظ أن rsync لا يعمل بشكل جيد عند دفع التغييرات إلى ملف WAR.والسبب في ذلك هو أن ملفات WAR هي في الأساس ملفات ZIP، ويتم إنشاؤها افتراضيًا باستخدام ملفات أعضاء مضغوطة.تؤدي التغييرات الصغيرة التي يتم إجراؤها على ملفات الأعضاء (قبل الضغط) إلى اختلافات واسعة النطاق في ملف ZIP، مما يجعل خوارزمية نقل دلتا الخاصة بـ rsync غير فعالة.

أحد الحلول الممكنة هو استخدام jar -0 ... لإنشاء ملف WAR الأصلي.ال -0 الخيار يقول jar أمر بعدم ضغط ملفات الأعضاء عند إنشاء ملف WAR.اذا متى rsync بمقارنة الإصدارات القديمة والجديدة من ملف WAR، يجب أن تكون خوارزمية نقل دلتا قادرة على إنشاء اختلافات صغيرة.ثم قم بترتيب أن يرسل rsync الاختلافات (أو الملفات الأصلية) في شكل مضغوط؛على سبيل المثاليستخدم rsync -z ... أو دفق/نقل بيانات مضغوطة تحتها.

يحرر:اعتمادًا على كيفية تنظيم ملف WAR، قد يكون من الضروري أيضًا استخدامه jar -0 ... لإنشاء ملفات JAR المكونة.سينطبق هذا على ملفات JAR التي تخضع للتغيير بشكل متكرر (أو التي يتم إعادة بنائها ببساطة)، بدلاً من ملفات JAR الثابتة التابعة لجهات خارجية.

من الناحية النظرية، يجب أن يوفر هذا الإجراء تحسنًا ملحوظًا مقارنة بإرسال ملفات WAR العادية.من الناحية العملية، لم أجرب هذا، لذا لا أستطيع أن أعد بأنه سينجح.

الجانب السلبي هو أن ملف WAR الذي تم نشره سيكون أكبر بكثير.قد يؤدي هذا إلى أوقات أطول لبدء تشغيل تطبيق الويب، على الرغم من أنني أظن أن التأثير سيكون هامشيًا.


هناك طريقة مختلفة تمامًا تتمثل في النظر إلى ملف WAR الخاص بك لمعرفة ما إذا كان بإمكانك تحديد ملفات JAR الخاصة بالمكتبة والتي من المحتمل ألا تتغير (تقريبًا) أبدًا.أخرج ملفات JAR هذه من ملف WAR، ثم انشرها بشكل منفصل في خادم Tomcat common/lib الدليل؛على سبيل المثالاستخدام rsync.

نصائح أخرى

تحديث:

منذ كتابة هذه الإجابة لأول مرة، ظهرت طريقة أفضل لنشر ملفات الحرب إلى القط بدون توقف.في الإصدارات الأخيرة من Tomcat، يمكنك تضمين أرقام الإصدارات في أسماء ملفات الحرب الخاصة بك.على سبيل المثال، يمكنك نشر الملفات ROOT##001.war و ROOT##002.war لنفس السياق في وقت واحد.كل شيء بعد ## يتم تفسيره كرقم إصدار بواسطة Tomcat وليس جزءًا من مسار السياق.سيحافظ Tomcat على تشغيل جميع إصدارات تطبيقك ويقدم الطلبات والجلسات الجديدة إلى الإصدار الأحدث الذي تم تشغيله بالكامل بينما يكمل الطلبات والجلسات القديمة بأمان على الإصدار الذي بدأت به.يمكن أيضًا تحديد أرقام الإصدارات عبر مدير Tomcat وحتى مهام catalina ant.مزيد من المعلومات هنا.

الجواب الأصلي:

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

ما الخطأ في استخدام تطبيق Tomcat manager لإجراء عمليات النشر الخاصة بك؟إذا كنت لا ترغب في تحميل ملف الحرب بأكمله مباشرة إلى تطبيق Tomcat manager من موقع بعيد، فيمكنك مزامنته (غير مضغوط للأسباب المذكورة أعلاه) إلى موقع عنصر نائب في مربع الإنتاج، وإعادة حزمه في حرب، و ثم سلمها إلى المدير محليا.توجد مهمة رائعة تأتي مع Tomcat مما يسمح لك بكتابة عمليات النشر باستخدام تطبيق Tomcat manager.

هناك عيب إضافي في أسلوبك لم تذكره:أثناء نشر تطبيقك جزئيًا (أثناء عملية rsync)، قد يكون تطبيقك في حالة غير متسقة حيث قد تكون الواجهات التي تم تغييرها غير متزامنة، وقد لا تكون التبعيات الجديدة/المحدثة متاحة، وما إلى ذلك.بالإضافة إلى ذلك، اعتمادًا على المدة التي تستغرقها مهمة rsync، قد يتم إعادة تشغيل تطبيقك فعليًا عدة مرات.هل تعلم أنه يمكنك ويجب عليك إيقاف تشغيل سلوك الاستماع للملفات المتغيرة وإعادة التشغيل في Tomcat؟في الواقع لا ينصح به لأنظمة الإنتاج.يمكنك دائمًا إجراء إعادة تشغيل يدوية أو مكتوبة مسبقًا لتطبيقك باستخدام تطبيق Tomcat manager.

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

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

باستخدام Tomcat كمثال - يمكنك استخدام CATALINA_BASE لتحديد دليل حيث سيتم العثور على كافة أدلة العمل الخاصة بـ Tomcat، بشكل منفصل عن الكود القابل للتنفيذ.في كل مرة أقوم بنشر برنامج، أقوم بالنشر إلى دليل أساسي جديد حتى أتمكن من الحصول على كود جديد مقيم على القرص بجوار الكود القديم.يمكنني بعد ذلك بدء مثيل آخر لـ Tomcat الذي يشير إلى الدليل الأساسي الجديد، وتشغيل كل شيء، ثم تبديل العملية القديمة (رقم المنفذ) بالعملية الجديدة في موازن التحميل.

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

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

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

نصيحتي هي استخدام rsync مع الإصدارات المفصّلة ولكن مع نشر ملف حرب.

  1. قم بإنشاء مجلد مؤقت في البيئة المباشرة حيث سيكون لديك إصدار موسع من تطبيق الويب.
  2. انفجرت إصدارات Rsync.
  3. بعد نجاح rsync، قم بإنشاء ملف حرب في مجلد مؤقت في جهاز البيئة المباشرة.
  4. استبدل الحرب القديمة في دليل نشر الخادم بأخرى جديدة من المجلد المؤقت.

يوصى باستبدال الحرب القديمة بحرب جديدة في حاوية JBoss (التي تعتمد على Tomcat) لأنها عملية ذرية وسريعة ومن المؤكد أنه عندما يبدأ الناشر، سيكون التطبيق بأكمله في حالة النشر.

ألا يمكنك عمل نسخة محلية من تطبيق الويب الحالي على خادم الويب، وrsync إلى هذا الدليل، ثم ربما حتى استخدام الروابط الرمزية، في "انتقال واحد"، قم بتوجيه Tomcat إلى نشر جديد دون توقف طويل؟

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

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

قم بتشغيل خادمين للتطبيقات:قم بتشغيل خادم التطبيق الثاني (الذي يستمع إلى منافذ TCP الأخرى) وقم بنشر التطبيق الخاص بك هناك.بعد النشر، قم بتحديث تكوين Apache httpd (mod_jk أو mod_proxy) للإشارة إلى خادم التطبيق الثاني.إعادة تشغيل عملية Apache httpd بأمان.بهذه الطريقة لن يكون لديك أي وقت توقف وسيتم إعادة توجيه المستخدمين والطلبات الجديدة تلقائيًا إلى خادم التطبيق الجديد.

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

هذا يعتمد على بنية التطبيق الخاص بك.

يوجد أحد تطبيقاتي خلف وكيل لموازنة التحميل، حيث أقوم بإجراء نشر متدرج - مما يؤدي إلى القضاء على وقت التوقف عن العمل بشكل فعال.

إذا كانت الملفات الثابتة تمثل جزءًا كبيرًا من حرب WAR الكبيرة (100Mo كبيرة جدًا)، فقم بوضعها خارج WAR ونشرها على خادم ويب (على سبيل المثال.Apache) أمام خادم التطبيق الخاص بك قد يؤدي إلى تسريع الأمور.علاوة على ذلك، عادةً ما يقوم Apache بعمل أفضل في خدمة الملفات الثابتة مقارنة بمحرك servlet (حتى لو حقق معظمهم تقدمًا كبيرًا في هذا المجال).

لذا، بدلاً من إنتاج حرب كبيرة من الدهون، ضعها في النظام الغذائي وأنتج:

  • ملف مضغوط كبير الحجم يحتوي على ملفات ثابتة لـ Apache
  • حرب أقل دهونًا لمحرك servlet.

اختياريًا، انتقل إلى أبعد من عملية جعل WAR أرق:إن أمكن، قم بنشر Grails وملفات JAR الأخرى التي لا تتغير بشكل متكرر (وهذا هو الحال على الأرجح في معظمها) على مستوى خادم التطبيق.

إذا نجحت في إنتاج حرب أخف، فلن أزعج نفسي بمزامنة الأدلة بدلاً من الأرشيف.

نقاط قوة هذا النهج:

  1. يمكن أن يتم "نشر" الملفات الثابتة على Apache (على سبيل المثال.استخدم رابطًا رمزيًا يشير إلى الدليل الحالي، وقم بفك ضغط الملفات الجديدة، وقم بتحديث الارتباط الرمزي، وها هو voilà).
  2. ستكون حرب الحرب أرق وسيستغرق نشرها وقتًا أقل.

ضعف هذا النهج:

  1. يوجد خادم آخر (خادم الويب) لذا فإن هذا يضيف (قليلًا) المزيد من التعقيد.
  2. ستحتاج إلى تغيير البرامج النصية للإنشاء (وليست مشكلة IMO كبيرة).
  3. ستحتاج إلى تغيير منطق rsync.

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

مثلك تمامًا، لا أتذكر أبدًا إجراء إعادة انتشار أو تحديث كامل للحرب.في معظم الأحيان، تقتصر تحديثاتي على عدد قليل من ملفات jsp، وربما مكتبة، وبعض ملفات الفئة.أنا قادر على إدارة وتحديد العناصر المتأثرة، وعادة ما نقوم بتجميع هذه التحديثات في ملف مضغوط، إلى جانب البرنامج النصي للتحديث.سأقوم بتشغيل البرنامج النصي للتحديث.يقوم البرنامج النصي بما يلي:

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

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

الشيء الآخر الذي يثير فضولي هو، لماذا الحاجة إلى rsync؟يجب أن تكون قادرًا على معرفة ما هي التغييرات المطلوبة، من خلال تحديدها في بيئة التدريج/التطوير الخاصة بك، وليس إجراء عمليات فحص دلتا مع البث المباشر.في معظم الحالات، سيتعين عليك ضبط rsync الخاص بك لتجاهل الملفات على أي حال، مثل بعض ملفات الخصائص التي تحدد الموارد التي يستخدمها خادم الإنتاج، مثل اتصال قاعدة البيانات، وخادم smtp، وما إلى ذلك.

آمل أن يكون هذا مفيدا.

ما هي مجموعة PermSpace الخاصة بك؟أتوقع أن أرى هذا ينمو أيضًا ولكن يجب النزول بعد جمع الطبقات القديمة؟(أم أن ClassLoader لا يزال موجودًا؟)

بالتفكير بصوت عالٍ، يمكنك rsync إلى إصدار منفصل أو دليل مسمى بالتاريخ.إذا كانت الحاوية تدعم الروابط الرمزية، فهل يمكنك إيقاف عملية الجذر، وتبديل جذر نظام ملفات السياق عبر رابط رمزي، ثم SIGCONT؟

أما بالنسبة لإعادة تشغيل السياق المبكر.تحتوي جميع الحاويات على خيارات تكوين لتعطيل إعادة النشر التلقائي في ملف الفئة أو تغييرات الموارد الثابتة.ربما لا يمكنك تعطيل عمليات إعادة النشر التلقائية على تغييرات web.xml، لذا فإن هذا الملف هو آخر ملف يتم تحديثه.لذا، إذا قمت بتعطيل إعادة النشر التلقائي وتحديث web.xml باعتباره الأخير، فسترى إعادة تشغيل السياق بعد التحديث كله.

نقوم بتحميل الإصدار الجديد من تطبيق الويب إلى دليل منفصل، ثم ننتقل لتبديله بالإصدار قيد التشغيل، أو نستخدم الروابط الرمزية.على سبيل المثال، لدينا رابط رمزي في دليل Tomcat webapps المسمى "myapp"، والذي يشير إلى تطبيق الويب الحالي المسمى "myapp-1.23".نقوم بتحميل تطبيق الويب الجديد إلى "myapp-1.24".عندما يصبح كل شيء جاهزًا، أوقف الخادم، وأزل الارتباط الرمزي وأنشئ رابطًا جديدًا يشير إلى الإصدار الجديد، ثم ابدأ تشغيل الخادم مرة أخرى.

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

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

العيب الرئيسي لموقفك هو أن التحميل سيستغرق وقتًا أطول، نظرًا لأن طريقتك تسمح لـ rsync بنقل الملفات المعدلة أو المضافة فقط.يمكنك نسخ مجلد تطبيق الويب القديم إلى المجلد الجديد أولاً، ثم إجراء rsync إليه، إذا كان يحدث فرقًا كبيرًا، وإذا كان يمثل مشكلة بالفعل.

يحتوي Tomcat 7 على ميزة جميلة تسمى "النشر الموازي" الذي تم تصميمه لحالة الاستخدام هذه.

جوهر الأمر هو أنك تقوم بتوسيع .war إلى دليل، إما مباشرة ضمن webapps/ أو مرتبط به.الإصدارات المتعاقبة من التطبيق موجودة في الدلائل المسماة app##version, ، على سبيل المثال myapp##001 و myapp##002.سوف يتعامل Tomcat مع الجلسات الحالية التي تنتقل إلى الإصدار القديم، والجلسات الجديدة التي تنتقل إلى الإصدار الجديد.

المهم هو أنه عليك أن تكون كذلك جداً كن حذرًا مع تسريبات PermGen.هذا صحيح بشكل خاص مع Grails التي تستخدم الكثير من PermGen.VisualVM هو صديقك.

ما عليك سوى استخدام خادمين أو أكثر من خوادم Tomcat مع وجود وكيل فوقهما.يمكن أن يكون هذا الوكيل من apache/nignix/haproxy.

يوجد الآن في كل خادم وكيل عنوان URL "داخل" و"خارج" مع منافذ تم تكوينها.

قم أولاً بنسخ حربك في Tomcat دون إيقاف الخدمة.بمجرد نشر الحرب، يتم فتحها تلقائيًا بواسطة محرك القط.

لاحظ التحقق من unpackWARs = "true" و autoDeploy = "true" في العقدة "Host" داخل server.xml

يبدو مثل هذا

  <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">

شاهد الآن سجلات Tomcat.إذا لم يكن هناك خطأ فهذا يعني أنه تم بنجاح.

الآن اضغط على جميع واجهات برمجة التطبيقات للاختبار

تعال الآن إلى الخادم الوكيل الخاص بك.

ما عليك سوى تغيير تعيين عنوان URL للخلفية باسم الحرب الجديدة.نظرًا لأن التسجيل في الخوادم الوكيلة مثل Apache/nignix/haProxy استغرق وقتًا أقل جدًا، فستشعر بالحد الأدنى من وقت التوقف عن العمل

يشير إلى -- https://developers.google.com/speed/pagespeed/module/domains لتعيين عناوين URL

أنت تستخدم الراتنج، وقد تم تضمين الراتنج في الدعم لإصدارات تطبيقات الويب.

http://www.caucho.com/resin-4.0/admin/deploy.xtp#VersioningandGracefulUpgrades

تحديث:يمكن أن تساعد عملية المراقبة الخاصة بها في حل مشكلات الفضاء الدائم أيضًا.

ليست "أفضل الممارسات" ولكنها شيء فكرت فيه للتو.

ماذا عن نشر تطبيق الويب من خلال DVCS مثل git؟

بهذه الطريقة يمكنك السماح لـ git بمعرفة الملفات التي سيتم نقلها إلى الخادم.لديك أيضًا طريقة لطيفة للتراجع عنها إذا تبين أنه تم ضبطها، فما عليك سوى التراجع!

لقد كتبت نصًا برمجيًا bash يأخذ بعض المعلمات ويقوم بمزامنة الملف بين الخوادم.يعمل على تسريع عملية نقل rsync كثيرًا للأرشيفات الأكبر حجمًا:

https://Gist.github.com/3985742

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