Как настроить Django с помощью Postgres, Nginx и Gunicorn в Debian 8

Вступление

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

В этом руководстве мы продемонстрируем, как установить и настроить некоторые компоненты в Debian 8 для поддержки и обслуживания приложений Django. Мы будем настраивать базу данных PostgreSQL вместо использования базы данных SQLite по умолчанию. Мы настроим сервер приложений Gunicorn для взаимодействия с нашими приложениями. Затем мы настроим Nginx для обращения прокси к Gunicorn, предоставляя нам доступ к его функциям безопасности и производительности для обслуживания наших приложений.

Предпосылки и цели

Чтобы выполнить это руководство, у вас должен быть свежий экземпляр сервера Debian 8 с пользователем без полномочий root с настроенными привилегиями + sudo +. Вы можете узнать, как это настроить, запустив наше https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-8 руководство по настройке сервера на английском языке].

Мы будем устанавливать Django в виртуальной среде. Установка Django в среду, специфичную для вашего проекта, позволит обрабатывать ваши проекты и их требования отдельно.

После того, как мы запустим нашу базу данных и приложение, мы установим и настроим сервер приложений Gunicorn. Это будет служить интерфейсом для нашего приложения, переводя клиентские запросы в HTTP на вызовы Python, которые наше приложение может обрабатывать. Затем мы настроим Nginx перед Gunicorn, чтобы воспользоваться его высокопроизводительными механизмами обработки соединений и простыми в реализации функциями безопасности.

Давайте начнем.

Установите пакеты из репозитория Debian

Чтобы начать процесс, мы загрузим и установим все нужные нам элементы из репозиториев Debian. Мы будем использовать менеджер пакетов Python + pip +, чтобы установить дополнительные компоненты чуть позже.

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

Если вы используете * Python 2 *, введите:

sudo apt-get update
sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx

Если вы используете * Python 3 *, введите:

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

Это установит + pip +, файлы для разработки на Python, необходимые для сборки Gunicorn, систему баз данных Postgres и библиотеки, необходимые для взаимодействия с ней, а также веб-сервер Nginx.

Создайте базу данных PostgreSQL и пользователя

Мы собираемся сразу перейти к созданию базы данных и пользователя базы данных для нашего приложения Django.

По умолчанию Postgres использует схему аутентификации, называемую «равноправная аутентификация» для локальных соединений. По сути, это означает, что если имя пользователя операционной системы пользователя совпадает с действительным именем пользователя Postgres, этот пользователь может войти в систему без дальнейшей аутентификации.

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

Войдите в интерактивную сессию Postgres, набрав:

sudo -u postgres psql

Вам будет выдан запрос PostgreSQL, где мы сможем настроить наши требования.

Сначала создайте базу данных для вашего проекта:

Note

CREATE DATABASE ;
OutputCREATE DATABASE

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

CREATE USER  WITH PASSWORD '';
OutputCREATE ROLE

Далее мы изменим некоторые параметры подключения для пользователя, которого мы только что создали. Это ускорит работу базы данных, поэтому нет необходимости запрашивать правильные значения и устанавливать их каждый раз при установлении соединения.

Мы устанавливаем кодировку по умолчанию в UTF-8, что ожидает Django. Мы также устанавливаем схему изоляции транзакции по умолчанию «read commit», которая блокирует чтение из незафиксированных транзакций. Наконец, мы устанавливаем часовой пояс. По умолчанию наши проекты Django будут настроены на использование + UTC. Это все рекомендации из самого проекта Django:

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

Теперь мы можем предоставить нашему новому пользователю доступ для управления нашей новой базой данных:

GRANT ALL PRIVILEGES ON DATABASE  TO ;
OutputGRANT

Когда вы закончите, выйдите из приглашения PostgreSQL, набрав:

\q

Вы должны быть возвращены к вашей сессии оболочки.

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

Теперь, когда у нас есть база данных, мы можем приступить к подготовке остальных требований нашего проекта. Мы будем устанавливать наши требования Python в виртуальной среде для упрощения управления.

Для этого нам сначала нужен доступ к команде + virtualenv +. Мы можем установить это с помощью + pip +.

Если вы используете * Python 2 *, введите:

sudo pip install virtualenv

Если вы используете * Python 3 *, введите:

sudo pip3 install virtualenv

С установленным + virtualenv + мы можем приступить к формированию нашего проекта. Создайте и перейдите в каталог, где мы можем хранить файлы нашего проекта:

mkdir ~/
cd ~/

В каталоге проекта создайте виртуальную среду Python, набрав:

virtualenv

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

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

source /bin/activate

Ваше приглашение должно измениться, чтобы указать, что вы сейчас работаете в виртуальной среде Python. Это будет выглядеть примерно так: + () @: ~ / $ +.

Когда ваша виртуальная среда активна, установите Django, Gunicorn и адаптер + psycopg2 + PostgreSQL с локальным экземпляром + pip +:

Note

pip install django gunicorn psycopg2

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

Создать и настроить новый проект Django

С нашими установленными компонентами Python мы можем создавать фактические файлы проекта Django.

Создать проект Django

Поскольку у нас уже есть каталог проекта, мы скажем Django установить файлы здесь. Теперь мы можем запустить проект Django в нашем каталоге + myproject +. Это создаст дочерний каталог с тем же именем для хранения самого кода и создаст сценарий управления в текущем каталоге:

django-admin.py startproject  .

Ваша текущая структура каталогов должна выглядеть примерно так:

.
└── ./myproject/
   ├── manage.py
   ├── myproject/
   │   ├── __init__.py
   │   ├── settings.py
   │   ├── urls.py
   │   └── wsgi.py
   └── venv/
       └── . . .

Как видите, у нас есть каталог родительского проекта, который содержит скрипт + manage.py, каталог внутреннего проекта и каталог виртуальной среды` + venv`, который мы создали ранее.

Настройте параметры проекта

Первое, что мы должны сделать с нашими недавно созданными файлами проекта, это настроить параметры. Откройте файл настроек в вашем текстовом редакторе:

nano ~///settings.py

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

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

~ / MyProject / MyProject / settings.py

. . .
# 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 = ['', '', ]

Затем найдите раздел, который настраивает доступ к базе данных. Это начнется с + DATABASES +. Конфигурация в файле предназначена для базы данных SQLite. Мы уже создали базу данных PostgreSQL для нашего проекта, поэтому нам нужно изменить настройки.

Измените настройки с помощью вашей базы данных PostgreSQL. Мы говорим Django использовать адаптер + psycopg2 +, который мы установили с помощью + pip +. Нам нужно дать имя базы данных, имя пользователя базы данных, пароль пользователя базы данных, а затем указать, что база данных находится на локальном компьютере. Вы можете оставить настройку + PORT + пустой строкой:

~ / MyProject / MyProject / settings.py

. . .

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

. . .

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

~ / MyProject / MyProject / settings.py

. . .

STATIC_URL = '/static/'

Сохраните и закройте файл, когда вы закончите.

Завершите начальную настройку проекта

Теперь мы можем перенести исходную схему базы данных в нашу базу данных PostgreSQL, используя скрипт управления:

cd ~/
./manage.py makemigrations
./manage.py migrate

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

./manage.py createsuperuser

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

Мы можем собрать весь статический контент в каталог, который мы настроили, набрав:

./manage.py collectstatic

Вам нужно будет подтвердить операцию. Затем статические файлы будут помещены в каталог с именем + static + в каталоге вашего проекта.

Наконец, вы можете протестировать свой проект, запустив сервер разработки Django с помощью этой команды:

./manage.py runserver 0.0.0.0:8000

В веб-браузере перейдите к доменному имени или IP-адресу вашего сервера, за которым следует +: 8000 +:

http://:8000

Вы должны увидеть страницу индекса по умолчанию Django:

изображение: https: //assets.digitalocean.com/articles/django_gunicorn_nginx_1404/django_index.png [страница индекса Django]

Если вы добавите + / admin + в конец URL-адреса в адресной строке, вам будет предложено ввести имя пользователя и пароль администратора, которые вы создали с помощью команды + createuperuser:

изображение: https: //assets.digitalocean.com/articles/django_gunicorn_nginx_1404/admin_login.png [логин администратора Django]

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

изображение: https: //assets.digitalocean.com/articles/django_gunicorn_nginx_1404/admin_interface.png [интерфейс администратора Django]

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

Тестирование способности Gunicorn служить проекту

Последнее, что мы хотим сделать перед тем, как покинуть нашу виртуальную среду, это протестировать Gunicorn, чтобы убедиться, что он может обслуживать приложение. Мы можем сделать это легко, набрав:

cd ~/
gunicorn --bind 0.0.0.0:8000 .wsgi:application

Это запустит Gunicorn на том же интерфейсе, на котором работал сервер разработки Django. Вы можете вернуться и снова протестировать приложение.

Мы передали Gunicorn модуль, указав относительный путь к файлу Django + wsgi.py +, который является точкой входа в наше приложение, используя синтаксис модуля Python. Внутри этого файла определена функция с именем + application +, которая используется для связи с приложением. Чтобы узнать больше о спецификации WSGI, нажмите https://www.digitalocean.com/community/tutorials/how-to-set-up-uwsgi-and-nginx-to-serve-python-apps-on-ubuntu-14. -04 # определения и-концепция [здесь].

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

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

deactivate

Префикс виртуальной среды должен быть удален из командной строки, указывая, что вы больше не находитесь в виртуальной среде.

Создать сервисный файл Gunicorn systemd

Мы проверили, что Gunicorn может взаимодействовать с нашим приложением Django, но мы должны реализовать более надежный способ запуска и остановки сервера приложений. Для этого мы создадим файл службы systemd.

Создайте и откройте файл службы systemd для Gunicorn с привилегиями + sudo + в вашем текстовом редакторе:

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

Начните с раздела + [Unit] +, который используется для указания метаданных и зависимостей. Мы разместим здесь описание нашего сервиса и сообщим системе init, что запускать его нужно только после достижения цели сети:

/etc/systemd/system/gunicorn.service

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

Далее мы откроем раздел + [Service] +. Мы определим пользователя и группу, под которой мы хотим работать. Мы дадим право нашей учетной записи обычного пользователя на процесс, поскольку он владеет всеми соответствующими файлами. Мы передадим групповое владение группе + www-data, чтобы Nginx мог легко общаться с Gunicorn.

Затем мы наметим рабочий каталог и укажем команду для запуска сервиса. В этом случае нам нужно будет указать полный путь к исполняемому файлу Gunicorn, который устанавливается в нашей виртуальной среде. Мы свяжем его с Unix socket в каталоге проекта, так как Nginx установлен на том же компьютере. Это безопаснее и быстрее, чем при использовании сетевого порта. Мы также можем указать любые дополнительные настройки Gunicorn здесь. Например, мы указали 3 рабочих процесса в этом случае:

/etc/systemd/system/gunicorn.service

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

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

Наконец, мы добавим раздел + [Install] +. Это скажет systemd, с чем связать этот сервис, если мы включим его при загрузке. Мы хотим, чтобы эта служба запускалась, когда обычная многопользовательская система запущена и работает:

/etc/systemd/system/gunicorn.service

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

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

[Install]
WantedBy=multi-user.target

На этом наш сервисный файл systemd завершен. Сохраните и закройте его сейчас.

Теперь мы можем запустить созданную нами службу Gunicorn и включить ее так, чтобы она запускалась при загрузке:

sudo systemctl start gunicorn
sudo systemctl enable gunicorn
OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/gunicorn.service to /etc/systemd/system/gunicorn.service.

Проверьте статус услуги, набрав:

sudo systemctl status gunicorn
Output● gunicorn.service - gunicorn daemon
  Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled)
   since Wed 2016-12-21 21:05:07 UTC; 49s ago
Main PID: 10154 (gunicorn)
  CGroup: /system.slice/gunicorn.service
          ├─10154 /home/sammy/myproject/venv/bin/python3 /home/sammy/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application
          ├─10157 /home/sammy/myproject/venv/bin/python3 /home/sammy/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application
          ├─10158 /home/sammy/myproject/venv/bin/python3 /home/sammy/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application
          └─10159 /home/sammy/myproject/venv/bin/python3 /home/sammy/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application

Dec 21 21:05:07 debian-512mb-nyc3-01 systemd[1]: Started gunicorn daemon.
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10154] [INFO] Starting gunicorn 19.6.0
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10154] [INFO] Listening at: unix:/home/sammy/myproject/myproject.sock (10154)
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10154] [INFO] Using worker: sync
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10157] [INFO] Booting worker with pid: 10157
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10158] [INFO] Booting worker with pid: 10158
Dec 21 21:05:07 debian-512mb-nyc3-01 gunicorn[10154]: [2016-12-21 21:05:07 +0000] [10159] [INFO] Booting worker with pid: 10159

Самое важное, что нужно искать, это то, что устройство активно.

Сейчас также самое время проверить, был ли создан файл сокета. Если вы перечислите содержимое вашего каталога + ~ / +, вы должны увидеть файл сокета Unix:

ls -l ~/
Outputtotal 16
-rwxr-xr-x 1 sammy sammy     807 Dec 21 20:46 manage.py
drwxr-xr-x 3 sammy sammy    4096 Dec 21 20:54 myproject

drwxr-xr-x 3 sammy sammy    4096 Dec 21 20:54 static
drwxr-xr-x 5 sammy sammy    4096 Dec 21 20:41 venv

Как видите, сокет есть, а группа + www-data владеет группой.

Настроить Nginx на Proxy Pass для Gunicorn

Теперь, когда Gunicorn настроен, нам нужно настроить Nginx для передачи трафика процессу.

Начните с создания и открытия нового блока сервера в каталоге + sites-available + в Nginx:

sudo nano /etc/nginx/sites-available/

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

/ И т.д. / Nginx / сайты Недоступные / MyProject

server {
   listen 80;
   server_name ;
}

Далее, мы можем указать Nginx игнорировать ошибки, если значок не найден. Мы также сообщим ему, где найти статические ресурсы, которые мы собрали в нашем каталоге + ~ // static +. Все эти файлы имеют стандартный префикс URI «/ static», поэтому мы можем создать блок местоположения, соответствующий этим запросам:

/ И т.д. / Nginx / сайты Недоступные / MyProject

server {
   listen 80;
   server_name ;

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

Наконец, мы создадим блок + location / {} + для соответствия всем остальным запросам. В этом месте мы включим стандартный файл + proxy_params +, включенный в установку Nginx, а затем передадим трафик в сокет, созданный нашим процессом Gunicorn:

/ И т.д. / Nginx / сайты Недоступные / MyProject

server {
   listen 80;
   server_name ;

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

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

Сохраните и закройте файл, когда вы закончите. Теперь мы можем включить файл, связав его с каталогом + sites-enabled +:

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

Проверьте свою конфигурацию Nginx на наличие синтаксических ошибок, набрав:

sudo nginx -t
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Если об ошибках не сообщается, перезапустите Nginx, набрав:

sudo systemctl restart nginx

Теперь вы сможете перейти на домен или IP-адрес вашего сервера, чтобы просмотреть приложение без указания порта.

Note

Заключение

В этом руководстве мы создали проект Django в собственной виртуальной среде. Мы настроили Gunicorn для перевода клиентских запросов, чтобы Django мог их обработать. После этого мы настроили Nginx в качестве обратного прокси-сервера для обработки клиентских подключений и предоставления правильного проекта в зависимости от запроса клиента.

Django упрощает создание проектов и приложений, предоставляя множество общих частей, позволяя вам сосредоточиться на уникальных элементах. Используя общую цепочку инструментов, описанную в этой статье, вы можете легко обслуживать созданные вами приложения с одного сервера.

Related