
مقدمه
در زیرساختهای ابری، روشهای مختلفی برای مقیاسپذیر (Scalable) و ایمن (Secure) کردن یک برنامه Django وجود دارد.
یکی از رایجترین روشها، مقیاسپذیری افقی (Horizontal Scaling) است. در این روش بهجای افزایش منابع یک سرور، چندین نمونه (Instance) از برنامه Django اجرا میشود. این کار علاوه بر افزایش توان پردازش درخواستها، باعث میشود در صورت از کار افتادن یکی از سرورها، سرویس همچنان در دسترس باقی بماند و تحمل خطای بالاتری داشته باشد.
برای پیادهسازی این معماری معمولاً چند سرور برنامه (Application Server) در نظر گرفته میشود که روی هرکدام برنامه Django به همراه یک WSGI Server مانند Gunicorn یا uWSGI اجرا میشود.
در جلوی این سرورها نیز یک Nginx قرار میگیرد که وظایف زیر را بر عهده دارد:
- توزیع درخواستها بین سرورهای Django (Load Balancing)
- Reverse Proxy
- مدیریت اتصالهای HTTPS
- پایان دادن به ارتباط TLS (TLS Termination)
- ارسال درخواستها به سرورهای برنامه
اجرای Django و Nginx داخل کانتینرهای Docker باعث میشود بدون توجه به محیط اجرا (توسعه، تست یا تولید)، رفتار برنامه کاملاً یکسان باشد. همچنین Docker فرایند استقرار، بروزرسانی و مدیریت برنامه را بسیار سادهتر میکند.
در این آموزش ابتدا یک برنامه Django که داخل Docker اجرا میشود را به صورت افقی مقیاسپذیر میکنیم؛ به این صورت که دو سرور برنامه خواهیم داشت و روی هرکدام یک کانتینر شامل Django و Gunicorn اجرا میشود.
سپس برای فعال کردن HTTPS، یک سرور سوم راهاندازی میکنیم که روی آن دو کانتینر اجرا خواهند شد:
- Nginx به عنوان Reverse Proxy و Load Balancer
- Certbot برای دریافت و تمدید خودکار گواهی SSL از Let’s Encrypt
گواهیهای TLS توسط Certbot دریافت شده و در اختیار Nginx قرار میگیرند تا تمامی ارتباطات از طریق HTTPS انجام شوند. در این معماری، تمام درخواستهای کاربران ابتدا وارد سرور Nginx شده و سپس بین دو سرور Django توزیع میشوند.
در انتها نیز با اعمال تنظیمات امنیتی مناسب، دسترسی مستقیم کاربران به سرورهای Django را مسدود میکنیم تا تنها Nginx امکان برقراری ارتباط با آنها را داشته باشد.
پیشنیازها
برای انجام این آموزش به موارد زیر نیاز دارید:
۱. سه سرور Ubuntu
به سه سرور Ubuntu 24.04 LTS (یا نسخههای جدیدتر) نیاز دارید:
- دو سرور برای اجرای برنامه Django و Gunicorn
- یک سرور برای اجرای Nginx و Certbot
روی هر سه سرور باید:
- یک کاربر غیر Root با دسترسی sudo ایجاد شده باشد.
- فایروال فعال باشد.
۲. نصب Docker روی هر سه سرور
روی هر سه سرور Docker را نصب کنید.
اگر از پارمین کلود استفاده میکنید، برای نصب Docker از میرور رسمی پارمین کلود استفاده کنید.
اضافه کردن کلید GPG
curl -fsSL https://docker-ce.parmincloud.ir/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
اضافه کردن مخزن Docker
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://docker-ce.parmincloud.ir/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
سپس:
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
۳. یک دامنه
به یک دامنه نیاز دارید؛ در این آموزش از دامنه زیر استفاده میکنیم:
your_domain.com
۴. تنظیم DNS
یک رکورد A ایجاد کنید تا دامنه شما به IP عمومی سرور Nginx اشاره کند.
۵. فضای ذخیرهسازی برای فایلهای Static
برای نگهداری فایلهای Static برنامه Django به یک فضای Object Storage سازگار با S3 نیاز دارید.
در این آموزش میتوانید از Object Storage پارمین کلود یا هر سرویس سازگار با S3 استفاده کنید.
همچنین باید اطلاعات زیر را در اختیار داشته باشید:
- Access Key
- Secret Key
- Bucket Name
- Endpoint URL
۶. پایگاه داده PostgreSQL
یک سرور PostgreSQL آماده کنید و یک دیتابیس برای پروژه ایجاد نمایید.
برای مثال:
- Database Name
polls
- Database User
sammy
همچنین اطلاعات زیر را یادداشت کنید:
- نام دیتابیس
- نام کاربری
- رمز عبور
- آدرس سرور
- شماره پورت
در این آموزش از PostgreSQL استفاده میکنیم، اما با تغییرات جزئی میتوانید از سایر پایگاههای داده پشتیبانیشده توسط Django نیز استفاده کنید.
مرحله اول — راهاندازی اولین سرور Django
در این بخش، اولین سرور برنامه (Application Server) را آماده میکنیم. در پایان این مرحله، یک کانتینر شامل Django و Gunicorn روی اولین سرور اجرا خواهد شد و از طریق مرورگر قابل دسترس خواهد بود.
نکته: اگر قبلاً مقاله «راهاندازی Django و Gunicorn با Docker» را انجام دادهاید، میتوانید این مرحله را رد کرده و مستقیماً به مرحله دوم بروید.
دریافت سورس پروژه
ابتدا وارد اولین سرور شوید و مخزن نمونه پروژه Polls را دریافت کنید:
git clone --single-branch --branch polls-docker https://github.com/do-community/django-polls.git
سپس وارد پوشه پروژه شوید:
cd django-polls
این پروژه نسخه Dockerized برنامه نمونه Polls در مستندات Django است که برای اجرا داخل کانتینر آماده شده است.
بررسی Dockerfile
فایل Dockerfile را مشاهده کنید:
cat Dockerfile
محتوای آن مشابه زیر خواهد بود:
FROM python:3.7.4-alpine3.10
ADD django-polls/requirements.txt /app/requirements.txt
RUN set -ex \
&& apk add --no-cache --virtual .build-deps postgresql-dev build-base \
&& python -m venv /env \
&& /env/bin/pip install --upgrade pip \
&& /env/bin/pip install --no-cache-dir -r /app/requirements.txt \
&& runDeps="$(scanelf --needed --nobanner --recursive /env \
| awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
| sort -u \
| xargs -r apk info --installed \
| sort -u)" \
&& apk add --virtual rundeps $runDeps \
&& apk del .build-deps
ADD django-polls /app
WORKDIR /app
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
EXPOSE 8000
CMD ["gunicorn", "--bind", ":8000", "--workers", "3", "mysite.wsgi"]
این Dockerfile مراحل زیر را انجام میدهد:
- از ایمیج رسمی Python به عنوان Base Image استفاده میکند.
- وابستگیهای موردنیاز پروژه را نصب میکند.
- محیط مجازی Python ایجاد میکند.
- کتابخانههای موردنیاز Django و Gunicorn را نصب میکند.
- فایلهای پروژه را داخل ایمیج کپی میکند.
- پورت 8000 را برای دریافت درخواستها باز میکند.
- در نهایت Gunicorn را با سه Worker اجرا میکند تا درخواستهای ورودی را پردازش کند.
ساخت ایمیج Docker
اکنون ایمیج پروژه را بسازید:
docker build -t polls .
پارامتر -t نام ایمیج را مشخص میکند. در این آموزش نام ایمیج را polls قرار دادهایم.
پس از پایان Build، ایمیجهای موجود را بررسی کنید:
docker images
خروجی مشابه زیر خواهد بود:
REPOSITORY TAG SIZE
polls latest 197MB
python 3.7.4 98MB
اگر ایمیج polls را مشاهده میکنید، یعنی ساخت ایمیج با موفقیت انجام شده است.
پیکربندی فایل env
قبل از اجرای کانتینر، باید متغیرهای محیطی پروژه را تنظیم کنیم.
فایل env را باز کنید:
nano env
محتوای آن به شکل زیر است:
DJANGO_SECRET_KEY=
DEBUG=True
DJANGO_ALLOWED_HOSTS=
DATABASE_ENGINE=postgresql_psycopg2
DATABASE_NAME=polls
DATABASE_USERNAME=
DATABASE_PASSWORD=
DATABASE_HOST=
DATABASE_PORT=
STATIC_ACCESS_KEY_ID=
STATIC_SECRET_KEY=
STATIC_BUCKET_NAME=
STATIC_ENDPOINT_URL=
DJANGO_LOGLEVEL=info
مقادیر زیر را تکمیل کنید:
| متغیر | توضیح |
|---|---|
| DJANGO_SECRET_KEY | یک کلید امنیتی تصادفی و غیرقابل حدس برای Django |
| DJANGO_ALLOWED_HOSTS | در محیط آزمایشی میتوانید * قرار دهید. در محیط Production دامنه سایت را وارد کنید. |
| DATABASE_NAME | نام دیتابیس PostgreSQL |
| DATABASE_USERNAME | نام کاربر دیتابیس |
| DATABASE_PASSWORD | رمز عبور دیتابیس |
| DATABASE_HOST | آدرس یا IP سرور PostgreSQL |
| DATABASE_PORT | پورت PostgreSQL (معمولاً 5432) |
| STATIC_ACCESS_KEY_ID | Access Key مربوط به فضای ذخیرهسازی S3 |
| STATIC_SECRET_KEY | Secret Key فضای ذخیرهسازی |
| STATIC_BUCKET_NAME | نام Bucket |
| STATIC_ENDPOINT_URL | آدرس Endpoint سرویس Object Storage |
پس از تکمیل اطلاعات، فایل را ذخیره و خارج شوید.




