Как развернуть Django приложение на сервере Ubuntu с Apache: пошаговое руководство

Развертывание 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.


Добавить комментарий