Настройка Django с MySQL, Nginx и Gunicorn на Ubuntu: Полное руководство

Введение

Цель руководства

Цель данного руководства – предоставить пошаговую инструкцию по настройке Django-приложения на сервере Ubuntu с использованием MySQL в качестве базы данных, Gunicorn в качестве WSGI-сервера и Nginx в качестве обратного прокси-сервера. Руководство предназначено для разработчиков, имеющих базовые знания о Django и Linux.

Предварительные требования

  • Виртуальный сервер Ubuntu (рекомендуется версия 20.04 или выше).
  • Доступ к серверу по SSH.
  • Базовые знания командной строки Linux.

Обзор технологий (Django, MySQL, Nginx, Gunicorn)

  • Django: Высокоуровневый Python веб-фреймворк, предназначенный для быстрой разработки безопасных и масштабируемых веб-приложений.
  • MySQL: Популярная система управления реляционными базами данных.
  • Nginx: Высокопроизводительный веб-сервер и обратный прокси-сервер.
  • Gunicorn: WSGI HTTP-сервер для развертывания Python веб-приложений.

Настройка сервера Ubuntu

Обновление пакетов

Прежде чем начать, обновите список пакетов и сами пакеты:

sudo apt update
sudo apt upgrade

Установка Python и pip

Установите Python 3 и pip:

sudo apt install python3 python3-pip

Установка и настройка MySQL

Установите MySQL server:

sudo apt install mysql-server

После установки необходимо настроить MySQL. Запустите скрипт безопасной настройки:

sudo mysql_secure_installation

Следуйте инструкциям на экране, чтобы установить пароль для пользователя root, удалить анонимных пользователей, запретить удаленный вход для пользователя root и удалить тестовую базу данных.

Настройка Django

Создание виртуального окружения Python

Создайте виртуальное окружение для Django-проекта:

python3 -m venv venv

Активируйте виртуальное окружение:

source venv/bin/activate

Установка Django и MySQLclient

Установите Django и MySQLclient (необходим для подключения Django к MySQL):

pip install django mysqlclient

Создание Django-проекта

Создайте новый Django-проект:

django-admin startproject myproject
cd myproject

Настройка подключения к базе данных MySQL

Отредактируйте файл myproject/settings.py, чтобы настроить подключение к базе данных MySQL:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'myuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

Замените mydatabase, myuser и mypassword на реальные значения.

Пример: Допустим, мы анализируем данные о кликах по контекстной рекламе. NAME может быть 'clicks_db', USER'analytics_user', PASSWORD — безопасный пароль.

Миграция базы данных

Выполните миграцию базы данных:

python manage.py makemigrations
python manage.py migrate

Создание суперпользователя

Создайте суперпользователя для доступа к административной панели Django:

python manage.py createsuperuser

Тестирование Django development server

Запустите development server:

python manage.py runserver 0.0.0.0:8000

Откройте в браузере http://your_server_ip:8000/ чтобы убедиться, что Django работает. Не забудьте настроить правила брандмауэра, если необходимо.

Настройка Gunicorn

Установка Gunicorn

Установите Gunicorn:

pip install gunicorn

Тестирование Gunicorn

Запустите Gunicorn для проверки:

gunicorn myproject.wsgi:application --bind 0.0.0.0:8000

Создание systemd unit-файла для Gunicorn

Создайте файл /etc/systemd/system/gunicorn.service:

[Unit]
Description=Gunicorn daemon for myproject
After=network.target

[Service]
User=youruser
Group=www-data
WorkingDirectory=/path/to/your/project
ExecStart=/path/to/your/project/venv/bin/gunicorn myproject.wsgi:application --bind 0.0.0.0:8000

[Install]
WantedBy=multi-user.target

Замените youruser, /path/to/your/project на соответствующие значения. Обратите внимание, что User должен иметь права на чтение и запись в директорию проекта.

Запуск и активация Gunicorn

Запустите и активируйте Gunicorn:

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

Проверьте статус Gunicorn:

sudo systemctl status gunicorn

Настройка Nginx

Установка Nginx

Установите Nginx:

sudo apt install nginx

Настройка Nginx как обратного прокси для Gunicorn

Создание конфигурационного файла Nginx для Django-проекта

Удалите стандартный конфигурационный файл Nginx:

sudo rm /etc/nginx/sites-enabled/default

Создайте новый конфигурационный файл /etc/nginx/sites-available/myproject:

server {
    listen 80;
    server_name yourdomain.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /path/to/your/project/staticfiles;
    }

    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;
    }
}

Замените yourdomain.com и /path/to/your/project на соответствующие значения.

Пример: Если мы разрабатываем систему для автоматизации контекстной рекламы, /static/ может содержать JavaScript файлы для отображения графиков и отчетов.

Активация конфигурации Nginx

Создайте символическую ссылку на конфигурационный файл в директории sites-enabled:

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/

Проверьте конфигурацию Nginx на наличие ошибок:

sudo nginx -t

Перезапустите Nginx:

sudo systemctl restart nginx

Настройка брандмауэра (UFW)

Разрешите трафик для Nginx:

sudo ufw allow 'Nginx Full'

Настройка статических файлов

Настройка Django для работы со статическими файлами

В файле myproject/settings.py добавьте:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

Сбор статических файлов

Соберите статические файлы:

python manage.py collectstatic

Настройка Nginx для обслуживания статических файлов

Убедитесь, что в конфигурационном файле Nginx (/etc/nginx/sites-available/myproject) правильно указан путь к статическим файлам:

location /static/ {
    root /path/to/your/project/staticfiles;
}

Настройка HTTPS (SSL) с помощью Let’s Encrypt

Установка Certbot

Установите Certbot:

sudo apt install certbot python3-certbot-nginx

Получение SSL-сертификата

Получите SSL-сертификат для вашего домена:

sudo certbot --nginx -d yourdomain.com

Следуйте инструкциям на экране. Certbot автоматически настроит Nginx для использования HTTPS.

Автоматическая переадресация HTTP на HTTPS

Certbot предложит автоматически перенаправлять весь HTTP-трафик на HTTPS. Рекомендуется согласиться на это.

Решение проблем

Общие ошибки и способы их устранения

  • Ошибка 502 Bad Gateway: Проверьте, запущен ли Gunicorn и правильно ли настроен Nginx.
  • Ошибка при подключении к базе данных: Убедитесь, что параметры подключения к базе данных в settings.py указаны верно.
  • Статические файлы не отображаются: Проверьте STATIC_URL, STATIC_ROOT в settings.py и конфигурацию Nginx.

Проверка логов Nginx и Gunicorn

Логи Nginx находятся в /var/log/nginx/error.log и /var/log/nginx/access.log. Логи Gunicorn можно найти с помощью sudo journalctl -u gunicorn.

Заключение

Краткое повторение пройденных шагов

В этом руководстве мы прошли через следующие шаги:

  1. Настройка сервера Ubuntu (обновление пакетов, установка Python, pip, MySQL).
  2. Настройка Django (создание проекта, настройка базы данных, миграция, создание суперпользователя).
  3. Настройка Gunicorn (установка, тестирование, создание systemd unit-файла).
  4. Настройка Nginx (установка, конфигурация обратного прокси, активация).
  5. Настройка статических файлов.
  6. Настройка HTTPS с помощью Let’s Encrypt.

Дальнейшие шаги (оптимизация, мониторинг)

  • Оптимизация базы данных: Индексы, кеширование запросов.
  • Мониторинг сервера: Использование инструментов мониторинга (например, Grafana, Prometheus) для отслеживания нагрузки на сервер, использования памяти и диска.
  • Кеширование: Настройка кеширования на уровне Nginx или Django для повышения производительности.
  • CI/CD: Настройка автоматического развертывания приложения при внесении изменений в репозиторий.

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