Установка на сервер 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'.

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

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"