
به اشتراک بگذارید

به اشتراک بگذارید
آموزش سرور | بلاگ وبداده
نصب Django روی سرور؛ راهنمای قدمبهقدم CentOS با Nginx و Gunicorn

# اتصال به سرور و بهروزرسانی کامل سیستم
ssh root@SERVER_IP
sudo yum update -y
# فعالسازی مخزن EPEL و نصب ابزارهای پایه + Nginx
sudo yum install -y epel-release
sudo yum install -y python-devel postgresql-server postgresql-devel \
postgresql-contrib gcc nginx
# نصب پایتون ۳ از طریق Software Collections (پایتون سیستمی 2.7.5 دستنخورده میماند)
sudo yum install -y centos-release-scl scl-utils-build
sudo yum install -y rh-python36
# فعالسازی محیط پایتون ۳ برای نشست جاری
scl enable rh-python36 bash
python --version # باید Python 3.6.x را نشان دهدBash# مقداردهی اولیه و راهاندازی PostgreSQL
sudo postgresql-setup initdb
sudo systemctl start postgresql
# در فایل pg_hba.conf متد احراز هویت host را به md5 تغییر دهید
sudo nano /var/lib/pgsql/data/pg_hba.conf
# host all all 127.0.0.1/32 md5
# host all all ::1/128 md5
sudo systemctl restart postgresql
sudo systemctl enable postgresql
# ساخت دیتابیس و کاربر برای پروژه (رمز قوی انتخاب کنید)
sudo su - postgres
psql
CREATE DATABASE myproject;
CREATE USER myprojectuser WITH PASSWORD 'STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
\q
exitBash# نصب pip و ابزار virtualenv در محیط پایتون ۳
pip install --upgrade pip
pip install virtualenv
# ساخت پوشه پروژه و محیط مجازی ایزوله
mkdir ~/myproject && cd ~/myproject
virtualenv myprojectenv
source myprojectenv/bin/activate
# نصب Django، Gunicorn و درایور PostgreSQL داخل محیط مجازی
# روی پایتون 3.6، نسخه پایدار سازگار Django نسخه 3.2 LTS است
pip install "django==3.2.*" gunicorn psycopg2-binaryBash# ساخت پروژه Django در پوشه جاری (نقطه پایانی مهم است)
django-admin startproject myproject .
# تنظیمات اصلی را در فایل settings.py ویرایش کنید:
# ALLOWED_HOSTS = ['SERVER_IP', 'your-domain.com']
# DATABASES → موتور postgresql با نام/کاربر/رمز بالا
# STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
# اجرای مهاجرتها، ساخت کاربر مدیر و جمعآوری فایلهای استاتیک
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py collectstatic
# تست سریع با سرور توسعه (پورت ۸۰۰۰ را موقتاً در فایروال باز کنید)
python manage.py runserver 0.0.0.0:8000Bash# تست Gunicorn بهصورت دستی (از داخل پوشه پروژه و محیط مجازی فعال)
gunicorn --bind 0.0.0.0:8000 myproject.wsgi
# اگر صفحه بدون استایل ولی سالم بالا آمد یعنی Gunicorn درست کار میکند
# با CTRL+C متوقف کنید و از محیط مجازی خارج شوید
deactivateBash# فایل: /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=deploy
Group=nginx
WorkingDirectory=/home/deploy/myproject
ExecStart=/home/deploy/myproject/myprojectenv/bin/gunicorn \
--workers 3 \
--bind unix:/home/deploy/myproject/myproject.sock \
myproject.wsgi:application
[Install]
WantedBy=multi-user.targetINI# راهاندازی و فعالسازی سرویس Gunicorn
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
# بلوک سرور Nginx را در /etc/nginx/nginx.conf اضافه کنید:
# server {
# listen 80;
# server_name SERVER_IP your-domain.com;
# location /static/ { root /home/deploy/myproject; }
# location / {
# proxy_set_header Host $http_host;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_pass http://unix:/home/deploy/myproject/myproject.sock;
# }
# }
# اجازه دسترسی Nginx به پوشه کاربر + باز کردن فایروال
sudo usermod -a -G deploy nginx
sudo chmod 710 /home/deploy
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
# مجوز SELinux برای اتصال Nginx به سوکت Gunicorn (وگرنه خطای 502)
sudo setsebool -P httpd_can_network_connect 1
# تست پیکربندی و ریاستارت Nginx
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl enable nginxBash
| نسخه پایتون | جنگوهای پشتیبانیشده | روش نصب روی CentOS 7 | توضیح |
|---|---|---|---|
| 2.7.5 (پیشفرض) | هیچکدام (جنگو ۲ به بعد) | پیشنصب | فقط برای ابزارهای سیستمی؛ برای جنگو استفاده نکنید |
| 3.6 (SCL) | تا Django 3.2 LTS | yum install rh-python36 | سادهترین مسیر؛ گزینه پیشنهادی این راهنما |
| 3.8 و بالاتر | تا Django 4.2 LTS | کامپایل از سورس یا مخزن IUS | برای جنگوی جدید لازم است؛ پیچیدهتر |
sudo systemctl status gunicorn وضعیت را ببینید و setsebool را اجرا کنید.collectstatic را اجرا و مسیر root را بررسی کنید.scl enable rh-python36 bash را اجرا کنید یا محیط مجازی فعال نیست.سرور توسعهای جنگو که با دستور runserver بالا میآید فقط برای تست در حین توسعه طراحی شده و از نظر امنیت و کارایی برای محیط واقعی مناسب نیست. تیم جنگو رسماً تاکید میکند این سرور را در محیط عملیاتی استفاده نکنید و بهجای آن از یک سرور اپلیکیشن مثل Gunicorn پشت Nginx بهره ببرید.
Gunicorn یک سرور اپلیکیشن WSGI است که کد پایتون جنگو را اجرا میکند و درخواستها را به اپ میرساند. Nginx یک وبسرور و ریورسپراکسی است که جلوی Gunicorn میایستد، فایلهای استاتیک را سرو میکند و ترافیک را مدیریت میکند. این دو مکمل هم هستند، نه جایگزین یکدیگر.
چون پایتونی که بهسادگی روی CentOS 7 از SCL نصب میشود نسخه 3.6 است و جنگو 3.2 آخرین نسخهای است که از پایتون 3.6 پشتیبانی میکند. جنگو 4.2 به بعد حداقل پایتون 3.8 میخواهد. برای نصب جنگوی جدیدتر باید پایتون 3.8+ را از سورس کامپایل کنید.
خیر، اجباری نیست. جنگو از SQLite، MySQL/MariaDB و PostgreSQL پشتیبانی میکند. SQLite برای تست خوب است اما برای محیط واقعی توصیه نمیشود. PostgreSQL بهدلیل پایداری و سازگاری خوب با جنگو یک انتخاب رایج و مطمئن برای پروژههای عملیاتی است.
این خطا معمولاً یعنی Nginx نمیتواند به سوکت Gunicorn متصل شود. شایعترین دلیل روی CentOS این است که بولین SELinux یعنی httpd_can_network_connect فعال نشده است. همچنین بررسی کنید سرویس Gunicorn در حال اجرا باشد و مسیر سوکت در تنظیمات Nginx درست باشد.
بدون systemd، اگر ترمینال را ببندید یا سرور ریاستارت شود، Gunicorn متوقف میماند. تعریف یک سرویس systemd باعث میشود Gunicorn بهصورت خودکار با بوت سیستم بالا بیاید، در صورت کرش دوباره راه بیفتد و با دستورهای ساده systemctl قابل مدیریت باشد.
این راهنما روی HTTP تمرکز دارد. برای فعالکردن HTTPS میتوانید یک گواهی رایگان از Let’s Encrypt با ابزار Certbot بگیرید و آن را در پیکربندی Nginx اضافه کنید. این کار ترافیک بین کاربر و سرور را رمزنگاری میکند و برای هر سایت عملیاتی ضروری است.
مفهوم و معماری استک کاملاً یکسان است، اما ابزارها فرق دارند. روی اوبونتو بهجای yum از apt، پایتون ۳ بهصورت پیشفرض موجود است، فایروال ufw است و SELinux معمولاً فعال نیست. منطق Gunicorn، سرویس systemd و ریورسپراکسی Nginx در هر دو یکسان است.
پس از انتقال کد جدید به سرور، محیط مجازی را فعال کنید، در صورت تغییر مدلها migrate را اجرا کنید، اگر فایل استاتیک تغییر کرده collectstatic بزنید و در پایان سرویس را با دستور sudo systemctl restart gunicorn ریاستارت کنید تا تغییرها اعمال شوند.