Как установить Django с Postgres Nginx и Gunicorn в Ubuntu 18.04

12 set 2022 6 min di lettura
Как установить Django с Postgres Nginx и Gunicorn в Ubuntu 18.04
Indice dei contenuti

Введение

Django — это веб-фреймворк, упрощающий запуск приложений Python или веб-сайтов. Django включает в себя сервер разработки для локального тестирования кода.

В этом руководстве мы увидим, как установить и настроить Django с базой данных PostgreSQL на сервере Gunicorn, который взаимодействует с приложениями, написанными на Python. Наконец, мы установим Nginx в качестве обратного прокси для Gunicorn.

Убунту 18.04 ЛТС.

Предпосылки

Прежде чем приступить к работе с этим руководством, на вашем сервере должен быть установлен пользователь без полномочий root с привилегиями sudo. Следуйте этому руководству: Первоначальная настройка в Ubuntu 18.04 LTS

Установите Python PostgreSQL Nginx

Загрузите все пакеты, необходимые для выполнения этого руководства, вы можете напрямую использовать официальные репозитории Ubuntu. Обновите локальный индекс пакетов apt, а затем загрузите и установите необходимые пакеты. Из терминала:

sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl

Настроить PostgreSQL

На этапе установки Postgres будет создан новый системный пользователь postgres с тем же именем, что и у администратора PostgreSQL. Мы должны использовать этого пользователя для выполнения административных задач. Затем войдите под новым пользователем с параметром -u:

sudo -u postgres psql

Создайте базу данных для нашего приложения:

CREATE DATABASE myapp;

Создайте пользователя для нашей новой базы данных:

CREATE USER myappuser WITH PASSWORD 'TUA_PASSWORD';

Установите некоторые рекомендуемые параметры для новой базы данных:

ALTER ROLE myappuser SET client_encoding TO 'utf8';
ALTER ROLE myappuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myappuser SET timezone TO 'UTC';

Предоставьте новому пользователю права администратора базы данных:

GRANT ALL PRIVILEGES ON DATABASE myapp TO myappuser;

Закройте приглашение PostgreSQL:

\q

Создайте виртуальную среду на Python для управления нашим приложением.

Установите virtualenv с помощью pip:

sudo -H pip3 install --upgrade pip
sudo -H pip3 install virtualenv

Создайте новую папку для нашего приложения:

mkdir ~/myappdir

Войдите в только что созданную папку:

cd ~/myappdir

Создайте виртуальную среду в Python:

virtualenv myappenv

Эта команда создаст каталог с именем myappenv внутри каталога myappdir. Внутри он установит локальную версию Python и локальную версию pip. Мы можем использовать его для установки и настройки изолированной среды Python для нашего проекта.

Активируйте виртуальную среду:

source myappenv/bin/activate

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

(myappenv) user@host:~/myappdir$.

Когда виртуальная среда активирована, используйте pip вместо pip3, даже если вы используете Python 3.

Установите требования Python нашего проекта:

pip install django gunicorn psycopg2-binary

Создайте приложение Джанго

Поскольку у нас уже есть каталог проекта, мы скажем Django установить файлы в тот же каталог:

django-admin.py startproject myapp ~/myappdir

Измените настройки в файле settings.py.

nano ~/myappdir/myapp/settings.py

Найдите запись ALLOWED_HOSTS. Эта запись определяет список IP-адресов серверов или доменных имен, которые можно использовать для подключения к экземпляру Django. Любой запрос, поступающий с заголовком Host, отсутствующим в этом списке, вызовет исключение.

В квадратных скобках укажите IP-адреса или доменные имена, связанные с вашим сервером Django. Каждый IP-адрес или доменное имя должны быть записаны в двойных кавычках с элементами, разделенными запятой. Пример:


# The simplest case: just add the domain name(s) and IP addresses of your Django server
 # ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
 # To respond to 'example.com' and any subdomains, start the domain with a dot
 # ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
 ALLOWED_HOSTS = ['NOME_DOMINIO', 'INDIRIZZO_IP',..., 'localhost']

Затем найдите запись DATABASES, чтобы настроить доступ к нашей базе данных PostgreSQL.

Измените настройки с информацией о вашей базе данных PostgreSQL:

...
 DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.postgresql_psycopg2',
 'NAME': 'myapp',
 'USER': 'myappuser',
 'PASSWORD': 'TUA_PASSWORD',
 'HOST': 'localhost',
 'PORT': '',
 }
 }...

Затем перейдите в конец файла и добавьте параметр, указывающий, где следует размещать статические файлы. Это необходимо для того, чтобы Nginx обрабатывал запросы:

...
 STATIC_URL = '/static/'
 STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

Перенесите исходную схему базы данных в нашу базу данных PostgreSQL:

~/myappdir/manage.py makemigrations
~/myappdir/manage.py migrate

Создайте пользователя-администратора для нашего проекта:

~/myappdir/manage.py createsuperuser

Введите всю информацию, необходимую для создания нового пользователя-администратора.

Переместите все статические файлы в папку с именем static внутри нашего проекта:

~/myappdir/manage.py collectstatic

Если у вас активен брандмауэр (UFW), вам необходимо включить порт 8000:

sudo ufw allow 8000

Протестируйте приложение

Запустите приложение из терминала:

~/myappdir/manage.py runserver 0.0.0.0:8000

Откройте браузер и подключитесь к IP-адресу или доменному имени сервера:

http://DOMINIO_OPPURE_IP:8000

Для входа в админ панель добавьте /admin в конце ссылки:

http://DOMINIO_OPPURE_IP:8000/admin

Войдите в систему с пользователем и паролем, сгенерированным с помощью команды createsuperuser.

Чтобы закрыть приложение и выключить сервер, нажмите CTRL-C в терминале.

Протестируйте приложение с помощью Gunicorn

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

cd ~/myappdir
gunicorn --bind 0.0.0.0:8000 myapp.wsgi

Интерфейс администратора не будет иметь никакого стиля, поскольку Gunicorn не знает, как найти статический контент CSS.

Нажмите CTRL-C в окне терминала, чтобы остановить Gunicorn.

Мы можем выйти из нашей виртуальной среды, набрав:

deactivate

Создайте сокеты и служебные файлы systemd для Gunicorn. Сокет Gunicorn будет создан при запуске и будет прослушивать соединения. Когда происходит соединение, systemd автоматически запускает процесс Gunicorn для управления соединением.

Создайте и откройте файл сокета systemd для Gunicorn:

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

Вставьте следующие строки кода:


[Unit]
 Description=gunicorn socket

 [Socket]
 ListenStream=/run/gunicorn.sock

 [Install]
 WantedBy=sockets.target

Сохраните и закройте файл.

Затем создайте и откройте служебный файл systemd для Gunicorn. Имя файла службы должно совпадать с именем файла сокета, за исключением расширения:

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

Указываем пользователя и группу, которых мы хотим использовать для выполнения. Введите следующие строки кода, заполнив нужные поля своими данными:


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

 [Service]
 User=TUO_UTENTE
 Group=www-data
 WorkingDirectory=/home/TUO_UTENTE/myappdir
 ExecStart=/home/TUO_UTENTE/myappdir/myappenv/bin/gunicorn \
 --access-logfile - \
 --workers 3 \
 --bind unix:/run/gunicorn.sock \
 myapp.wsgi:application

 [Install]
 WantedBy=multi-user.target

Сохраните и закройте файл

Теперь мы можем запустить и включить сокет Gunicorn. Это создаст файл сокета в /run/gunicorn.sock сейчас и при запуске. Когда к этому сокету будет установлено соединение, systemd автоматически запустит gunicorn.service для его обработки:

sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

Проверьте статус файла сокета Gunicorn:

sudo systemctl status gunicorn.socket

Проверьте наличие файла gunicorn.sock:

file /run/gunicorn.sock

Вы должны получить выходное сообщение, подобное следующему:


/run/gunicorn.sock: socket

Если команда systemctl status указывает, что произошла ошибка или если файл gunicorn.sock не найден в каталоге, это указывает на то, что сокет Gunicorn не может быть успешно создан. Проверьте журналы сокета Gunicorn, набрав:

Чтобы проверить журналы сокетов, в том числе на наличие ошибок:

sudo journalctl -u gunicorn.socket

Впоследствии, после активации gunicorn.socket, вы также должны активировать gunicorn.service с помощью этой команды:

curl --unix-socket /run/gunicorn.sock localhost

Чтобы проверить статус сервиса Gunicorn:

sudo systemctl status gunicorn

Вы должны получить выходное сообщение, подобное следующему:


● gunicorn.service - gunicorn daemon
 Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
 Active: active (running) since Mon 2018-07-09 20:00:40 UTC; 4s ago
 Main PID: 1157 (gunicorn)
 Tasks: 4 (limit: 1153)
 CGroup: /system.slice/gunicorn.service
 ├─1157 /home/noviello/myappdir/myappenv/bin/python3 /home/noviello/myappdir/myappenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myapp.wsgi:application
 ├─1178 /home/noviello/myappdir/myappenv/bin/python3 /home/noviello/myappdir/myappenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myapp.wsgi:application
 ├─1180 /home/noviello/myappdir/myappenv/bin/python3 /home/noviello/myappdir/myappenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myapp.wsgi:application
 └─1181 /home/noviello/myappdir/mypmyappenvrojectenv/bin/python3 /home/noviello/myappdir/myappenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myapp.wsgi:application

 Jul 09 20:00:40 django1 systemd[1]: Started gunicorn daemon.
 Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Starting gunicorn 19.9.0
 Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Listening at: unix:/run/gunicorn.sock (1157)
 Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Using worker: sync
 Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1178] [INFO] Booting worker with pid: 1178
 Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1180] [INFO] Booting worker with pid: 1180
 Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1181] [INFO] Booting worker with pid: 1181
 Jul 09 20:00:41 django1 gunicorn[1157]: - - [09/Jul/2018:20:00:41 +0000] "GET /HTTP/1.1" 200 16348 "-" "curl/7.58.0"

Чтобы проверить статус любых ошибок:

sudo journalctl -u gunicorn

Если в файл /etc/systemd/system/gunicorn.service внесены изменения, процессы Gunicorn необходимо будет перезапустить:

sudo systemctl daemon-reload
sudo systemctl restart gunicorn

Настроить Nginx

Создайте новый блок сервера в Nginx:

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

Настройте файл следующим образом, обязательно заменив необходимые поля своими данными:


server {
 listen 80;
 server_name DOMINIO_OPPURE_IP;

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

 location /{
 include proxy_params;
 proxy_pass http://unix:/run/gunicorn.sock;
 }
 }

Мы настроили Nginx для поиска статических файлов в нашем ранее созданном каталоге и добавили параметры proxy_params и proxy_pass для пропуска трафика непосредственно в сокет Gunicorn.

Сохраните и закройте файл.

Включите только что созданный серверный блок:

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

Проверьте настройки nginx:

sudo nginx -t

Если ошибок нет, перезапустите nginx:

sudo systemctl restart nginx

Если вы используете брандмауэр Ubuntu (Ufw), теперь необходимо изменить правила:

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

Установка и настройка Django с Postgres Nginx и Gunicorn на Ubuntu 18.04 завершена.

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.