Ответ
Развертывание Django в production — это многоэтапный процесс, обеспечивающий безопасность, производительность и надежность. Он кардинально отличается от использования manage.py runserver.
Ключевые шаги:
-
Настройка проекта (
settings.py)- Установите
DEBUG = False. Это отключает отладочную информацию и страницы с ошибками. - Заполните
ALLOWED_HOSTSсписком доменов, с которых разрешены запросы. - Используйте переменные окружения (например, через
python-dotenv) для хранения секретов (SECRET_KEY, пароли от БД). - Настройте production-базу данных (например, PostgreSQL).
- Установите
-
WSGI-сервер Для обработки Python-кода используется production-ready WSGI-сервер, такой как Gunicorn или uWSGI. Он эффективно управляет рабочими процессами.
# Запуск Gunicorn с 4 рабочими процессами, слушающего порт 8000 gunicorn myproject.wsgi:application --workers 4 --bind 0.0.0.0:8000 -
Веб-сервер (Reverse Proxy) Nginx или Apache ставится перед Gunicorn. Его задачи:
- Принимать HTTP/HTTPS трафик.
- Отдавать статические файлы (
/static/,/media/) напрямую, не нагружая Django. - Перенаправлять все остальные запросы на Gunicorn.
- Терминировать SSL (обрабатывать HTTPS).
Пример конфигурации Nginx:
server { listen 80; server_name your_domain.com; location /static/ { alias /path/to/your/project/static/; } location /media/ { alias /path/to/your/project/media/; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } -
Сбор статики Перед запуском необходимо собрать все статические файлы проекта в одну директорию (
STATIC_ROOT), которую будет обслуживать Nginx.python manage.py collectstatic -
Управление процессом Чтобы процесс Gunicorn запускался автоматически и перезапускался в случае сбоя, используется менеджер процессов, например, Systemd.
Ответ 18+ 🔞
А, ну вот, опять про этот ваш продакшн, да? Джингу, Нгинкс... Ёпта, народ, вы там совсем с катушек съехали, что ли? Ну ладно, слушай сюда, сейчас я тебе на пальцах, как для дебила, объясню, как эту шарманку на боевых рельсах развернуть, чтобы она не развалилась на первом же запросе.
Первое и главное, блядь — забудь как страшный сон про эту твою manage.py runserver. Это для местных разборок в подвале, а не для боя. На продакшне эта хуйня сдохнет через пять минут, как муха на стекле.
Итак, поехали по кочкам:
-
Настройки (
settings.py) — тут надо мозги включить, а не пальцем в небо тыкать.DEBUG = False— выключай нахуй, сразу! А то какой-нибудь умник увидит твои секреты в ошибке и тебе пиздец. Страницы ошибок будут теперь скучные, белые, но зато безопасные.ALLOWED_HOSTS— сюда пиши свои домены. Если напишешь['*'], то тебя любой левый бот вгонит в минуса, это как дверь нараспашку оставить с табличкой «заходи, всё твоё».- Секреты (
SECRET_KEY, пароли от базы) — не пиши их в код, ёбушки-воробушки! Засунь их в переменные окружения. Черезpython-dotenvили как угодно. Представь, что выкладываешь код на гитхаб, а там твой ключ как на ладони. Пиздец и срамота. - База данных — PostgreSQL, только он. SQLite — это для игрушек, на нём продакшн крутить — это как на велосипеде с квадратными колёсами в Париж-Дакар ехать. Задолбаешься.
-
WSGI-сервер (наш главный работяга) Вот тут вступает в дело Gunicorn (или uWSGI, но первый попроще). Это такой здоровый мужик, который будет твой Django-код крутить в несколько потоков.
runserver— это один хиленький офисный хлюпик, а Gunicorn — это бригада грузчиков.# Запускаем бригаду из 4 грузчиков (workers), слушаем на всех интерфейсах порт 8000 gunicorn myproject.wsgi:application --workers 4 --bind 0.0.0.0:8000Но запускать его так, из консоли — это по-детски. Он упал, и всё, сайт лёг.
-
Веб-сервер (Reverse Proxy, он же наш секретарь-приёмщик) Это Nginx (или Apache, но первый — наше всё). Его задача — стоять на входе и разгребать поток.
- Пришёл запрос на картинку (
/static/logo.png) или файл (/media/photo.jpg) — Nginx сам, не отвлекая Гunicorn, хвать из папки и отдал. Быстро и без напряга. - Пришёл запрос на что-то умное (например,
/admin/) — Nginx вежливо пересылает его Гunicorn-у на порт 8000: «на, братан, разберись». - Ещё он SSL (HTTPS) на себя берёт. В общем, незаменимая, блядь, вещь.
Вот тебе кусок его конфига, чтоб не пиздел, что сложно:
server { listen 80; server_name твой_домен.ru; # Сюда свой домен впиши, мудя! # Статику отдаём сами, не трогаем Django location /static/ { alias /путь/к/твоему/проекту/static/; # Путь укажи правильный, а то нихуя не найдёт } location /media/ { alias /путь/к/твоему/проекту/media/; } # Всё остальное — проксируем на Gunicorn location / { proxy_pass http://127.0.0.1:8000; # Тот самый порт, где наш работяга слушает proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } - Пришёл запрос на картинку (
-
Сбор статики А то Django свои CSS, JS и картинки по всем углам проекта раскидал. Надо всё в одну кучу собрать, чтобы Nginx знал, где искать. Делается одной командой, но ДО запуска, ёпта!
python manage.py collectstaticПосле этого в папке
STATIC_ROOTбудет аккуратненько всё лежать. -
Автозапуск и слежка (чтобы не упал) Запускать Гunicorn вручную — это пиздец какой-то атавизм. Используем Systemd (если на линуксе). Напишешь ему service-файл, и он будет твоего работягу как родного следить: упал — поднял, сервер перезагрузился — запустил. Красота, в рот меня чих-пых!
Вот и вся магия. Вроде бы дохуя шагов, но если по порядку, то ничего сложного. Главное — не пытайся на runserver выкатываться, а то опозоришься на всю округу.