سرور توسعه کافی نیست
سرور داخلی جنگو (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 برمیدارد و کارایی کلی سیستم را بهبود میبخشد.