يُعد نشر تطبيق Flask خطوة حاسمة لجعل تطبيقك الويب متاحًا للعالم. وعلى الرغم من أن Flask يأتي مع خادم تطوير مدمج، إلا أنه غير مناسب للبيئات الإنتاجية. للحصول على إعداد قوي وقابل للتوسع وجاهز للإنتاج، ستحتاج إلى مزيج من Gunicorn وNginx وأوبونتو. سيوضح لك هذا الدليل كيفية نشر تطبيق Flask الخاص بك باستخدام Gunicorn وNginx على خادم أوبونتو.
قد يبدو نشر تطبيقات Flask على الخادم مهمة صعبة إذا كنت جديدًا في تطوير الخلفية، ولكن هذا الدليل الشامل سيفصل كل خطوة. في النهاية، سيكون لديك تطبيق Flask يعمل على أوبونتو، يتم خدمته بواسطة Gunicorn وNginx.
فهم حزمة النشر: Flask وGunicorn وNginx
قبل الغوص في عملية النشر، من المهم فهم الأدوات التي سنستخدمها.
Flask: الإطار الويب المصغر
Flask هو إطار عمل ويب خفيف الوزن مكتوب بلغة بايثون. صُمم ليكون بسيطًا ومرنًا وسهل البدء به، مما يجعله خيارًا شائعًا لبناء تطبيقات الويب. ومع ذلك، فإن الخادم المدمج في Flask غير مناسب للبيئات الإنتاجية لأنه لا يمكنه التعامل مع أكثر من طلب واحد في وقت واحد.
Gunicorn: خادم HTTP WSGI للبايثون
Gunicorn (Green Unicorn) هو خادم HTTP WSGI للبايثون يقوم بتشغيل تطبيق Flask الخاص بك. يستخدم نموذج العمليات المتعددة (pre-fork)، مما يعني أنه يقوم بإنشاء عدة عمليات عمل للتعامل مع عدة طلبات في وقت واحد. هذا يجعله مثاليًا لخدمة تطبيقات Flask في بيئة الإنتاج. يجلس Gunicorn بين تطبيق Flask وخادم الويب (Nginx في هذه الحالة)، ويتولى التعامل مع الطلبات والردود.
Nginx: خادم الويب ووكيل عكسي
Nginx هو خادم ويب عالي الأداء يعمل أيضًا كوكيل عكسي، وموازن تحميل، وذاكرة تخزين مؤقتة HTTP. في هذا الإعداد، سيجلس Nginx أمام Gunicorn، ويتولى إدارة اتصالات العملاء والمحتوى الثابت، ثم يقوم بإعادة توجيه الطلبات الديناميكية إلى Gunicorn. هذا الفصل في الأدوار يساعد على تحسين الأمان، الأداء، وقابلية التوسع.
إعداد خادم أوبونتو
الإعداد الأولي للخادم
أولاً، تحتاج إلى الوصول إلى خادم أوبونتو. يمكن أن يكون هذا جهازًا فعليًا، جهازًا افتراضيًا، أو مثيلًا سحابيًا من مزودين مثل AWS أو DigitalOcean أو Google Cloud Platform.
- تسجيل الدخول إلى الخادم الخاص بك:
$ ssh اسم_المستخدم@عنوان_الآيبي_الخادم
- تحديث فهرس الحزم الخاصة بك:
$ sudo apt update
- ترقية الحزم المثبتة:
$ sudo apt upgrade
تثبيت الحزم اللازمة
ستحتاج إلى Python وpip وvirtualenv لتشغيل تطبيق Flask الخاص بك.
- تثبيت Python وpip:
$ sudo apt install python3 python3-pip
- تثبيت virtualenv:
$ sudo pip3 install virtualenv
تحضير تطبيق Flask الخاص بك
إنشاء تطبيق Flask
إذا لم يكن لديك تطبيق Flask بالفعل، يمكنك إنشاء واحد بسيط. إليك مثال:
- إنشاء دليل للمشروع الخاص بك:
$ mkdir ~/تطبيقي
$ cd ~/تطبيقي
- إنشاء بيئة افتراضية:
$ virtualenv venv
- تفعيل البيئة الافتراضية:
$ source venv/bin/activate
- تثبيت Flask:
$ pip install Flask
- إنشاء تطبيق Flask بسيط:
قم بإنشاء ملف باسم app.py
:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'مرحبا بالعالم!'
if __name__ == '__main__':
app.run()
- اختبار التطبيق الخاص بك:
قم بتشغيل التطبيق للتأكد من أن كل شيء يعمل:
$ python app.py
يجب أن ترى إخراجًا يشير إلى أن خادم التطوير Flask يعمل. قم بزيارة http://عنوان_الآيبي_الخادم:5000
في متصفحك، ويجب أن ترى “مرحبا بالعالم!”.
هيكلة تطبيق Flask
في بيئة الإنتاج، من الجيد هيكلة تطبيق Flask الخاص بك بطريقة معيارية. إليك مثال بسيط على كيفية هيكلة تطبيقك:
تطبيقي/
│
├── app/
│ ├── __init__.py
│ ├── routes.py
│ ├── models.py
│ └── templates/
│
├── venv/
├── config.py
├── requirements.txt
└── wsgi.py
إنشاء نقطة إدخال WSGI
يحتاج Gunicorn إلى نقطة إدخال WSGI لخدمة تطبيق Flask الخاص بك. هذا عادةً ما يكون ملفًا باسم wsgi.py
:
- إنشاء ملف
wsgi.py
:
from app import app
if __name__ == "__main__":
app.run()
- تثبيت الاعتمادات الإضافية:
إذا كان لتطبيقك اعتمادات إضافية، قم بإدراجها في ملف requirements.txt
وقم بتثبيتها:
$ pip freeze > requirements.txt
$ pip install -r requirements.txt
نشر Flask باستخدام Gunicorn
تثبيت Gunicorn
Gunicorn هو حزمة بايثون، لذا يمكن تثبيته باستخدام pip.
- تثبيت Gunicorn:
$ pip install gunicorn
تشغيل Gunicorn
لاختبار أن Gunicorn يمكنه خدمة تطبيقك، قم بتشغيل الأمر التالي:
$ gunicorn --bind 0.0.0.0:8000 wsgi:app
هذا الأمر يخبر Gunicorn بخدمة تطبيق Flask الخاص بك باستخدام ملف wsgi.py
، مع الربط بالمنفذ 8000. يجب أن تكون قادرًا على الوصول إلى تطبيقك على http://عنوان_الآيبي_الخادم:8000
.
تكوين Gunicorn للإنتاج
للإنتاج، عادةً ما تريد تشغيل Gunicorn مع عدة عمليات عمل للتعامل مع عدة طلبات في وقت واحد.
- إنشاء ملف خدمة systemd لـ Gunicorn:
يتيح لك هذا إدارة Gunicorn باستخدام systemd، وهو نظام التهيئة المستخدم بواسطة أوبونتو.
$ sudo nano /etc/systemd/system/gunicorn.service
أضف المحتوى التالي:
[Unit]
Description=مثيل Gunicorn لخدمة تطبيقي
After=network.target
[Service]
User=اسم_المستخدم
Group=www-data
WorkingDirectory=/home/اسم_المستخدم/تطبيقي
Environment="PATH=/home/اسم_المستخدم/تطبيقي/venv/bin"
ExecStart=/home/اسم_المستخدم/تطبيقي/venv/bin/gunicorn --workers 3 --bind unix:تطبيقي.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target
استبدل اسم_المستخدم
باسم المستخدم الفعلي الخاص بك.
- بدء وتفعيل خدمة Gunicorn:
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
- التحقق من حالة خدمة Gunicorn:
$ sudo systemctl status gunicorn
إذا تم إعداد كل شيء بشكل صحيح، يجب أن يكون Gunicorn يعمل ويخدم تطبيق Flask الخاص بك.
إعداد Nginx
تثبيت Nginx
إذا لم يكن لديك Nginx مثبتًا، يمكنك
تثبيته باستخدام الأمر التالي:
$ sudo apt install nginx
تكوين Nginx كوكيل عكسي
سيعمل Nginx كوكيل عكسي، يعيد توجيه الطلبات إلى Gunicorn ويخدم الملفات الثابتة مباشرة.
- إنشاء كتلة خادم جديدة:
$ sudo nano /etc/nginx/sites-available/تطبيقي
أضف المحتوى التالي:
server {
listen 80;
server_name اسم_النطاق_أو_IP;
location / {
include proxy_params;
proxy_pass http://unix:/home/اسم_المستخدم/تطبيقي/تطبيقي.sock;
}
location /static/ {
alias /home/اسم_المستخدم/تطبيقي/app/static/;
}
error_log /home/اسم_المستخدم/تطبيقي/error.log;
access_log /home/اسم_المستخدم/تطبيقي/access.log;
}
استبدل اسم_المستخدم
باسم المستخدم الفعلي الخاص بك واسم_النطاق_أو_IP
بعنوان IP أو اسم النطاق الخاص بالخادم الخاص بك.
- تفعيل كتلة الخادم الجديدة:
$ sudo ln -s /etc/nginx/sites-available/تطبيقي /etc/nginx/sites-enabled
- اختبار تكوين Nginx:
$ sudo nginx -t
إذا كان الاختبار ناجحًا، يجب أن ترى رسالة تشير إلى أن التكوين صحيح.
- إعادة تشغيل Nginx لتطبيق التغييرات:
$ sudo systemctl restart nginx
السماح لـ Nginx عبر جدار الحماية
إذا كنت تستخدم UFW (جدار الحماية غير المعقد)، فأنت بحاجة إلى السماح لـ Nginx عبر جدار الحماية.
$ sudo ufw allow 'Nginx Full'
تأمين التطبيق باستخدام SSL
لتأمين تطبيقك، يمكنك إعداد SSL باستخدام Let’s Encrypt.
تثبيت Certbot
Certbot هو أداة لأتمتة عملية الحصول على شهادات SSL وتجديدها.
- تثبيت Certbot ومكون Nginx الإضافي:
$ sudo apt install certbot python3-certbot-nginx
- الحصول على شهادة SSL:
قم بتشغيل الأمر التالي، مع استبدال اسم_النطاق_أو_IP
باسم النطاق أو عنوان IP الخاص بك:
$ sudo certbot --nginx -d اسم_النطاق_أو_IP
- التحقق من تجديد شهادة SSL:
سيقوم Certbot بتجديد شهادات SSL الخاصة بك تلقائيًا. يمكنك محاكاة التجديد للتحقق مما إذا كان يعمل:
$ sudo certbot renew --dry-run
المراقبة والتسجيل
سجلات Gunicorn
سيقوم Gunicorn بتسجيل مخرجاته في journal systemd. لعرض السجلات:
$ sudo journalctl -u gunicorn
سجلات Nginx
يقوم Nginx بتسجيل الطلبات والأخطاء في ملفات السجل الموجودة في /var/log/nginx/
. يمكنك عرضها باستخدام:
$ sudo tail -f /var/log/nginx/access.log
$ sudo tail -f /var/log/nginx/error.log
استكشاف الأخطاء الشائعة وإصلاحها
فشل Gunicorn في البدء
- التحقق من حالة خدمة Gunicorn:
$ sudo systemctl status gunicorn
ابحث عن أي رسائل خطأ في الإخراج.
- التحقق من سجلات Gunicorn:
$ sudo journalctl -u gunicorn
فشل Nginx في البدء أو إعادة التحميل
- اختبار تكوين Nginx:
$ sudo nginx -t
ستظهر هذه الأداة أي أخطاء في التكوين في ملفاتك.
- التحقق من سجلات Nginx:
$ sudo tail -f /var/log/nginx/error.log
أتمتة النشر باستخدام خط أنابيب CI/CD
بالنسبة للتطبيقات الكبيرة أو التطبيقات التي يتم تحديثها بشكل متكرر، قد ترغب في أتمتة عملية النشر باستخدام خط أنابيب التكامل المستمر/النشر المستمر (CI/CD). يتضمن ذلك إعداد خدمة مثل Jenkins أو GitLab CI أو GitHub Actions لنشر تطبيق Flask تلقائيًا كلما قمت بدفع تغييرات إلى مستودع.
إعداد خط أنابيب CI/CD الأساسي
- اختر أداة CI/CD: Jenkins، GitLab CI، GitHub Actions، CircleCI، إلخ.
- تكوين خط الأنابيب الخاص بك: حدد خطوات البناء، الاختبار، والنشر.
- التكامل مع نظام التحكم في الإصدار الخاص بك: قم بتشغيل النشر تلقائيًا عند دفع التغييرات إلى المستودع الخاص بك.
النشر باستخدام Git Hooks
إذا كنت تفضل نهجًا أبسط، يمكنك استخدام Git Hooks لتشغيل نصوص النشر كلما قمت بدفع تغييرات إلى الخادم الخاص بك.
- إنشاء hook بعد الاستلام على الخادم الخاص بك:
$ mkdir -p ~/تطبيقي.git/hooks
$ nano ~/تطبيقي.git/hooks/post-receive
أضف المحتوى التالي:
#!/bin/bash
git --work-tree=/home/اسم_المستخدم/تطبيقي --git-dir=/home/اسم_المستخدم/تطبيقي.git checkout -f
source /home/اسم_المستخدم/تطبيقي/venv/bin/activate
pip install -r /home/اسم_المستخدم/تطبيقي/requirements.txt
sudo systemctl restart gunicorn
اجعل hook قابلاً للتنفيذ:
$ chmod +x ~/تطبيقي.git/hooks/post-receive
- دفع التحديثات إلى الخادم الخاص بك:
من جهازك المحلي، أضف المستودع البعيد:
$ git remote add production ssh://اسم_المستخدم@عنوان_الآيبي_الخادم/home/اسم_المستخدم/تطبيقي.git
ادفع التغييرات إلى خادم الإنتاج:
$ git push production master
الأسئلة المتكررة
ما هو دور Gunicorn في نشر Flask؟
يعمل Gunicorn كخادم HTTP WSGI الذي يتعامل مع الطلبات الواردة إلى تطبيق Flask الخاص بك. يقوم بإنشاء عدة عمليات عمل لإدارة هذه الطلبات بشكل متزامن، مما يجعله مكونًا أساسيًا في بيئة الإنتاج.
لماذا يتم استخدام Nginx كوكيل عكسي؟
يتم استخدام Nginx كوكيل عكسي لإدارة اتصالات العملاء، وإدارة الملفات الثابتة، وإعادة توجيه الطلبات الديناميكية إلى Gunicorn. هذا يحسن من أمان، أداء، وقابلية التوسع لتطبيقك.
كيف أضمن أن تطبيق Flask الخاص بي آمن؟
يتضمن تأمين تطبيق Flask الخاص بك استخدام شهادات SSL/TLS، فرض HTTPS، ضبط الأذونات بشكل صحيح، وتحديث الخادم والاعتمادات الخاصة بالتطبيق بانتظام.
هل يمكنني استخدام خوادم ويب أخرى بدلاً من Nginx؟
نعم، يمكنك استخدام خوادم ويب أخرى مثل Apache. ومع ذلك، يُفضل استخدام Nginx لأدائه وسهولة استخدامه كوكيل عكسي.
ماذا يجب أن أفعل إذا تعطل تطبيقي بعد النشر؟
تحقق من سجلات Gunicorn وNginx لتحديد سبب التعطل. تأكد من أن تطبيقك مُعد بشكل صحيح وأن جميع الاعتمادات مثبتة. تحقق أيضًا من أي أخطاء في التكوين في ملفاتك.
كيف يمكنني توسيع تطبيق Flask الخاص بي؟
يمكنك توسيع تطبيق Flask الخاص بك بزيادة عدد العمال في Gunicorn، توزيع التحميل عبر عدة خوادم، وتحسين الشيفرة الخاصة بك واستعلامات قاعدة البيانات.
الخلاصة
يُعد نشر تطبيق Flask باستخدام Gunicorn وNginx على أوبونتو طريقة قوية لضمان أن يكون تطبيقك قويًا وقابلًا للتوسع وآمنًا. من خلال اتباع الخطوات الموضحة في هذا الدليل، يمكنك نشر تطبيق Flask الخاص بك بثقة في بيئة الإنتاج. من إعداد الخادم الخاص بك وتكوين التطبيق الخاص بك إلى تأمين الموقع الخاص بك باستخدام SSL واستكشاف الأخطاء الشائعة وإصلاحها، يوفر لك هذا الدليل كل ما تحتاج إلى معرفته لتحقيق النجاح.