إعداد تطبيق ASGI Django للنشر مع Postgres وخادم Nginx باستخدام Uvicorn
مقدمة
في عالم تطوير تطبيقات الويب الحديثة، يعتبر استخدام بروتوكول ASGI (Asynchronous Server Gateway Interface) من الحلول الرائدة لدعم الأداء العالي في تطبيقات Django، خصوصًا عند العمل مع تطبيقات تحتاج إلى التعامل مع الاتصالات غير المتزامنة مثل WebSockets أو عمليات الاستجابة المتوازية. ولكن إعداد Django للعمل في بيئة الإنتاج مع قاعدة بيانات Postgres وخادم Nginx يتطلب فهمًا عميقًا للبنية التحتية للتطبيقات الحديثة، بالإضافة إلى بعض الأدوات الأساسية مثل Uvicorn و Daphne. في هذا المقال، سوف نغطي كيفية إعداد تطبيق Django ASGI للنشر باستخدام Uvicorn كخادم ASGI و Postgres كقاعدة بيانات في بيئة الإنتاج.
1. التحضير للتطبيق
تثبيت المتطلبات
أولًا، تأكد من أن لديك بيئة Python مُهيئة بشكل صحيح على جهازك. يمكنك استخدام virtualenv لعزل بيئة التطبيق:
bashpython3 -m venv venv
source venv/bin/activate
ثم قم بتثبيت مكتبات Django و Uvicorn و psycopg2 (لتعامل Django مع قاعدة بيانات Postgres):
bashpip install django uvicorn psycopg2
إذا كنت تخطط لاستخدام Daphne كخادم بديل لـ Uvicorn، يمكن تثبيته كالتالي:
bashpip install daphne
إعداد تطبيق Django
ابدأ بإنشاء تطبيق Django جديد (أو استخدم التطبيق القائم إذا كان لديك واحد بالفعل):
bashdjango-admin startproject myproject
cd myproject
تكوين إعدادات Django للـ ASGI
افترض أن المشروع يعمل بنظام ASGI وليس WSGI. في الإصدار 3.0 من Django وما بعده، أصبح دعم ASGI متاحًا بشكل افتراضي. يمكنك إعداد التطبيق ليدعم ASGI عن طريق تعديل الملف asgi.py داخل مجلد المشروع (الذي يتم إنشاؤه تلقائيًا):
python# myproject/asgi.py
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = get_asgi_application()
2. إعداد قاعدة بيانات Postgres
تثبيت Postgres
لتشغيل التطبيق في بيئة الإنتاج، سنحتاج إلى قاعدة بيانات PostgreSQL. يمكن تثبيت Postgres على الخادم باستخدام apt أو yum حسب نظام التشغيل الخاص بك:
على Ubuntu:
bashsudo apt update sudo apt install postgresql postgresql-contrib
على CentOS:
bashsudo yum install postgresql-server postgresql-contrib
إعداد قاعدة البيانات في Postgres
بعد تثبيت PostgreSQL، يجب إنشاء قاعدة بيانات ومستخدم خاص بتطبيق Django:
-
قم بالدخول إلى قاعدة البيانات كـ postgres:
bashsudo -u postgres psql -
أنشئ قاعدة البيانات والمستخدم:
sqlCREATE DATABASE myprojectdb; CREATE USER myprojectuser WITH PASSWORD 'password'; ALTER ROLE myprojectuser SET client_encoding TO 'utf8'; ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed'; ALTER ROLE myprojectuser SET timezone TO 'UTC'; GRANT ALL PRIVILEGES ON DATABASE myprojectdb TO myprojectuser; -
ثم قم بتحديث إعدادات DATABASES في ملف
settings.pyفي مشروع Django لاستخدام قاعدة بيانات Postgres:
python# myproject/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myprojectdb',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost', # يمكن تغييره إذا كانت قاعدة البيانات على خادم آخر
'PORT': '5432',
}
}
تشغيل الترحيلات
قم بتشغيل الترحيلات لتحضير قاعدة البيانات:
bashpython manage.py migrate
3. إعداد خادم Uvicorn
بما أن Uvicorn هو الخادم الذي يدير تطبيق ASGI في بيئة الإنتاج، يجب أن يتم تثبيته وتكوين تشغيله بالشكل الصحيح. لتشغيله مع Django، يمكنك استخدام الأمر التالي:
bashuvicorn myproject.asgi:application --host 0.0.0.0 --port 8000
بذلك، سيكون تطبيقك جاهزًا للاستماع على المنفذ 8000. بالطبع، في بيئة الإنتاج، ستحتاج إلى تهيئة Nginx للتوجيه إلى Uvicorn بشكل صحيح.
4. إعداد Nginx
تثبيت Nginx
إذا لم يكن لديك Nginx مثبتًا بعد، قم بتثبيته باستخدام:
bashsudo apt update sudo apt install nginx
تكوين Nginx للاتصال بـ Uvicorn
بعد تثبيت Nginx، يجب عليك تعديل ملف إعدادات Nginx ليقوم بتوجيه طلبات HTTP إلى تطبيق Django الذي يعمل مع Uvicorn.
-
قم بإنشاء ملف إعدادات جديد في مجلد
/etc/nginx/sites-available/:
bashsudo nano /etc/nginx/sites-available/myproject
-
أضف التكوين التالي في الملف:
nginxserver {
listen 80;
server_name example.com; # استخدم اسم النطاق الخاص بك
location / {
proxy_pass http://127.0.0.1:8000; # توجيه الطلبات إلى Uvicorn
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_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /path/to/static/; # المسار الكامل إلى مجلد static
}
location /media/ {
alias /path/to/media/; # المسار الكامل إلى مجلد media
}
}
-
قم بإنشاء رابط رمزي لتمكين الموقع:
bashsudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
-
تحقق من إعدادات Nginx وأعد تحميله:
bashsudo nginx -t sudo systemctl reload nginx
5. إعداد Gunicorn (اختياري)
في بعض الحالات، قد ترغب في إضافة Gunicorn كخادم إضافي بين Nginx و Uvicorn. رغم أن Uvicorn هو خادم ASGI الأساسي، قد يكون Gunicorn مفيدًا عندما تحتاج إلى معالجة إضافية للأداء.
يمكنك تثبيت Gunicorn عن طريق:
bashpip install gunicorn
ثم قم بتشغيله:
bashgunicorn -w 4 myproject.asgi:application
6. تشغيل التطبيق في بيئة الإنتاج
أخيرًا، يمكنك تشغيل تطبيقك في بيئة الإنتاج باستخدام أدوات مثل Supervisor أو systemd لإدارة عملية Uvicorn.
إعداد Supervisor
-
قم بتثبيت Supervisor:
bashsudo apt install supervisor
-
قم بإنشاء ملف تكوين لـ Supervisor:
bashsudo nano /etc/supervisor/conf.d/myproject.conf
-
أضف التكوين التالي:
ini[program:myproject]
command=uvicorn myproject.asgi:application --host 0.0.0.0 --port 8000
directory=/path/to/myproject
autostart=true
autorestart=true
stderr_logfile=/var/log/myproject.err.log
stdout_logfile=/var/log/myproject.out.log
-
قم بتحديث Supervisor وإعادة تشغيل التطبيق:
bashsudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start myproject
7. ختام
بذلك، تكون قد أكملت إعداد تطبيق Django باستخدام ASGI مع Uvicorn و Postgres على Nginx في بيئة الإنتاج. هذه البيئة توفر أداءً عاليًا مع دعم الاتصالات غير المتزامنة وتكاملًا سلسًا مع قاعدة بيانات Postgres.

