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

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

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

وقت القراءة: 18 دقيقة استضافة الويب / التطبيقات
pythondjangogunicornnginxdeployvpsvirtualenvwsgipostgresql

جدول المحتويات

نشر 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، يبدأ التطبيق تلقائياً عند إعادة تشغيل الخادم.