Список проверок при развертывании
Интернет — враждебная среда. Перед развертыванием проекта Django следует уделить время на проверку настроек, учитывая безопасность, производительность и эксплуатацию.
Django включает множество функций безопасности. Некоторые из них встроенные и всегда включены. Другие являются необязательными, так как не всегда подходят или затрудняют разработку. Например, принудительное использование HTTPS может не подходить для всех сайтов и непрактично для локальной разработки.
Оптимизации производительности — еще одна категория компромиссов с удобством. Например, кэширование полезно в продакшене, в меньшей степени — для локальной разработки. Требования к обработке ошибок также сильно различаются.
Следующий список проверок включает настройки, которые:
- должны быть настроены правильно для того, чтобы Django обеспечивал ожидаемый уровень безопасности;
- должны отличаться в каждой среде;
- включают необязательные функции безопасности;
- включают оптимизации производительности;
- предоставляют обработку ошибок.
Многие из этих настроек конфиденциальны и должны рассматриваться как секретные. Если вы публикуете исходный код проекта, распространённой практикой является публикация соответствующих настроек для разработки и использование отдельного модуля настроек для продакшена.
Выполнение manage.py check --deploy
Некоторые проверки, описанные ниже, могут быть автоматизированы с помощью опции check
--deploy. Убедитесь, что вы запускаете её против файла настроек продакшена, как описано в документации к этой опции.
Переход от manage.py runserver
Команда runserver не предназначена для продакшена. Убедитесь, что вы переключили сервер на WSGI или ASGI, готовый к работе в продакшене. Примеры распространённых вариантов см. в документации по WSGI серверам или документации по ASGI серверам.
Критические настройки
SECRET_KEY
Ключ секретности должен быть большим случайным значением и должен храниться в секрете.
Убедитесь, что ключ, используемый в продакшене, не используется нигде в другом месте, и избегайте его добавления в контроль версий. Это уменьшает количество векторов, с помощью которых злоумышленник может получить ключ.
Вместо того, чтобы жестко закодировать ключ секретности в модуле настроек, рассмотрите возможность его загрузки из переменной окружения:
import os SECRET_KEY = os.environ["SECRET_KEY"]
или из файла:
with open("/etc/secret_key.txt") as f:
SECRET_KEY = f.read().strip()
При вращении ключей секретности вы можете использовать SECRET_KEY_FALLBACKS:
import os
SECRET_KEY = os.environ["CURRENT_SECRET_KEY"]
SECRET_KEY_FALLBACKS = [
os.environ["OLD_SECRET_KEY"],
]
Убедитесь, что старые ключи секретности своевременно удаляются из SECRET_KEY_FALLBACKS.
DEBUG
В продакшене режим отладки должен быть отключен.
Вы, безусловно, разрабатываете проект с включенным DEBUG = True, так как это включает полезные функции, такие как полные трассировки в вашем браузере.
Однако в среде продакшена это очень плохая идея, потому что она раскрывает много информации о вашем проекте: фрагменты исходного кода, локальные переменные, настройки, используемые библиотеки и т.д.
Настройки, зависящие от среды
ALLOWED_HOSTS
Когда DEBUG = False, Django вообще не работает без подходящего значения для ALLOWED_HOSTS.
Эта настройка требуется для защиты сайта от некоторых атак CSRF. Если вы используете подстановку, вы должны выполнить собственную проверку заголовка Host HTTP или каким-либо другим способом убедиться, что ваш сайт не уязвим для этого типа атак.
Также следует настроить веб-сервер, расположенный перед Django, для проверки хоста. Он должен отвечать статической страницей ошибки или игнорировать запросы на неправильные хосты, вместо того, чтобы пересылать запрос в Django. Таким образом, вы избежите ложных ошибок в ваших логах Django (или электронных письмах, если у вас настроена система оповещения об ошибках).
Например, в nginx вы можете настроить сервер по умолчанию для возврата «444 Нет ответа» при обнаружении неизвестного хоста:
server {
listen 80 default_server;
return 444;
}
CACHES
Если вы используете кэш, параметры подключения могут отличаться в разработке и в продакшене. Django по умолчанию использует кэширование в локальной памяти на уровне процесса, что может быть нежелательным.
Серверы кэширования часто имеют слабую аутентификацию. Убедитесь, что они принимают соединения только от ваших приложений.
DATABASES
Параметры подключения к базе данных, скорее всего, отличаются в разработке и в продакшене.
Пароли баз данных являются очень конфиденциальными. Вы должны защищать их так же, как и SECRET_KEY.
Для максимальной безопасности убедитесь, что серверы баз данных принимают соединения только от ваших приложений.
Если вы еще не настроили резервные копии для базы данных, сделайте это прямо сейчас!
STATIC_ROOT и STATIC_URL
Статические файлы автоматически обслуживаются сервером разработки. В продакшене вы должны определить директорию STATIC_ROOT, куда collectstatic скопирует их.
См. Инструкцию по управлению статическими файлами (например, изображениями, JavaScript, CSS) для получения дополнительной информации.
MEDIA_ROOT и MEDIA_URL
Файлы медиа загружаются пользователями. Они ненадёжны! Убедитесь, что ваш веб-сервер никогда не пытается интерпретировать их. Например, если пользователь загружает .php файл, веб-сервер не должен его выполнять.
Сейчас самое время проверить вашу стратегию резервного копирования этих файлов.
HTTPS
Любой сайт, позволяющий пользователям входить в систему, должен использовать HTTPS для всего сайта, чтобы избежать передачи токенов доступа в открытом виде. В Django токены доступа включают логин/пароль, cookie сессии и токены сброса пароля. (Вы не можете много сделать для защиты токенов сброса пароля, если вы отправляете их по электронной почте.)
Защита таких чувствительных областей, как пользовательский аккаунт или административная панель, недостаточно, потому что один и тот же cookie сессии используется для HTTP и HTTPS. Ваш веб-сервер должен перенаправлять весь HTTP-трафик на HTTPS и только передавать HTTPS-запросы Django.
После настройки HTTPS включите следующие настройки.
Оптимизация производительности
Установка DEBUG = False отключает несколько функций, которые полезны только в процессе разработки. Кроме того, вы можете настроить следующие параметры.
Сессии
Для повышения производительности рассмотрите использование кэшированных сессий.
При использовании сессий, поддерживаемых базой данных, регулярно очищайте старые сессии, чтобы избежать хранения ненужных данных.
CONN_MAX_AGE
Включение постоянных подключений к базе данных может заметно ускорить работу, если подключение к базе данных занимает значительную часть времени обработки запроса.
Это особенно полезно на виртуализированных хостах с ограниченной производительностью сети.
TEMPLATES
Включение кэшированного загрузчика шаблонов часто значительно улучшает производительность, так как позволяет избежать компиляции каждого шаблона каждый раз при его рендеринге. При значении DEBUG = False, кэшированный загрузчик шаблонов автоматически включен. Подробнее см. django.template.loaders.cached.Loader.
Отчёт об ошибках
К моменту публикации вашего кода в производство, он, надеюсь, надёжен, но нельзя исключить непредвиденные ошибки. К счастью, Django может обрабатывать ошибки и соответствующим образом уведомлять вас.
LOGGING
Перед запуском вашего сайта в производство проверьте конфигурацию логирования и убедитесь, что она работает должным образом после получения некоторого трафика.
Подробности о логировании см. в разделе Логирование.
ADMINS и MANAGERS
ADMINS будут получать уведомления о 500 ошибках по электронной почте.
MANAGERS будут получать уведомления о 404 ошибках. IGNORABLE_404_URLS может помочь отфильтровать ложные сообщения.
Подробные инструкции о отчёте об ошибках по электронной почте см. в разделе Как управлять отчётом об ошибках.
Отчёт об ошибках по электронной почте не масштабируется
Перед тем, как ваш почтовый ящик будет переполнен сообщениями об ошибках, рассмотрите использование системы мониторинга ошибок, например, Sentry. Sentry также может агрегировать логи.
Настройка стандартных представлений об ошибках
Django включает стандартные представления и шаблоны для нескольких кодов HTTP-ошибок. Возможно, вам захочется переопределить стандартные шаблоны, создав следующие шаблоны в корневой папке шаблонов: 404.html, 500.html, 403.html и 400.html. Стандартные представления об ошибках представления об ошибках по умолчанию, которые используют эти шаблоны, подойдут для 99% веб-приложений, но вы также можете настроить их.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/