
به اشتراک بگذارید
آموزش سرور | بلاگ وبداده
نصب Django روی سرور؛ راهنمای قدمبهقدم CentOS با Nginx و Gunicorn
- چرا Gunicorn و Nginx: جنگو نباید مستقیم در معرض اینترنت باشد؛ Gunicorn اپ را اجرا و Nginx جلوی آن میایستد.
- پایتون ۳ روی CentOS 7: پایتون پیشفرض سیستم 2.7.5 است و باید پایتون ۳ را جداگانه از SCL نصب کنید.
- نسخه سازگار: روی پایتون 3.6 آخرین جنگوی پشتیبانیشده نسخه 3.2 LTS است؛ نه نسخههای جدیدتر.
- پایداری با systemd: سرویس Gunicorn را با systemd مدیریت کنید تا با هر ریاستارت خودکار بالا بیاید.
- صادقانه: CentOS 7 به پایان پشتیبانی رسیده و برای پروژه تازه بهتر است سراغ توزیع جدیدتر بروید.
در یک جمله
نصب Django روی سرور: استک Nginx، Gunicorn و جنگو چگونه کار میکند؟
تشبیه ساده

پیشنیازهای لازم برای شروع
۱) دسترسی به سرور
۲) دامنه یا IP ثابت
۳) دانش پایه پایتون و لینوکس
هشدار مهم؛ CentOS 7 به پایان عمر رسیده است
آموزش گامبهگام نصب جنگو روی لینوکس
مرحله ۱: نصب مخازن، پایتون ۳ و بستههای پایه
# اتصال به سرور و بهروزرسانی کامل سیستم
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
# مقداردهی اولیه و راهاندازی 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مرحله ۳: ساخت محیط مجازی و نصب جنگو و Gunicorn
# نصب 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نکته سازگاری نسخه
مرحله ۴: ساخت پروژه و تنظیم settings
# ساخت پروژه 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هشدار؛ DEBUG را در محیط واقعی خاموش کنید
مرحله ۵: تست Gunicorn
# تست Gunicorn بهصورت دستی (از داخل پوشه پروژه و محیط مجازی فعال)
gunicorn --bind 0.0.0.0:8000 myproject.wsgi
# اگر صفحه بدون استایل ولی سالم بالا آمد یعنی Gunicorn درست کار میکند
# با CTRL+C متوقف کنید و از محیط مجازی خارج شوید
deactivateBashمرحله ۶: ساخت سرویس systemd برای Gunicorn
# فایل: /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مرحله ۷: پیکربندی Nginx، فایروال و SELinux
# راهاندازی و فعالسازی سرویس 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چرا تنظیم SELinux ضروری است

سازگاری نسخه پایتون و جنگو روی CentOS 7
| نسخه پایتون | جنگوهای پشتیبانیشده | روش نصب روی CentOS 7 | توضیح |
|---|---|---|---|
| 2.7.5 (پیشفرض) | هیچکدام (جنگو ۲ به بعد) | پیشنصب | فقط برای ابزارهای سیستمی؛ برای جنگو استفاده نکنید |
| 3.6 (SCL) | تا Django 3.2 LTS | yum install rh-python36 | سادهترین مسیر؛ گزینه پیشنهادی این راهنما |
| 3.8 و بالاتر | تا Django 4.2 LTS | کامپایل از سورس یا مخزن IUS | برای جنگوی جدید لازم است؛ پیچیدهتر |
از منابع معتبر
محدودیتها و نکاتی که باید صادقانه بدانید
- CentOS 7 منسوخ است: این سیستمعامل دیگر وصله امنیتی نمیگیرد؛ برای پروژه تازه از توزیع جدیدتر استفاده کنید.
- پایتون 3.6 هم EOL است: شما را به نسخههای قدیمیتر جنگو محدود میکند و امکانات جدید فریمورک در دسترس نخواهد بود.
- پیکربندی دستی خطاخیز است: تنظیم systemd، مجوزها و SELinux برای تازهکار میتواند گیجکننده باشد و خطای 502 رایج است.
- بدون Nginx فایل استاتیک سرو نمیشود: Gunicorn بهتنهایی استایل و رسانه را تحویل نمیدهد؛ Nginx الزامی است.
- HTTPS جداست: این راهنما روی HTTP است؛ برای محیط واقعی باید گواهی SSL (مثلاً Let’s Encrypt) را جداگانه نصب کنید.
عیبیابی مشکلات رایج
- خطای 502 Bad Gateway: رایجترین مشکل؛ معمولاً یعنی بولین SELinux فعال نشده یا سرویس Gunicorn اجرا نیست. با
sudo systemctl status gunicornوضعیت را ببینید وsetseboolرا اجرا کنید. - صفحه بدون استایل (CSS): یعنی فایلهای استاتیک جمع نشده یا مسیر static در Nginx اشتباه است؛
collectstaticرا اجرا و مسیر root را بررسی کنید. - DisallowedHost: آدرس سرور در ALLOWED_HOSTS تنظیم نشده؛ IP یا دامنه را به این لیست در settings.py اضافه کنید.
- خطای اتصال دیتابیس: اطلاعات DATABASES یا متد md5 در pg_hba.conf را چک کنید و مطمئن شوید سرویس postgresql اجرا است.
- دستور python نسخه ۲ را نشان میدهد: فراموش کردهاید
scl enable rh-python36 bashرا اجرا کنید یا محیط مجازی فعال نیست.
اجرای جنگو روی زیرساخت وبداده
✅ دیتاسنترهای ایران، هلند و آلمان برای انتخاب نزدیکترین لوکیشن به کاربران شما.
✅ امکان ارتقای منابع متناسب با رشد اپلیکیشن، بدون نیاز به مهاجرت.
✅ پشتیبانی فنی ۲۴ ساعته برای کمک در راهاندازی و رفع مشکلات اتصال.
پرسشهای پرتکرار درباره استقرار جنگو روی سرور
چرا نباید اپ جنگو را با runserver روی سرور اجرا کنم؟
سرور توسعهای جنگو که با دستور runserver بالا میآید فقط برای تست در حین توسعه طراحی شده و از نظر امنیت و کارایی برای محیط واقعی مناسب نیست. تیم جنگو رسماً تاکید میکند این سرور را در محیط عملیاتی استفاده نکنید و بهجای آن از یک سرور اپلیکیشن مثل Gunicorn پشت Nginx بهره ببرید.
تفاوت Gunicorn و Nginx در این استک چیست؟
Gunicorn یک سرور اپلیکیشن WSGI است که کد پایتون جنگو را اجرا میکند و درخواستها را به اپ میرساند. Nginx یک وبسرور و ریورسپراکسی است که جلوی Gunicorn میایستد، فایلهای استاتیک را سرو میکند و ترافیک را مدیریت میکند. این دو مکمل هم هستند، نه جایگزین یکدیگر.
چرا روی CentOS 7 نمیتوانم آخرین نسخه جنگو را نصب کنم؟
چون پایتونی که بهسادگی روی CentOS 7 از SCL نصب میشود نسخه 3.6 است و جنگو 3.2 آخرین نسخهای است که از پایتون 3.6 پشتیبانی میکند. جنگو 4.2 به بعد حداقل پایتون 3.8 میخواهد. برای نصب جنگوی جدیدتر باید پایتون 3.8+ را از سورس کامپایل کنید.
آیا حتماً باید از PostgreSQL استفاده کنم؟
خیر، اجباری نیست. جنگو از SQLite، MySQL/MariaDB و PostgreSQL پشتیبانی میکند. SQLite برای تست خوب است اما برای محیط واقعی توصیه نمیشود. PostgreSQL بهدلیل پایداری و سازگاری خوب با جنگو یک انتخاب رایج و مطمئن برای پروژههای عملیاتی است.
خطای 502 Bad Gateway بعد از نصب یعنی چه؟
این خطا معمولاً یعنی Nginx نمیتواند به سوکت Gunicorn متصل شود. شایعترین دلیل روی CentOS این است که بولین SELinux یعنی httpd_can_network_connect فعال نشده است. همچنین بررسی کنید سرویس Gunicorn در حال اجرا باشد و مسیر سوکت در تنظیمات Nginx درست باشد.
سرویس systemd برای Gunicorn چه فایدهای دارد؟
بدون systemd، اگر ترمینال را ببندید یا سرور ریاستارت شود، Gunicorn متوقف میماند. تعریف یک سرویس systemd باعث میشود Gunicorn بهصورت خودکار با بوت سیستم بالا بیاید، در صورت کرش دوباره راه بیفتد و با دستورهای ساده systemctl قابل مدیریت باشد.
چطور سایت جنگو را روی HTTPS امن کنم؟
این راهنما روی HTTP تمرکز دارد. برای فعالکردن HTTPS میتوانید یک گواهی رایگان از Let’s Encrypt با ابزار Certbot بگیرید و آن را در پیکربندی Nginx اضافه کنید. این کار ترافیک بین کاربر و سرور را رمزنگاری میکند و برای هر سایت عملیاتی ضروری است.
آیا این روش برای اوبونتو هم کار میکند؟
مفهوم و معماری استک کاملاً یکسان است، اما ابزارها فرق دارند. روی اوبونتو بهجای yum از apt، پایتون ۳ بهصورت پیشفرض موجود است، فایروال ufw است و SELinux معمولاً فعال نیست. منطق Gunicorn، سرویس systemd و ریورسپراکسی Nginx در هر دو یکسان است.
بعد از استقرار، برای بهروزرسانی کد چه باید بکنم؟
پس از انتقال کد جدید به سرور، محیط مجازی را فعال کنید، در صورت تغییر مدلها migrate را اجرا کنید، اگر فایل استاتیک تغییر کرده collectstatic بزنید و در پایان سرویس را با دستور sudo systemctl restart gunicorn ریاستارت کنید تا تغییرها اعمال شوند.
جمعبندی و قدم بعدی شما
جمعبندی سریع
✅ PostgreSQL و محیط مجازی را راه بیندازید.
✅ سرویس systemd برای Gunicorn بسازید تا پایدار بماند.
✅ Nginx، فایروال و بولین SELinux را درست تنظیم کنید تا خطای 502 نگیرید.



