Установка на сервер Django, Python, PostgreSQL и Nginx

Admin Django, PostgreSQL, Python, Ubuntu, VPS

Процесс установки интерпретатора Python, фреймворка Django, базы данных PostgreSQL и HTTP прокси NGINX на сервере Ubuntu 20.04.

Исходные данные

Установка будет производится на удаленном сервере, но то же самое можно развернуть и на localhost. Вместо 111.111.111.111 укажите свой IP адрес в интернете.

Свежеустановленный сервер Ubuntu 20.04 LTS.

Проведена первичная настройка сервера.

Установим Python на сервер

Перед любой установкой обновим пакеты операционной системы:

sudo apt-get update

Устанавливаем питон:

sudo apt-get install python3-pip python3-dev

Создадим симлинк для обращения по команде pip вместо pip3:

ln -s /usr/bin/pip3 /usr/bin/pip
pip install --upgrade pip

PostgreSQL

Установим PostgreSQL на сервер:

sudo apt-get install postgresql postgresql-contrib libpq-dev

Следом устанавливаем пакет psycopg2, который является python-postgreSQL адаптером:

pip install psycopg2

Создаем и настраиваем пользователя и базу данных в PostgreSQL.

Создаем виртуальную среду и устанавливаем Django

Заходим в папку пользователя. Отсюда будем работать дальше.

cd /home/ploshadka

Создаем виртуальную среду в директории myproject:

mkdir myproject
virtualenv --python=python3 myproject/

Перейдем в эту директорию и активируем среду:

cd myproject/
source bin/activate

Теперь в этом окружении установим Django и gunicorn:

pip install django gunicorn

Запустим новый проект с PostgreSQL

Запустим проект hello_django следующей командой:

django-admin startproject hello_django

Это создаст новую директорию hello_django с файлами питона.

Отредактировуем там файл конфигурации setting.py:

nano hello_django/hello_django/settings.py

Пропишем свои данные.

Найдем строку и запишем туда свой IP:

ALLOWED_HOSTS = ['111.111.111.111']

Следом впишем настройки нашей БД:

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
       # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'ploshadka',
        'USER': 'ploshadka',
        'PASSWORD': 'пароль',
        'HOST': 'localhost',
        'PORT': '',
    }
}

и в конце где

STATIC_URL = '/static/'

добавить строку:

# STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
STATIC_ROOT = '/home/ploshadka/static/'

Сохраняем файл и выходим.

Сделаем миграцию данных в таблицу PostgreSQL

Мы должны находится в директории с файлом manage.py:

cd /home/ploshadka/myproject/hello_django

Там запускаем миграцию:

python manage.py migrate

При успешной миграции:

Создадим супер пользователя. Он будет использоваться для входа на нашем сайте:

python manage.py createsuperuser

Дальше выбираем имя для пользователя проекта, email и пароль.

Собираем наш проект в статические файлы:

python manage.py collectstatic

Иногда встречается ошибка:

PermissionError: [Errno 13] Permission denied: '/static'

В этом случае стоит выйти, заново зайти и повторить:

exit
cd /home/ploshadka/myproject/
source bin/activate
cd hello_django
python manage.py collectstatic

В случае успеха будет создана папка static и появится сообщение:

130 static files copied to '/home/ploshadka/myproject/hello_django/static'.

Откроем порт на котором будет запущен проект:

sudo ufw allow 8000

Запустим наш проект:

python manage.py runserver 111.111.111.111:8080

Ошибки вида:

Command ‘python’ not found, did you mean:
command ‘python3’ from deb python3
command ‘python’ from deb python-is-python3

Могут возникнуть, если вы вышли из рабочей области. Заходим заново и запускаем:

su ploshadka
source bin/activate
cd hello_django/
python manage.py runserver 111.111.111.111:8080

Теперь можно зайти на страницу:

http://111.111.111.111:8080/

Где увидим предустановленную страницу Django:

В административную панель:

http://111.111.111.111:8080/admin/

После авторизации попадаем в админку:

Настраиваем работу Django с HTTP-сервером Gunicorn

Перейдем в наш проект, чтобы использовать gunicorn для загрузки модуля WSGI:

cd /home/ploshadka/myproject/hello_django
gunicorn -b 111.111.111.111:8080 hello_django.wsgi:application

Ошибки вида:

[67658] [ERROR] Exception in worker process
Traceback (most recent call last):
File

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_unlocked
ModuleNotFoundError: No module named ‘hello_django.wsgi’
[2020-05-24 22:44:37 +0200] [67658] [INFO] Worker exiting (pid: 67658)
[2020-05-24 22:44:37 +0200] [67656] [INFO] Shutting down: Master
[2020-05-24 22:44:37 +0200] [67656] [INFO] Reason: Worker failed to boot.
(myproject) root@nomerdoma1:/home/ploshadka/myproject#

Возникнут, если пытаться связать не ту директорию. Это должна быть директория, где находится файл settings.py.

В случае успешного запуска в консоли появится:

[2020-05-24 22:50:00 +0200] [67705] [INFO] Starting gunicorn 20.0.4
[2020-05-24 22:50:00 +0200] [67705] [INFO] Listening at: http://111.111.111.111:8080 (67705)
[2020-05-24 22:50:00 +0200] [67705] [INFO] Using worker: sync
[2020-05-24 22:50:00 +0200] [67707] [INFO] Booting worker with pid: 67707

Можем снова перейти на сайт и протестировать.

Настройка Django завершена. Теперь можно выйти из виртуальной среды:

deactivate

Настраиваем systemd

Настроем systemd для автоматизации запуска и остановку приложения Django.

Для этого создадим и настроим файл systemd для Gunicorn:

sudo nano /etc/systemd/system/gunicorn.service

Вставим:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=/home/ploshadka/myproject/hello_django
ExecStart=/home/ploshadka/myproject/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ploshadka/myproject/hello_django/myproject.sock hello_django.wsgi:application

[Install]
WantedBy=multi-user.target

Сохраняем и выходим. Если ранее уже был запущен gunicorn.service и это повторное редактирование, то перед следующей командой запустите:

systemctl daemon-reload
sudo systemctl restart gunicorn

Теперь можем запустить «Зеленого Единорога»:

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

Проверим статус сервера:

systemctl status gunicorn

При успешном запуске в директории hello_django там где manage.py появится файл myproject.sock.

Nginx

Установим дополнительные инструменты:

sudo apt-get install nginx curl

Создадим и отредактируем файл:

sudo nano /etc/nginx/sites-available/ploshadka

Вставим следующее:

server {
    listen 80;
    server_name 111.111.111.111;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
    root /home/ploshadka;
}

location / {
    include proxy_params;
    proxy_pass http://unix:/home/ploshadka/myproject/hello_django/myproject.sock;
    }
}
Обратите внимание, что в proxy_pass нужно указать путь до созданного выше sock файла. В противном случае nginx будет показывать 502 ошибку.

Связываем этот файл с каталогом сайтов:

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

Проверим конфигурацию nginx на наличие ошибок:

sudo nginx -t

Если ошибок нет:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

При отсутствии ошибок:

sudo systemctl restart nginx

Если нам больше не нужен сервер разработки, порт 8000, то удалим его, чтобы перенаправить весь трафик на порт 80:

sudo ufw delete allow 8000
sudo ufw allow 'Nginx Full'

На этом установка завершена. Теперь наш сервер работает автономно. А по адресу нашего сайта мы увидим всё ту же взлетающую ракету:

Напоследок

Для того чтобы изменения в файле settings.py стали видны, перезапускаем «единорога»:

sudo systemctl restart gunicorn

Если вам пригодилась информация, вы можете поблагодарить автора сайта символическим пожертвованием:

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

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи:
"Установка на сервер Django, Python, PostgreSQL и Nginx"