Развертывание Django-приложения на производственном сервере включает несколько ключевых шагов, от настройки серверного окружения до конфигурации веб-сервера и фаервола. В этом руководстве мы рассмотрим процесс деплоя Django-приложения на Ubuntu с использованием Apache и mod_wsgi.
Подготовка сервера Ubuntu
Перед началом развертывания необходимо подготовить сервер.
Обновление списка пакетов и установка необходимых утилит
Убедитесь, что список пакетов вашей системы актуален, и установите базовые утилиты, которые могут понадобиться.
sudo apt update
sudo apt upgrade -y
sudo apt install -y python3-dev build-essential libpq-dev python3-venv git curl
# libpq-dev необходим для psycopg2 (PostgreSQL)
# Добавьте другие *-dev пакеты, если ваше приложение использует базы данных вроде MySQL/MariaDBУстановка Python, Pip и Virtualenv
Ubuntu обычно поставляется с предустановленным Python 3. Проверьте версию и установите pip и venv (если python3-venv не был установлен ранее).
python3 --version
sudo apt install -y python3-pip python3-venvСоздание пользователя для запуска Django-приложения
Из соображений безопасности не рекомендуется запускать веб-приложения от имени root. Создадим отдельного пользователя.
sudo adduser django_user
# Следуйте инструкциям для установки пароля и информации о пользователе
# Опционально: добавьте пользователя в группу sudo для выполнения административных задач
sudo usermod -aG sudo django_user
# Переключитесь на нового пользователя
su - django_userНастройка Django-проекта
Теперь настроим сам Django-проект на сервере.
Клонирование проекта из репозитория (Git) или загрузка файлов проекта
Разместите код вашего приложения на сервере. Чаще всего это делается через систему контроля версий, например, Git.
# Клонирование из Git
git clone https://your_repository_url.git /home/django_user/myproject
cd /home/django_user/myproject
# Или загрузите архив и распакуйте его
# curl -O
# unzip -d /home/django_user/myproject
# cd /home/django_user/myprojectСоздание виртуального окружения и установка зависимостей (requirements.txt)
Изолируем зависимости проекта с помощью виртуального окружения.
python3 -m venv venv
source venv/bin/activate
# Установите зависимости
pip install -r requirements.txtНастройка settings.py для работы с сервером (DEBUG, ALLOWED_HOSTS, STATIC_ROOT)
Адаптируйте файл настроек Django (settings.py или его производный) для производственного окружения.
# settings.py
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG: bool = False
ALLOWED_HOSTS: list[str] = ['your_domain.com', 'www.your_domain.com', 'server_ip_address']
# Настройки базы данных (пример для PostgreSQL)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your_db_name',
'USER': 'your_db_user',
'PASSWORD': 'your_db_password',
'HOST': 'localhost', # Или адрес вашего DB сервера
'PORT': '5432',
}
}
# Путь для сбора статических файлов
STATIC_ROOT: str = '/home/django_user/myproject/staticfiles'
STATIC_URL: str = '/static/'
# Опционально: настройте MEDIA_ROOT и MEDIA_URL, если ваше приложение работает с пользовательскими файлами
# MEDIA_ROOT = '/home/django_user/myproject/mediafiles'
# MEDIA_URL = '/media/'DEBUG = False: Обязательно для production из соображений безопасности.
ALLOWED_HOSTS: Укажите доменные имена и/или IP-адрес, по которым будет доступно приложение.
DATABASES: Настройте подключение к вашей производственной базе данных.
STATIC_ROOT: Директория, куда Django соберет все статические файлы (css, js, images) вашего проекта и подключенных приложений.
Выполнение миграций базы данных (python manage.py migrate)
Примените миграции для создания структуры таблиц в базе данных.
(venv) python manage.py migrateСбор статики (python manage.py collectstatic)
Соберите все статические файлы в директорию, указанную в STATIC_ROOT.
(venv) python manage.py collectstaticНастройка Apache
Настроим Apache для обслуживания Django-приложения через mod_wsgi.
Установка Apache и mod_wsgi
Установите веб-сервер Apache и модуль mod_wsgi для Python 3.
# Выйдите из пользователя django_user обратно в пользователя с sudo правами
exit
sudo apt install -y apache2 libapache2-mod-wsgi-py3Настройка виртуального хоста Apache для Django-приложения
Создайте конфигурационный файл для вашего сайта в директории /etc/apache2/sites-available/. Назовем его myproject.conf.
# /etc/apache2/sites-available/myproject.conf
ServerAdmin webmaster@your_domain.com
ServerName your_domain.com
ServerAlias www.your_domain.com
DocumentRoot /home/django_user/myproject
ErrorLog ${APACHE_LOG_DIR}/myproject-error.log
CustomLog ${APACHE_LOG_DIR}/myproject-access.log combined
# Путь к WSGI скрипту
WSGIScriptAlias / /home/django_user/myproject/myproject/wsgi.py
# Рекомендуется использовать daemon mode для лучшей изоляции и управления
WSGIDaemonProcess myproject python-home=/home/django_user/myproject/venv python-path=/home/django_user/myproject
WSGIProcessGroup myproject
# Обслуживание статических файлов через Apache
Alias /static/ /home/django_user/myproject/staticfiles/
Require all granted
# Обслуживание медиа файлов (если используется)
# Alias /media/ /home/django_user/myproject/mediafiles/
#
# Require all granted
#
# Доступ к файлу wsgi.py
Require all granted
# Опционально: Настройка HTTPS с Let's Encrypt / SSL сертификатом
# SSLEngine on
# SSLCertificateFile /etc/letsencrypt/live/your_domain.com/fullchain.pem
# SSLCertificateKeyFile /etc/letsencrypt/live/your_domain.com/privkey.pem
# Include /etc/letsencrypt/options-ssl-apache.conf
Замените your_domain.com, /home/django_user/myproject и другие пути на ваши.
WSGIScriptAlias: Указывает Apache, что запросы к корневому URL (/) должны обрабатываться указанным wsgi.py файлом.
WSGIDaemonProcess: Определяет отдельный процесс (демон) для запуска приложения. python-home указывает на виртуальное окружение, python-path — на корень проекта.
WSGIProcessGroup: Привязывает обработку запросов к созданному демону.
Alias /static/: Говорит Apache обслуживать запросы к /static/ из директории STATIC_ROOT.
<Directory>: Блоки для настройки прав доступа к соответствующим директориям.
Создание файла WSGI для связи Apache и Django
Убедитесь, что ваш файл myproject/wsgi.py (путь может отличаться в зависимости от структуры вашего проекта) настроен корректно. Обычно он создается автоматически командой django-admin startproject.
# myproject/wsgi.py
import os
import sys
from django.core.wsgi import get_wsgi_application
# Добавляем путь к проекту в sys.path
path: str = '/home/django_user/myproject'
if path not in sys.path:
sys.path.insert(0, path)
# Указываем Django путь к файлу настроек
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
# Получаем WSGI-приложение Django
application = get_wsgi_application()Убедитесь, что DJANGO_SETTINGS_MODULE указывает на правильный файл настроек.
Путь /home/django_user/myproject должен соответствовать расположению вашего проекта.
Активация виртуального хоста и перезапуск Apache
Активируйте созданный конфигурационный файл сайта и деактивируйте стандартный сайт Apache (если он активен). Затем проверьте конфигурацию Apache и перезапустите сервис.
sudo a2ensite myproject.conf
sudo a2dissite 000-default.conf # Опционально, если стандартный сайт не нужен
sudo apache2ctl configtest # Проверка синтаксиса конфигурации
# Ожидаемый вывод: Syntax OK
sudo systemctl restart apache2
# Также может потребоваться перезагрузка:
# sudo systemctl reload apache2Настройка Firewall (UFW)
Если вы используете фаервол UFW (Uncomplicated Firewall), необходимо разрешить трафик на порты, которые слушает Apache (обычно 80 для HTTP и 443 для HTTPS).
Настройка UFW для разрешения HTTP и HTTPS трафика
sudo ufw allow 'Apache Full' # Разрешает и HTTP (80) и HTTPS (443)
# Или по отдельности:
# sudo ufw allow 'Apache' # Только HTTP (80)
# sudo ufw allow 80/tcp
# sudo ufw allow 443/tcp # Только HTTPS (443), если настроен SSL
sudo ufw enable # Активировать фаервол, если он был неактивен
sudo ufw status # Проверить статус и активные правилаРешение проблем и отладка
При возникновении проблем проверьте следующие моменты.
Проверка логов Apache на наличие ошибок
Основные логи ошибок Apache обычно находятся в /var/log/apache2/. Ищите файлы error.log и специфичный для вашего сайта лог (myproject-error.log в нашем примере).
tail -f /var/log/apache2/error.log
tail -f /var/log/apache2/myproject-error.logПроверка настроек Django (settings.py) и виртуального хоста Apache
Убедитесь, что ALLOWED_HOSTS содержит ваш домен или IP.
Проверьте правильность путей в settings.py (STATIC_ROOT, MEDIA_ROOT) и в конфигурации Apache (WSGIScriptAlias, Alias, пути в WSGIDaemonProcess, пути в <Directory>).
Перепроверьте настройки базы данных.
Устранение проблем с правами доступа к файлам и директориям
Apache (обычно пользователь www-data) должен иметь права на чтение файлов проекта, включая wsgi.py, и доступ к директории с виртуальным окружением. Также необходимы права на чтение для статических файлов и права на чтение/запись для директории медиа-файлов (если используется).
# Убедитесь, что django_user владеет файлами проекта
sudo chown -R django_user:django_user /home/django_user/myproject
# Дайте группе www-data права на чтение и выполнение для директорий проекта
sudo chgrp -R www-data /home/django_user/myproject
sudo find /home/django_user/myproject -type d -exec chmod 750 {} \;
sudo find /home/django_user/myproject -type f -exec chmod 640 {} \;
# Особые права для wsgi.py и manage.py (если необходимо)
sudo chmod 750 /home/django_user/myproject/myproject/wsgi.py
sudo chmod 750 /home/django_user/myproject/manage.py
# Права на директорию staticfiles
sudo chown -R django_user:www-data /home/django_user/myproject/staticfiles
sudo find /home/django_user/myproject/staticfiles -type d -exec chmod 775 {} \;
sudo find /home/django_user/myproject/staticfiles -type f -exec chmod 664 {} \;
# Права на директорию mediafiles (если используется)
# sudo chown -R django_user:www-data /home/django_user/myproject/mediafiles
# sudo find /home/django_user/myproject/mediafiles -type d -exec chmod 775 {} \;
# sudo find /home/django_user/myproject/mediafiles -type f -exec chmod 664 {} \;
# Добавьте пользователя django_user в группу www-data (или наоборот, в зависимости от вашей стратегии)
sudo usermod -aG www-data django_user
# Перезапустите Apache после изменения прав
sudo systemctl restart apache2Важно: Приведенные выше команды chmod и chown являются примером. Тщательно продумайте модель прав доступа для вашего конкретного случая, чтобы обеспечить безопасность.
После выполнения этих шагов ваше Django-приложение должно быть успешно развернуто и доступно через Apache на сервере Ubuntu.