انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

نشر Python/Django: بيئة إنتاج مع Gunicorn و Nginx

دليل نشر تطبيقات Python/Django على VPS. إعداد virtualenv، إعدادات Django للإنتاج، خادم Gunicorn WSGI، وكيل Nginx العكسي، خدمة systemd وإدارة الملفات الثابتة.

وقت القراءة: 18 دقيقة استضافة الويب / التطبيقات
pythondjangogunicornnginxdeployvpsvirtualenvwsgipostgresql
الكاتب
REXE Teknoloji Network & Security Team
المحرر
REXE Teknoloji Technical Editorial
أول نشر
آخر تحديث

نشر Python/Django: بيئة إنتاج مع Gunicorn و Nginx

Django هو إطار عمل الويب الأكثر شيوعاً في Python. المزيج المعياري للنشر في الإنتاج هو Gunicorn (خادم WSGI) و Nginx (وكيل عكسي). يرشدك هذا الدليل خلال نشر تطبيق Django على VPS من الصفر.

إعداد Python و Virtualenv

hljs bash
# تحديث النظام
sudo apt update && sudo apt upgrade -y

# تثبيت Python 3 و pip
sudo apt install python3 python3-pip python3-venv python3-dev -y

# إنشاء مجلد التطبيق
sudo mkdir -p /var/www/mydjango
sudo chown $USER:$USER /var/www/mydjango
cd /var/www/mydjango

# إنشاء البيئة الافتراضية
python3 -m venv venv

# تفعيل البيئة الافتراضية
source venv/bin/activate

# تحديث pip
pip install --upgrade pip

استخدم بيئة افتراضية منفصلة لكل مشروع Django. هذا يمنع تعارض التبعيات ويعزل المشاريع.

نقل التطبيق إلى الخادم

hljs bash
cd /var/www
git clone https://github.com/user/mydjango.git
cd mydjango
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pip install gunicorn

إعدادات Django للإنتاج

hljs python
import os

DEBUG = False
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
ALLOWED_HOSTS = os.environ.get('DJANGO_ALLOWED_HOSTS', '').split(',')

# رؤوس الأمان
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

# الملفات الثابتة
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

إعداد قاعدة البيانات (PostgreSQL)

hljs bash
sudo apt install postgresql postgresql-contrib -y
sudo -u postgres psql
hljs sql
CREATE DATABASE mydb;
CREATE USER dbuser WITH PASSWORD 'كلمة-مرور-قوية';
ALTER ROLE dbuser SET client_encoding TO 'utf8';
ALTER ROLE dbuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE dbuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE mydb TO dbuser;
\q
hljs bash
pip install psycopg2-binary
python manage.py migrate
python manage.py createsuperuser
python manage.py collectstatic --noinput

إعداد Gunicorn

hljs python
# gunicorn.conf.py
bind = 'unix:/run/gunicorn/gunicorn.sock'
workers = 3  # (2 * أنوية CPU) + 1
worker_class = 'sync'
timeout = 30
max_requests = 1000
preload_app = True
user = 'www-data'
group = 'www-data'
errorlog = '/var/log/gunicorn/error.log'
accesslog = '/var/log/gunicorn/access.log'

ملف خدمة systemd

hljs ini
[Unit]
Description=Gunicorn daemon for Django
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/mydjango
ExecStart=/var/www/mydjango/venv/bin/gunicorn \
    --config /var/www/mydjango/gunicorn.conf.py \
    myproject.wsgi:application
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
EnvironmentFile=/var/www/mydjango/.env

[Install]
WantedBy=multi-user.target
hljs bash
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn

إعداد وكيل Nginx العكسي

hljs nginx
server {
    listen 80;
    server_name example.com www.example.com;

    location /static/ {
        alias /var/www/mydjango/staticfiles/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location /media/ {
        alias /var/www/mydjango/media/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn/gunicorn.sock;
        proxy_read_timeout 300;
    }

    client_max_body_size 100M;
}
hljs bash
sudo ln -s /etc/nginx/sites-available/mydjango /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

شهادة SSL

hljs bash
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com

سير عمل النشر

hljs bash
cd /var/www/mydjango
source venv/bin/activate
git pull origin main
pip install -r requirements.txt
python manage.py migrate
python manage.py collectstatic --noinput
sudo systemctl restart gunicorn

على خوادم REXE، يُوصى بـ 1 جيجابايت ذاكرة RAM على الأقل لـ Django. اضبط عدد عمال Gunicorn بناءً على أنوية CPU: (2 × CPU) + 1.

الخلاصة

تطبيق Django الخاص بك يعمل الآن في الإنتاج مع خادم Gunicorn WSGI ووكيل Nginx العكسي. بفضل خدمة systemd، يبدأ التطبيق تلقائياً عند إعادة تشغيل الخادم.

الأسئلة الشائعة

Gunicorn لا يبدأ، كيف أصحح الأخطاء؟

تحقق من حالة الخدمة: 'sudo systemctl status gunicorn'. راجع آخر السجلات: 'sudo journalctl -u gunicorn -n 50'. الأسباب الشائعة: مسار WSGI خاطئ، تبعيات مفقودة، أو قيم خاطئة في ملف .env.

الملفات الثابتة لـ Django لا تُحمَّل (CSS/JS مفقود).

تأكد من تنفيذ 'python manage.py collectstatic'. تحقق من أن كتلة location /static/ في Nginx تشير بشكل صحيح إلى مجلد STATIC_ROOT. تحقق من ضبط STATIC_ROOT بشكل صحيح في settings.py.

أحصل على خطأ 500 Internal Server Error في Django.

اضبط DEBUG=True في settings.py لرؤية تفاصيل الخطأ (للتطوير فقط). راجع سجلات Gunicorn: 'sudo journalctl -u gunicorn'. تحقق من ملف سجل Django. تحقق من اتصال قاعدة البيانات وحالة الترحيلات.

كيف أشغّل عدة تطبيقات Django على نفس الخادم؟

أنشئ بيئة افتراضية منفصلة وملف مقبس Gunicorn منفصل وملف خدمة systemd منفصل لكل تطبيق. في Nginx، أضف كتلة خادم منفصلة لكل نطاق مع إعداد وكيل يشير إلى مقبس Gunicorn المقابل.

مقالات ذات صلة

نشر تطبيق Node.js: دليل PM2 و Nginx

دليل شامل لنشر تطبيقات Node.js على VPS. تثبيت Node.js عبر nvm، مدير العمليات PM2، وكيل Nginx العكسي، شهادة SSL وإدارة متغيرات البيئة.

15 دقيقة
nodejspm2nginx

نشر تطبيق PHP: دليل LAMP و LEMP Stack

دليل شامل لنشر تطبيقات PHP على VPS. مقارنة LAMP و LEMP، إعداد Apache/Nginx + PHP-FPM + MySQL، تهيئة المضيف الافتراضي وإدارة إصدارات PHP.

18 دقيقة
phplamplemp

تثبيت WordPress وتحسينه: دليل VPS

دليل تثبيت وتحسين WordPress على VPS. إعداد LEMP Stack، إعدادات wp-config.php، صلاحيات الملفات، SSL، تحسين أداء OPcache وتعزيز الأمان.

20 دقيقة
wordpressvpslemp
حركة الشبكةالداخل Gbpsالخارج Gbps