8.2.3 Развёртывание и настройка продакшн-сервера для Django
Django — популярный фреймворк на Python для разработки безопасных и масштабируемых веб-приложений. В этом руководстве мы пошагово развернём сервер на Ubuntu и настроим его для продакшн-размещения Django-проекта.
Это руководство поможет вам развернуть Django-проект на Ubuntu-сервере, используя Gunicorn, Nginx и PostgreSQL — типичную конфигурацию для продакшн-окружений.
Перед началом стоит убедиться, что:
- наличие Виртуального или Выделенного сервера
- наличие sudo или root-доступа
- установленный Django-проект
- заказаное Доменное имя
Настройка сервера и зависимостей
Обновление системы и установка зависимостей
Для начала подключитесь к серверу по SSH и обновите системные пакеты:
sudo apt update && sudo apt upgrade -y
Затем установите Python 3, pip, venv, Git, Nginx и другие базовые утилиты:
sudo apt install python3 python3-pip python3-venv git nginx curl -y
Установка python3-venv обязательна для создания виртуального окружения. Без него команда python3 -m venv работать не будет.
Настройка веб-сервера Nginx
Nginx будет обрабатывать входящие запросы и проксировать их в Gunicorn:
sudo nano /etc/nginx/sites-available/projectname
server {
listen 80;
server_name yourdomain.com;
location = /static/ {
root /var/www/projectname;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Создайте симлинк и проверьте конфигурацию:
sudo ln -s /etc/nginx/sites-available/projectname /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
Убедитесь, что в settings.py переменная ALLOWED_HOSTS включает ваш домен или IP-адрес, иначе Django заблокирует входящие соединения.
Установка и настройка Gunicorn
Gunicorn — это WSGI-сервер, через который Django работает в продакшн-окружении:
pip install gunicorn
gunicorn --workers 3 --bind unix:/run/gunicorn.sock projectname.wsgi:application
Для постоянной работы Gunicorn создадим systemd-сервис:
sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/var/www/projectname
ExecStart=/var/www/projectname/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock projectname.wsgi:application
[Install]
WantedBy=multi-user.target
Активируйте сервис:
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
Установка SSL (Let’s Encrypt)
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d yourdomain.com
Сертификаты Let’s Encrypt автоматически обновляются каждые 90 дней.
Безопасность и оптимизация
Настройка UFW (Uncomplicated Firewall)
Активируем брандмауэр:
sudo ufw allow 'Nginx Full'
sudo ufw enable
Настройка iptables
Для расширенной защиты можно использовать iptables:
# Установка iptables-persistent для сохранения правил
sudo apt install iptables-persistent -y
# Базовые правила безопасности
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Блокировка всего остального входящего трафика
sudo iptables -A INPUT -j DROP
# Сохранение правил
sudo netfilter-persistent save
Также рекомендуется:
- Установить fail2ban для защиты от брутфорса
- Отключить DEBUG в продакшене
- Использовать .env для хранения чувствительных данных
- Настроить регулярное резервное копирование
- Ограничить попытки входа в админку Django
Настройка Django-проекта
Клонирование Django-проекта
Предположим, ваш проект размещён в репозитории GitHub. Переходим в директорию где Вы планируете разместить Ваш проект:
cd /var/www/
sudo git clone https://github.com/username/projectname.git
sudo chown -R $USER:$USER projectname
cd projectname
Замените https://github.com/username/projectname.git на ваш собственный репозиторий. Убедитесь, что структура проекта включает файл manage.py.
Настройка виртуального окружения
Виртуальное окружение позволяет изолировать зависимости проекта:
python3 -m venv venv
source venv/bin/activate
После активации установите зависимости из requirements.txt:
pip install --upgrade pip
pip install -r requirements.txt
Настройка базы данных
Если проект использует PostgreSQL, установим необходимые пакеты и создадим пользователя и базу данных:
sudo apt install postgresql postgresql-contrib libpq-dev -y
sudo -u postgres createuser myuser --interactive
sudo -u postgres createdb mydb
Не забудьте задать надёжный пароль для базы данных. Пароль будет использоваться в settings.py.
Откройте settings.py и пропишите данные подключения:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': 'your_password',
'HOST': 'localhost',
'PORT': '',
}
}
Выполнение миграций и сборка статики
Теперь подготовим базу и соберём статические файлы:
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic --noinput
Команда collectstatic собирает все CSS, JS и изображения в папку staticfiles, чтобы Nginx мог раздавать их напрямую.
После выполнения всех указанных действий вы должны увидеть в браузере страницу только что созданного сайта Django: