النشر

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

الاستضافة

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

مجموعة خدمات الويب من أمازون (EC2)

تقدم هذه الخدمة مجموعة من الخدمات المُقدمة من شركة أمازون العالميّة. هناك احتمال لسماعك بهذه الخدمة من قَبل؛ كونها من أكثر الخيارات شعبيّةً للشركات والبرمجيات الناشئة هذه الأيام. سنتحدث هنا عن خدمة EC2 بوجه التحديد، والتي تعني: "خدمة الحوسبة السحابيّة المرنة" (Elastic Compute Cloud). النقطة المثيرة بشأن هذه الخدمة أنَّ الخوادم الافتراضيّة التي تقدمها، أو النماذِج (instances) كما تُسميهم الشركة، تعمل على مبدأ الثواني. مما يعني أنَّه يمكنك توسيع إمكانيات تطبيقك عبر زيادة عدد النماذج وربطهم بموزِّع حمل (load balancer) وحسب (يمكنك استخدام موزِّع الحمل المُقدَم من الشركة نفسها إن أردت).

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

استضافة هيروكو

هيروكو هي خدمة استضافة تطبيقات تعتمد على خدمات أمازون كخدمة EC2. مما يتيح لنا الاستفادة من السهولة التي توفرها خدمات أمازون وبدون الحاجة لامتلاك خبرة في إدارة الأنظمة.

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

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

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

استضافة ديجيتال أوشن

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

لا تختلف استضافة تطبيقات الفلاسك على هذه الخدمة عن الكيفيّة في خدمات أمازون. كل ما عليك هو بدء قطيّرة جديدة تعمل بتوزيعة لينُكس وتثبيت البرمجيات التي تحتاجها.

ملاحظة
ساهمت شركة ديجيتال أوشن بسخاء وتبرَّعت لهذا الكتاب. ولكن ذلك لا يعني أنَّ توصيتي لم تكن نابعة من تجربة شخصيّة، فأنا أؤكِّد أنَّها كذلك. فلو أنني لم أكن مُعجباً بخدماتهم لما كُنت طلبت منهم التبرَّع أصلاً.

البرمجيات

سنتكلم في هذا القسم عن بعض البرمجيات التي سنحتاج تثبيتها على خادمنا لإيصال تطبيقنا للعالم أجمع. البرمجيات الأساسيّة التي سنحتاجها هي خادم أمامي (front server) ليستقبل الطلبات ويمرِّرها لمُنفِذ التطبيق الذي يُشغِّل تطبيقنا. عادةً ما نحتاج أيضاً لاستخدام قاعدة بيانات ولذلك سنتكلم قليلاً عن الخيارات المتوفرة لذلك أيضاً.

مُنفِذ التطبيق

الخادم التطويري الذي نستخدمه عادةً لتشغيل تطبيقات فلاسك محلياً ليس جيداً بما فيه الكفايّة للتعامل مع طلبات كثيرة وحقيقيّة في الوضع الإنتاجي. يُفضَل عند نشر التطبيق في بيئة إنتاجيّة استخدام مُنفِذ تطبيقات (application runner) كغونيكورن (Gunicorn). يتعامل غونيكورن مع الطلبات بيُسِر ويهتم بالأمور المُعقدة كالتعامل مع تعدد المسارات الحاسوبيّة (threading).

عليك تثبيت الحزمة gunicorn قبل استخدام غونيكورن في بيئة افتراضيّة بواسطة مدير الحزم pip. يمكن تشغيل التطبيقات بسهولة مع هذه البرمجيّة، فكل ما يتطلبه الأمر تنفيذ تعليمة بسيطة.

# rocket.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "Hello World!"

والآن لنقوم بتشغيله بغونيكورن علينا ببساطة تنفيذ الأمر gunicorn.

(ourapp)$ gunicorn rocket:app
2014-03-19 16:28:54 [62924] [INFO] Starting gunicorn 18.0
2014-03-19 16:28:54 [62924] [INFO] Listening at: http://127.0.0.1:8000 (62924)
2014-03-19 16:28:54 [62924] [INFO] Using worker: sync
2014-03-19 16:28:54 [62927] [INFO] Booting worker with pid: 62927

ينبغي الآن أن تكون قادراً على رؤية العبارة “!Hello World” في متصفحك عند الدخول إلى الرابط http://127.0.0.1:8000.

لتشغيل الخادم بالخلفيّة (أي جعله يعمل كعفريت - daemon) يمكنك تمرير الخيار D- للأمر. وبهذه الطريقة سيظل يعمل حتى ولو أُغلِقت جلسة الطرفيّة الحالية.

قد نواجه صعوبة بإيجاد رقم العمليّة التي يعمل عليها غونيكورن عند جعله يعمل كعفريت. يمكننا لحل ذلك إخبار غونيكورن أنَّ عليه وضع رقم العمليّة التي سيعمل عليها في ملف لنتمكن من إيقافه لاحقاً من الدون البحث في قائمة العمليات. استخدم الخيار <p <file- لفعل ذلك.

(ourapp)$ gunicorn rocket:app -p rocket.pid -D
(ourapp)$ cat rocket.pid
63101

لإعادة تشغيل الخادم أو إيقافه استخدم الأمرين kill -HUP و kill على التوالي.

(ourapp)$ kill -HUP `cat rocket.pid`
(ourapp)$ kill `cat rocket.pid`

يعمل خادم غونيكورن افتراضياً على المنفذ 8000. يمكنك تغيير رقم المنفذ عبر استخدام الخيار b-.

(ourapp)$ gunicorn rocket:app -p rocket.pid -b 127.0.0.1:7999 -D

جعل الخادم يتلقى طلبات خارجيّة

تحذير
غونيكورن مخصص ليبقى خلف خادم وكيل عكسي (reverse proxy). فإذا ما أخبرته أن يتنصت على طلبات خارجيّة سيصبح هدفاً سهلاً لهجمات الحرمان من الخدمة. وذلك لأنَّه غير مخصص للتعامل مع هذا النوع من الطلبات. ولذلك لا تجعله يتنصت على الطلبات الخارجيّة إلا إن كنت تريد تنقيح تطبيقك، واحرص على جعله يتنصت على الطلبات الداخليّة مجدداً بعد أن تنتهي.

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

(ourapp)$ gunicorn rocket:app -p rocket.pid -b 0.0.0.0:8000 -D
ملاحظة
  • اقرأ المزيد عن تشغيل ونشر التطبيقات بواسطة غونيكورن في توثيق المشروع.
  • تتيح أداة فابريك تشغيل جميع الأوامر التي استخدمناها على الخادم بأريحيّة من جهازك المحلي وبدون الإتصال بالخادم في كل مرَّة.

خادم إنجن إكس

يعمل خادم الوكيل العكسي على التعامل مع طلبات ميثاق نقل النص الفائق (HTTP) وإعادة إرسالها إلى غونيكورن مجدداً ومن ثمَّ إعادة الرد إلى العميل. يعمل إنجن إكس (Nginx) كخادم وكيل عكسي بفعاليّة، كما وينصح بشدّة استخدام غونيكورن معه.

لضبط إنجن إكس ليعمل مع خادم غونيكورن مضبوط ليتنصت على العنوان 127.0.0.1:8000 يمكننا إنشاء ملف لتطبيقنا في المسار etc/nginx/sites-available/exploreflask.com/ يحتوي على:

# /etc/nginx/sites-available/exploreflask.com

# لإعادة توجيه الطلبات القادمة من www.exploreflask.com إلى exploreflask.com

server {
        server_name www.exploreflask.com;
        rewrite ^ http://exploreflask.com/ permanent;
}

# يتعامل مع الطلبات القادمة إلى العنوان exploreflask.com على المنفذ 80
server {
        listen 80;
        server_name exploreflask.com;

                # Handle all locations
        location / {
                        # Pass the request to Gunicorn
                proxy_pass http://127.0.0.1:8000;

                # Set some HTTP headers so that our app knows where the
                # request really came from
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

الآن سنقوم بإنشاء رابط ليّن (symlink) لهذا الملف في المسار etc/nginx/sites-enabled/ وسنقوم بإعادة تشغيل إنجن إكس.

$ sudo ln -s \
/etc/nginx/sites-available/exploreflask.com \
/etc/nginx/sites-enabled/exploreflask.com

ينبغي الآن أن يكون إنجن إكس قادر على استقبال طلباتنا وإرسال الرد.

ملاحظة
يشرح قسم إعداد خادم إنجن إكس في توثيقات غونيكورن كيفيّة إعداد إنجن إكس ليعمل مع الخادم.

وحدة ProxyFix

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

# app.py

from flask import Flask

# Import the fixer
from werkzeug.contrib.fixers import ProxyFix

app = Flask(__name__)

# Use the fixer
app.wsgi_app = ProxyFix(app.wsgi_app)

@app.route('/')
def index():
        return "Hello World!"
ملاحظة
اقرأ المزيد حول ProxyFix في توثيقات ويركزوغ.

الخلاصة

  • هناك ثلاث خدمات أنصحك بها لاستضافة مشاريعك المكتوبة بفلاسك: خدمة أمازون للحوسبة السحابيّة، وخدمة هيروكو، وخدمة ديجيتال أوشن.
  • حزمة برمجيات الخادم الأساسيّة التي عليك استخدامها تتألف من تطبيق، ومُنفِذ كغونيكورن، وخادم وكيل عكسي كإنجن إكس.
  • ينبغي أن يعمل خادم غونيكورن خلف خادم إنجن إكس وينبغي أن يتنصت على العنوان 127.0.0.1 (الطلبات الداخليّة) وليس على العنوان 0.0.0.0 (الطلبات الخارجيّة).
  • استخدم الوحدة ProxyFix من مكتبة ويركزوغ للتعامل مع الترويسات الصحيحة فقط في تطبيق الفلاسك خاصتك.

results matching ""

    No results matching ""