فصل پنجم: داکرایز کردن یک پروژه‌ی جنگو

تنظیمات production: gunicorn و فایل‌های استاتیک

سرور توسعه کافی نیست

سرور داخلی جنگو (runserver) فقط برای توسعه طراحی شده و برای بار ترافیک واقعی مناسب نیست. در production باید از یک WSGI Server مثل gunicorn استفاده کنیم. Dockerfile برای production کمی متفاوت است و از multi-stage build نیز می‌توان بهره برد:

FROM python:3.12-slim

WORKDIR /code
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

RUN python manage.py collectstatic --noinput

CMD ["gunicorn", "myproject.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "3"]

دستور collectstatic تمام فایل‌های استاتیک (CSS، JS، تصاویر) پروژه را در یک پوشه‌ی واحد جمع می‌کند. در محیط production، معمولاً این فایل‌ها را به یک وب‌سرور سبک‌تر مثل nginx یا یک سرویس ابری می‌سپاریم، نه به خود جنگو، چون جنگو برای سرو فایل استاتیک بهینه نیست.

ترکیب nginx و gunicorn با compose

یک الگوی رایج، افزودن یک سرویس nginx به docker-compose.yml است که درخواست‌های استاتیک را مستقیم پاسخ می‌دهد و بقیه‌ی درخواست‌ها را به gunicorn هدایت می‌کند:

services:
  nginx:
    image: nginx:alpine
    volumes:
      - static_volume:/code/staticfiles
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"
    depends_on:
      - web

در این معماری، nginx به‌عنوان دروازه‌ی ورودی عمل می‌کند و بار سرو فایل‌های استاتیک را از دوش gunicorn برمی‌دارد و کارایی کلی سیستم را بهبود می‌بخشد.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.