Установка Django, PostgreSQL, Nginx и Gunicorn на Ubuntu
- Что это такое?
- Загрузка и установка пакетов
- Создание базы данных и пользователя PostgreSQL
- Создание виртуальной среды Python для проекта
- Создание и настройка проекта Django
- Создание проекта
- Настройка параметров проекта
- Завершение начальной настройки проекта
- Создание systemd Socket и Service Files для Gunicorn
- Проверка Gunicorn Socket File
- Настройка Nginx
В инструкции описано, как установить и настроить некоторые компоненты в Ubuntu 18.04 для поддержки и обслуживания приложений Django, как настроить базу данных PostgreSQL вместо использования базы данных SQLite по умолчанию, как настроить сервер приложений Gunicorn для взаимодействия с приложениями. Затем в инструкции описана конфигурация Nginx для обращения прокси к Gunicorn.
Что это такое?
Django - это мощный фреймворк, который позволяет запустить приложение или веб-сайт на Python. Django включает в себя упрощенный сервер разработки для локального тестирования кода.
Загрузка и установка пакетов
Для начала обновите локальную базу пакетов:
sudo apt update sudo apt upgrade
Примечание: по умолчанию на серверах Ubuntu 18.04 используется Python 3.
Для установки необходимого набора пакетов и зависимостей выполните следующую команду:
sudo apt install python3-pip python3-dev sudo apt install libpq-dev postgresql postgresql-contrib sudo apt-install nginx curl
В результате у вас будут установлены средства разработки Python, необходимые для сборки Gunicorn, pip, система баз данных Postgres и библиотеки, необходимые для взаимодействия с ней, а также веб-сервер Nginx.
Создание базы данных и пользователя PostgreSQL
Во время установки Postgres был создан пользователь с именем postgres - администратор СУБД PostgreSQL.
Подключитесь к СУБД с помощью следующей команды:
sudo -u postgres psql
Создайте базу данных для вашего проекта:
CREATE DATABASE cloudproject;
Далее создайте пользователя для созданной БД, указав безопасный пароль:
CREATE USER clouduser WITH PASSWORD 'password';
Для корректной работы Django кодировку необходимо установить в стандарт UTF-8:
ALTER ROLE clouduser SET client_encoding TO 'utf8';
Далее установите схему изоляции транзакции по умолчанию в «зафиксированное чтение», при котором блокируется чтение из незафиксированных транзакций:
ALTER ROLE clouduser SET default_transaction_isolation TO 'read committed';
Установите рекомендуемый стандарт времени UTC:
ALTER ROLE clouduser SET timezone TO 'UTC';
В конце предоставьте новому пользователю доступ для управления созданной базой данных:
GRANT ALL PRIVILEGES ON DATABASE cloudproject TO clouduser;
Выйдите из командной строки PostgreSQL, набрав:
\q
Создание виртуальной среды Python для проекта
Сначала необходимо настроить доступ к команде virtualenv, которую можно установить с помощью pip:
sudo -H pip3 install --upgrade pip sudo -H pip3 install virtualenv
Флаг -H гарантирует, что политика безопасности устанавливает переменные окружения в домашний каталог целевого пользователя.
Создайте и перейдите в каталог, где вы собираетесь хранить файлы вашего проекта. В нашем примере используется название каталога calcsbox:
mkdir ~/calcsbox cd ~/calcsbox
В каталоге проекта создайте виртуальную среду Python. Выберете название среды, которое имеет отношение к вашему проекту, в нашем примере мы используем название venv (virtual env):
virtualenv venv
В результате этих действий будет создано откружение в вашем каталоге, внутри будет установлена локальная версия Python и локальная версия pip. Это позволяет настроить изолированную среду Python для Jupyter.
Перед установкой Jupyter нам нужно активировать виртуальную среду, указав вместо calcsbox название вашей среды:
source venv/bin/activate
Когда виртуальная среда активирована, установите Django, Gunicorn и адаптер psycopg2 PostgreSQL с помощью локального экземпляра pip:
pip install django gunicorn psycopg2-binary
Создание и настройка проекта Django
Создание проекта
Создадим проект в настроенной виртуальной среде, явно задав название проекта и путь:
django-admin.py startproject calcsbox ~/calcsbox
Настройка параметров проекта
Для запуска созданного проекта необходимо настроить его параметры. Откройте файл настроек в текстовом редакторе, например nano:
nano ~/calcsbox/calcsbox/settings.py
Найдите директиву ALLOWED_HOSTS и в качестве ее значения укажите IP-адрес или доменное имя сервера:
ALLOWED_HOSTS = ['your_server_domain_or_IP']
Например:
ALLOWED_HOSTS = ['111.111.111.111']
Затем найдите раздел, который настраивает доступ к базе данных. Он начинается с ключевого слова DATABASES. Укажите собственные значения переменных NAME,USER,PASSWORD ранее созданных в PostgreSQL:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'calcsbox', 'USER': 'calcsboxuser', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '', } }
Затем переместитесь в конец файла и добавьте параметр, указывающий, где должны быть размещены статические файлы. Это необходимо для того, чтобы Nginx мог правильно обрабатывать запросы к этим элементам:
STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
Завершение начальной настройки проекта
Перенесите исходную схему базы данных в базу данных PostgreSQL, используя скрипт управления:
cd ~/calcsbox python manage.py makemigrations python manage.py migrate
Создайте административного пользователя для проекта, набрав:
cd ~/calcsbox python manage.py createsuperuser
На этом шаге будет необходимо выбрать имя пользователя проекта, указать адрес электронной почты, а также выбрать и подтвердить пароль.
Соберите весь статический контент в каталог, который был настроен:
cd ~/calcsbox python manage.py collectstatic
С помощью ufw откройте порт 8000 на котором по умолчанию будет запущен Django:
sudo ufw allow 8000
Наконец, вы можете протестировать проект, запустив сервер Django с помощью этой команды:
cd ~/calcsbox python manage.py runserver 0.0.0.0:8000
В любом удобном веб-браузере перейдите на ваше доменное имя или IP-адрес с указанием порта 8000:
http://server_domain_or_IP:8000
Например:
http://111.111.111.111:8000
Тестирование работы Gunicorn
Перед тем, как покинуть виртуальную среду, необходимо протестировать Gunicorn, чтобы убедиться, что программа может обслуживать приложение. Это можно сделать, перейдя в каталог проекта и используя gunicorn для загрузки модуля WSGI:
cd ~/cloudproject gunicorn --bind 0.0.0.0:8000 calcsbox.wsgi
В результате Gunicorn будет запущен на том же интерфейсе, на котором работал сервер разработки Django. Вы можете вернуться в браузер и снова протестировать приложение.
Теперь настройка приложения Django завершена. Необходимо выйти из виртуальной среды, набрав:
deactivate
Создание systemd Socket и Service Files для Gunicorn
Проверка показала, что Gunicorn может взаимодействовать с приложением Django, но необходимо реализовать более надежный способ запуска и остановки сервера приложений. Для этого нужно использовать файл службы systemd.
Создайте и откройте служебный файл gunicorn.service systemd для Gunicorn в текстовом редакторе, например nano:
sudo nano /etc/systemd/system/gunicorn.service
Вставьте следующие строки:
[Unit] Description=gunicorn daemon After=network.target [Service] User=root Group=www-data WorkingDirectory=/root/calcsbox/ ExecStart=/root/calcsbox/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock calcsbox.wsgi:application --reload [Install] WantedBy=multi-user.target
Раздел [Unit] используется для указания метаданных и зависимостей. Здесь находится описание сервиса и информация для системы инициализации. В разделе [Service] определяется пользователь и группа, от имени которых необходимо выполнять работу. Группа www-data используется не случайно, чтобы Nginx мог легко общаться с Gunicorn. Затем в WorkingDirectory указывается рабочий каталог и в ExecStart команда для запуска сервиса. Наконец, раздел [Install] указывает, чтобы служба стартовала, когда обычная многопользовательская система запущена:
Создайте и откройте служебный файл gunicorn.socket systemd для Gunicorn в текстовом редакторе, например nano:
sudo nano /etc/systemd/system/gunicorn.socket
Вставьте следующие строки:
[Unit] Description=gunicorn socket [Socket] ListenStream=/run/gunicorn.sock [Install] WantedBy=sockets.target
Теперь можно запустить созданную службу Gunicorn и включить ее так, чтобы она запускалась при загрузке:
sudo systemctl start gunicorn sudo systemctl enable gunicorn
Проверка Gunicorn Socket File
Для начала необходимо проверить состояние процесса, чтобы узнать, удалось ли его запустить:
sudo systemctl status gunicorn
Затем проверьте наличие файла cloudproject.sock в каталоге вашего проекта:
ls /root/cloudproject
Output: manage.py cloudproject cloudenv cloudproject.sock static
Если вы не нашли файл cloudproject.sock в каталоге, это означает, что Gunicorn не смог правильно запуститься. Проверьте журналы процесса Gunicorn, набрав:
sudo journalctl -u gunicorn
Если нужно принудительно перезапустить службы, то можно воспользоваться командами
pkill gunicorn sudo systemctl daemon-reload sudo systemctl start gunicorn sudo systemctl restart gunicorn && systemctl status gunicorn sudo systemctl restart gunicorn.service
Настройка Nginx
Теперь, когда Gunicorn настроен, нужно настроить Nginx для передачи трафика процессу. Создайте и откройте новый файл в каталоге сайтов Nginx:
sudo nano /etc/nginx/sites-available/calcsbox
Внутри создайте блок сервера, вставив следующие строки:
server { listen 80 default_server; listen [::]:80 default_server; server_name ; location = /favicon.ico { access_log off; log_not_found off; } root /root/calcsbox/; location /static/ { root /root/calcsbox/static; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } }
В блоке указано, что nginx должен прослушивать порт 80 и отвечать на доменное имя или IP-адрес сервера. Далее указано игнорировать любые проблемы с поиском значка и путь до статических ресурсов. Последний блок location / {} соответствует всем другим запросам.
Сохраните и закройте файл после внесения изменений. Теперь мы можем включить файл, связав его с каталогом сайтов:
sudo ln -s /etc/nginx/sites-available/calcsbox /etc/nginx/sites-enabled
Далее необходимо проверить конфигурацию Nginx на наличие синтаксических ошибок, набрав:
sudo nginx -t
Если ошибки не найдены, перезапустите Nginx, набрав:
sudo systemctl restart nginx
Наконец, нужно открыть брандмауэр для нормального трафика через порт 80. Поскольку доступ к серверу разработки больше не нужен, нужно удалить правило, которое открывает порт 8000:
sudo ufw delete allow 8000 sudo ufw allow 'Nginx Full'
В этом руководстве создается проект Django в собственной виртуальной среде. Мы настроили Gunicorn для перевода клиентских запросов, чтобы Django мог их обработать. После этого мы настроили Nginx в качестве обратного прокси-сервера для обработки клиентских подключений и предоставления правильного проекта в зависимости от запроса клиента.