- Django — Урок 001. Развёртывание сайта на Django + PostgreSQL + Gunicorn + Nginx
- Шаг 2 - Установка всех необходимых пакетов без установки виртуального окружения
- Шаг 3 - Создание базы данных и пользователя базы данных
- Шаг 4 - Установка виртуального окружения
- Шаг 5 - Установка драйвера PostgreSQL
- Шаг 6 - Создание проекта
- Шаг 7 - Настройка подключения к базе данных
- Шаг 8 - Выполнение миграций базы данных
- Шаг 9 - Установка Gunicorn
- Шаг 10 - Настройка статических файлов
- Шаг 11 - Настройка Nginx
- Шаг 12 - Настройка supervisor
- Примечание
Django — Урок 001. Развёртывание сайта на Django + PostgreSQL + Gunicorn + Nginx
Сделаем обновление существующих пакетов. Мало ли, система имеет устаревшие пакеты.
sudo apt-get update sudo apt-get upgradeШаг 2 - Установка всех необходимых пакетов без установки виртуального окружения
Установим пачкой все необходимые пакеты, которые не будут использоваться через virtualenv, а именно Python 3, PostgreSQL, Nginx.
sudo apt-get install python3-dev python3-setuptools libpq-dev postgresql postgresql-contrib nginxPip я в итоге устанавливал отдельно через утилиту easy_install3 , которая идёт в комплекте python3-setuptools , во-первых потому, что тогда ставится последняя версия, а вторых в случае установки через apt-get были ошибки при установке пакетов в virtualenv.
Шаг 3 - Создание базы данных и пользователя базы данных
А теперь создадим базу данных и пользователя, дав расширенные права пользователю postgres через утилиту sudo, который создаётся при установке PostgreSQL.
Выполнив данную команду, мы попадём в консоль PostgreSQL, где и создадим необходимую базу данных и пользователя, от имени которого будет подключаться Django приложение к этой базе данных.
CREATE DATABASE myproject;CREATE USER myprojectuser WITH PASSWORD 'password';Далее настройка пользователя проекта. Кодировку он будет использовать UTF8, поскольку данная кодировка используется и Django, а Python файлы рекомендует хардкодить с кодировкой UTF8, особенно, если в них присутствует текст, который будет отображаться на страницах сайта. Также устанавливается уровень изоляции в базе данных. То есть когда будут доступны данные для чтения. В данном случае после подтверждения транзакции в общем случае. Конечно, имеются случаи, когда данные доступны до подтверждения, но это отдельная тема для разговора. А также устанавливается тип временных зон, который для Django по умолчанию UTC.
ALTER ROLE myprojectuser SET client_encoding TO 'utf8'; ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed'; ALTER ROLE myprojectuser SET timezone TO 'UTC';Далее дадим права доступа к базе данных для этого пользователя:
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;Ну и выйдем из консоли PostgreSQL.
Если возникнут проблемы с кодировками на сервере, когда сервер будет иметь кодировку LATIN1, а базу данных нужно создать в UTF8, то обратитесь к следующей статье , где эта задача решается.
Шаг 4 - Установка виртуального окружения
Установим и активируем виртуальное окружение:
pip3 install virtualenv virtualenv ~/myprojectenv source myprojectenv/bin/activateШаг 5 - Установка драйвера PostgreSQL
Произведём установку следующей командой
sudo pip install django psycopg2Внутри виртуального окружения необходимо пользоваться командой pip , а не pip3
Шаг 6 - Создание проекта
Перейдём в папку с виртуальным окружением, мы по-прежнему должны находиться в режиме работы в виртуальном окружении. И создадим проект.
cd ~/myprojectenv django-admin.py startproject myprojectШаг 7 - Настройка подключения к базе данных
А теперь отредактируем конфигурационный файл Django, чтобы он подключался к базе данных PostgreSQL, а не создавал и в дальнейшем подключался к базе данных SQLite.
nano ~/myproject/myproject/settings.pyДля этого найдите в файле следующий кусок кода:
И замените его следующим, с учётом ваших данных для подключения к базе данных:
Шаг 8 - Выполнение миграций базы данных
Django обладает одним очень большим преимуществом - он имеет встроенную админку, что очень облегчает жизнь. Но чтобы она заработала, необходимо выполнить миграцию базы данных, то есть подготовить из моделей данных SQL запросы, которые сформируют структуру базу данных.
cd ~/myproject python manage.py makemigrations python manage.py migrateА ещё создадим суперпользователя, который будет администратором с максимальными правами доступа к вашему сайту. Выполните следующую команду и следуйте инструкциям.
python manage.py createsuperuserШаг 9 - Установка Gunicorn
Установим Gunicorn, который будет выступать в качестве HTTP сервера для нашего сайта. Устанавливаем его внутри виртуального окружения.
sudo pip install django gunicornМожете проверить, что сайт уже работает:
gunicorn myproject.wsgi:application --bind 111.222.333.44:8000 # Укажите ваш IP-адресШаг 10 - Настройка статических файлов
Django по умолчанию отдаёт статические файлы только в Debug режиме, который не используется на боевом сервере. Для боевого сервера все статические файлы из всех проектов собираются в отдельную специальную папку с помощью команды collectstatic , а саму папку необходимо указывать в файл settings.py.
И добавим строку, которая будет указывать, куда собирать статические файлы.
STATIC_ROOT = '/home/user/myprojectenv/myproject/myproject/static/'А теперь соберём всю статику в данный каталог:
python manage.py collectstaticШаг 11 - Настройка Nginx
Отредактируем конфигурационный файл Nginx.
sudo nano /etc/nginx/sites-available/defaultУдалим всё его содержимое и замени следующим.
sudo service nginx restartgunicorn myproject.wsgi:applicationПосле этого вы обнаружите, что сайт доступен уже на порту 80.
Шаг 12 - Настройка supervisor
Для того, чтобы сайт был доступен в любое время суток, необходимо настроить supervisor, который висит в памяти как служба и будет следить, чтобы сайта всегда работал.
sudo apt-get install supervisorДля стабильной работы Gunicorn необходимо создать его конфигурационный файл. Он будет располагаться рядом с файлом, который будет запускаемым для нашего web-приложения.
cd /home/user/myprojectenv/myproject/myproject touch gunicorn.conf.py nano gunicorn.conf.pyДобавим следующую конфигурационную информацию:
bind = '127.0.0.1:8000' workers = 3 user = "nobody"То есть мы указали, к какому порту привязываемся, и какой пользователь запускает процесс. А также количество рабочих процессов. В данном случае их три. Рассчитывается по следующей формуле:
workers = Ncpu + 1
После чего создадим конфигурацию самого supervisor
cd /etc/supervisor/conf.d/ touch myproject.conf nano myproject.confПропишем в него следующие настройки
[program:myproject] command=/home/user/myprojectenv/bin/gunicorn myproject.wsgi:application -c /home/user/myprojectenv/myproject/myproject/gunicorn.conf.py directory=/home/user/myprojectenv/myproject user=nobody autorestart=true redirect_stderr=trueА теперь запустим supervisor. Есть один нюанс при установке supervisor. Он не стартанул в качестве службы после того, как был установлен. Поэтому нужно принудительно добавить его в автозагрузку и запустить вручную, если не хотите перезагружать сервер.
sudo update-rc.d supervisor enable sudo service supervisor startНу а дальше можно обновлять конфиги, проверять статус приложения сайта и его перезапуска.
supervisorctl reread supervisorctl update supervisorctl status myproject supervisor restart myprojectПри перезагрузке сервера всё будет стартовать автоматически
Примечание
Если вы изменили файлы проекта, то необходимо перезапускать gunicorn. Для этого достаточно активировать виртуальное окружение и воспользоваться командой killall
source ~/myprojectenv/bin/activate sudo killall gunicornSupervisor автоматически запустит Gunicorn после этой команды, так что можете не беспокоиться, что сервер ляжет надолго. Не более секундного сбоя.
Для Django рекомендую VDS-сервера хостера Timeweb
.
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Рекомендуемые статьи по этой тематике
По статье задано1 вопрос(ов)
Вам это нравится? Поделитесь в социальных сетях!
С чем может быть связана ошибка? ставил всё на свою машину, статический ip не покупал.
(myprojectenv) ubuntu@ubuntu:~/myprojectenv/myproject$ gunicorn myproject.wsgi:application --bind мойайпишник:8000
[2017-10-28 11:54:39 +0000] [31426] [INFO] Starting gunicorn 19.7.1
[2017-10-28 11:54:39 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:39 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:40 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:40 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:41 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:41 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:42 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:42 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:43 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:43 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:44 +0000] [31426] [ERROR] Can't connect to ('мойайпишник', 8000)
Этот ваш IP адрес случайно не внешний IP адрес роутера, за которым Вы сидите со своим ПК?
перепробывал все ip, которые нашёл у себя на компе. не подскажите, как найти нужный?
А Вы делали вообще bind на '127.0.0.1:8000'?
sudo pip install django gunicornsudo pip install django psycopg2По моему sudo здесь лишнее. Разве sudo устанавливает внутри виртуального окружения?
Некропост, однако, хотел бы добавить, что в случае с продакшеном, миграции там делать нельзя. (точнее, конечно, можно, но нельзя)
Все миграции необходимо хранить в репозитории.
Твоя правда. Согласен. Свои миграции храню в репозитории. На продакшене только выполняю обновление структуры базы данных, после тестирования на дев сервере конечно (читай локальная машина разработки).
Здравствуйте, подскажите пожалуйста, как исправить:
в Ubuntu 20.04, в каталоге проекта пытаюсь создать вертуальную среду
virtualenv env
вылезает ошибка:
ModuleNotFoundError: No module named 'virtualenv.seed.via_app_data'
Спасибо.
Это может быть и ошибка в вашей версии virtualenv и не совсем верная установка, и косяки в процессе следования туториалу.
Но подобные ошибки вылезали на GitHub в репозитории virtualenv.
Впрочем я сам с таким не сталкивался, так что готового ответа у меня нет.
sudo apt install python3-venvпосле этого можно сделать
python -m venv .venv source .venv/bin/activatevirtualenv - устаревший, venv - часть стандартной библиотеки. в Windows - venv ставится вместе с питоном, в убунте, к сожалению, даже куски стандартной библиотеки приходится доставлять руками.
Ок, спасибо, буду пробовать.
Все заработало, немного ругнулся, что лучше:
python3 -m venv .venv
но в итоге все сработало.
Спасибо!Стави все по статье. Добрался до шага 12 и после него перестал запускатся сервер через gunicorn myproject.wsgi:application. выдает ошибку
[ERROR] Exception in worker process
Traceback (most recent call last):
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/wo rkers/base.py", line 119, in init_process
self.load_wsgi()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi
self.wsgi = self.app.wsgi()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
return self.load_wsgiapp()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
return util.import_app(self.app_uri)
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/util.py", line 358, in import_app
mod = importlib.import_module(module)
File "/usr/lib/python3.8/importlib/ init .py", line 127, in import _module
return _bootstrap._gcd_import(name[level:], package, level)
File " ", line 1014, in _gcd_import
File " ", line 991, in _find_and_load
File " ", line 973, in _find_and_load_un locked
ModuleNotFoundError: No module named 'myproject.wsgi'