Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
COM
Услуги
Преимущества
РАЗРАБОТКА DJANGO-ПРИЛОЖЕНИЯ НА POSTGRESQL + NGINX + Рубрики
Тарифы
GUNICORN В DEBIAN 9 Arch Linux
Информаторий Centos
30 ноября, 2018 12:09 пп 2 073 views | Комментариев нет Cloud Server
Контакты Debian
Debian, Python | Amber | Комментировать запись
Development
FreeBSD
Django – это производительный веб-фреймворк для разработки приложений Python. Django включает вРегистрация
себя упрощенный
FTP
сервер разработки для локального тестирования кода, который ни в коем случае не рекомендуется использовать для
General
производства – в такой среде требуется более безопасный и мощный веб-сервер.
ВХОД Java
LAMP Stack
Данный мануал поможет установить и настроить компоненты, необходимые для обслуживания приложений Django на
LEMP Stack
сервере Debian 9: СУБД PostgreSQL (вместо SQLite), сервер приложений Gunicorn и Nginx (как обратный прокси-сервер для
Linux
Gunicorn).
MariaDB
mySQL
Требования PHP
Python
Для выполнения мануала понадобится: Quickstart
RHEL
Свежий предварительно настроенный сервер Debian Ruby
Пользователь с доступом к команде sudo. SSH
Turnkey
Все необходимые рекомендации можно найти в мануале по начальной настройке сервера. Ubuntu
VPS
Без категорий
Фреймворк Django будет установлен в виртуальную среду (virtual environment), что позволит изолировать проект от
общесистемной среды и использовать индивидуальные версии программ.
Поиск по меткам
После запуска базы данных и приложения мы установим и настроим сервер приложений Gunicorn. Он будет интерфейсом
для приложения, преобразовывая HTTP-запросы клиентов в вызовы Python, которые может обрабатывать приложение.
Apache CentO
Ansible
Затем мы установим Nginx, чтобы воспользоваться его высокопроизводительными механизмами обработки соединений и 7 Cloud Server CSS Deb
легко настраиваемыми функциями безопасности. 8 Debian 9 Django DNS Docke
Javascript LAMP stack Let's
MySQL
1: Установка пакетов из репозиториев Debian MariaDB MongoDB
Архивы
sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl
Выберите месяц
Django 1.11 – последняя версия Django, которая будет поддерживать Python 2. Если вы начинаете новые проекты,
настоятельно рекомендуется перейти на Python 3. Если вам все еще нужен Python 2, введите:
sudo apt install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx curl
Эта команда устанавливает pip, инструменты разработки Python, систему управления базами данных PostgreSQL и веб-
сервер Nginx.
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 1/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
Информаторий
При установке PostgreSQL был создан пользователь операционной системы по имени postgres, что совпадает с
пользователем postgres – администратором системы PostgreSQL. Измените пользователя и войдите как postgres. Для этого
можно использовать sudo и опцию –u: Контакты
В данном руководстве БД условно называется myproject, но лучше использовать более описательное имя.
После этого нужно изменить параметры подключения для нового пользователя. Это позволит ускорить выполнение
операций базы данных, при этом значения не придётся запрашивать при установке каждого соединения.
Установите UTF-8 как кодировку по умолчанию, чего требует Django. Также установите схему по умолчанию изоляции
транзакций «read committed», которая блокирует считывание с незавершенных транзакций. В завершение нужно
установить часовой пояс. По умолчанию проекты Django будут использовать UTC.
\q
Теперь нужно подготовить виртуальную среду Python, в которой будет храниться приложение. Для этого установите
инструмент virtualenv, предварительно обновив pip:
# Python 3:
# Python 2:
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 2/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
Создайте каталог для хранения приложения и перейдите в него:
mkdir ~/myprojectdir
cd ~/myprojectdir
Услуги
Примечание: Вместо условного названия каталога укажите название вашего проекта. Преимущества
Тарифы
В этом каталоге нужно создать виртуальную среду Python:
Информаторий
virtualenv myprojectenv
Контакты
Эта команда создаст каталог myprojectenv в каталоге проекта myprojectdir и установит в нем локальную копию Python и
pip. В этом каталоге можно настроить изолированную среду Python для проекта. Регистрация
source myprojectenv/bin/activate
Командная строка изменится. Это значит, что теперь вы работаете в виртуальной среде:
(myprojectenv)user@host:~/myprojectdir$
Примечание: Вне зависимости от версии Python в виртуальной среде нужно использовать команду pip (не pip3).
Установите файлы проекта Django в подготовленный каталог. Это создаст каталог с кодом и поместит в этом каталоге
скрипт управления. Здесь мы определяем каталог явно, а не позволяем Django принимать решения относительно
текущего каталога.
Настройка проекта
После этого нужно настроить проект. Откройте файл settings.py в текстовом редакторе:
nano ~/myprojectdir/myproject/settings.py
Найдите в файле директиву ALLOWED_HOSTS. Она содержит белый список адресов и доменов, которые могут
подключаться к Django. Если входящий запрос содержит заголовок Host, который не включен в этот список, такой запрос
будет сброшен. Это обеспечит дополнительный уровень безопасности Django.
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 3/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
Перечислите в квадратных скобках все заведомо безопасные для Django IP-адреса или домены. Каждый элемент нужно
взять в одинарные кавычки. Все элементы списка разделяются запятыми. Чтобы добавить в список поддомены, поставьте
перед доменным именем точку. В приведённом ниже фрагменте вы найдёте несколько закомментированных примеров
того, как может выглядеть директива ALLOWED_HOSTS.
Услуги
Примечание: Обязательно укажите localhost как один из параметров, поскольку позже мы будемПреимущества
проксировать
соединения через локальный экземпляр Nginx.
Тарифы
. . .
# 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
Затем найдите DATABASES – раздел настроек доступа к БД. Этот раздел содержит настройки для БД SQLite, однако проект
ВХОД
использует БД PostgreSQL. Замените данные стандартной БД данными PostgreSQL.
Настройте Django для использования psycopg2. Укажите имя БД, имя и пароль пользователя базы данных, а затем укажите,
что база данных находится на локальном компьютере. Настройки порта (параметр PORT) можно не заполнять.
. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
. . .
Перейдите в конец файла и укажите, где должны находиться статические файлы. Это необходимо для того, чтобы веб-
сервер Nginx мог обрабатывать запросы по этим файлам. Следующая строка поместит эти файлы в каталог под названием
static в каталоге проекта:
. . .
STATIC_URL = '/static/'
Теперь нужно переместить исходную схему базы данных в базу данных PostgreSQL:
~/myprojectdir/manage.py makemigrations
~/myprojectdir/manage.py migrate
~/myprojectdir/manage.py createsuperuser
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 4/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
~/myprojectdir/manage.py collectstatic
Тарифы
Для этого введите:
Информаторий
sudo ufw allow 8000
Контакты
ВХОД
Откройте в браузере доменное имя или IP-адрес и укажите порт :8000.
http://server_domain_or_IP:8000
It worked!
Congratulations on your first Django-powered page.
Добавьте /admin в конец адреса. Браузер запросит учётные данные администратора. Заполните появившиеся на экране
поля, указав имя и пароль только что созданной учётной записи администратора при помощи команды createsuperuser.
После этого на экране появится интерфейс администратора.
Получив доступ к интерфейсу, вы убедились, что БД хранит информацию проекта и взаимодействует с ним.
Тестирование Gunicorn
cd ~/myproject
Эта команда запустит Gunicorn в том же интерфейсе, в котором до этого работал сервер разработки Django. Вернитесь и
снова протестируйте приложение.
Примечание: Поскольку Gunicorn не знает о расположении статического контента для интерфейса администратора,
интерфейс будет отображаться без использования стилей.
Чтобы передать серверу Gunicorn модуль, нужно указать путь к каталогу файла wsgi.py, который является точкой входа в
приложение. Внутри этого файла находится функция application, которая используется для связи с приложением.
Завершив тестирование, нажмите в окне терминала CTRL-C, чтобы остановить сервер Gunicorn.
deactivate
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 5/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
После этого нужно создать сервис и сокет systemd для Gunicorn. Эти файлы позволяют системе инициализации
Услуги
автоматически запускать Gunicorn и обслуживать приложение. При создании подключения systemd будет автоматически
запускать процесс Gunicorn.
Преимущества
Создайте и откройте сокет-файл для Gunicorn:
Тарифы
[Socket]
ListenStream=/run/gunicorn.sock
ВХОД
[Install]
WantedBy=sockets.target
Добавьте раздел [Unit], который определяет метаданные и зависимости приложения. Внесите в него описание сервиса.
Поскольку сервис работает в связке с сокетом, нужно включить директиву Requires, чтобы указать на эти отношения:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
Затем добавьте раздел [Service]. В нем нужно указать пользователя и группу, с помощью которых будет запущен сервис.
Передайте текущему пользователю права на процесс и соответствующие файлы. Также права должна иметь группа www-
data, тогда веб-сервер Nginx сможет взаимодействовать с процессом Gunicorn.
Затем нужно указать полный путь к исполняемому файлу Gunicorn, чтобы система инициализации знала, где искать эти
файлы (в виртуальной среде). Systemd требует полного пути к исполняемым файлам Gunicorn в виртуальной среде.
Привяжите процесс созданного сокета к каталогу /run. Выведите все данные на стандартный вывод, чтобы процесс
journald мог вести логи Gunicorn. Также здесь можно указать любые дополнительные настройки Gunicorn. Например, в
этом случае мы настроили три рабочих процесса (измените это в случае необходимости).
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=8host
Group=www-data
WorkingDirectory=/home/8host/myprojectdir
ExecStart=/home/8host/myprojectdir/myprojectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
myproject.wsgi:application
В конец файла нужно добавить раздел [Install], который определяет, к чему должен подключиться сервис во время
автозапуска.
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=8host
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 6/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
Group=www-data
WorkingDirectory=/home/8host/myprojectdir
ExecStart=/home/8host/myprojectdir/myprojectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
Услуги
--bind unix:/run/gunicorn.sock \
myproject.wsgi:application
Преимущества
[Install]
WantedBy=multi-user.target
Тарифы
Теперь нужно проверить сокет. Запросите состояние процесса, чтобы убедиться, что он может запускаться.
file /run/gunicorn.sock
/run/gunicorn.sock: socket
Если команда systemctl status отвечает, что произошла ошибка, или вы не нашли файл gunicorn.sock в каталоге, это
указывает на то, что сокет Gunicorn не получилось создать правильно. Проверьте логи сокета Gunicorn:
В настоящее время (если вы только запустили юнит gunicorn.socket) gunicorn.service не будет активен, так как к сокету еще
не было никаких соединений. Вы можете проверить это:
Вы должны увидеть HTML-вывод приложения в терминале. Это значит, что Gunicorn был запущен и может обслуживать
приложение Django. Вы можете проверить, работает ли сервис Gunicorn:
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 7/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
Tasks: 4 (limit: 1153)
CGroup: /system.slice/gunicorn.service
Услуги
├─1178 /home/8host/myprojectdir/myprojectenv/bin/python3 /home/8host/myprojectdir/myprojectenv/bin/gunicorn -
-access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application
Преимущества
├─1180 /home/8host/myprojectdir/myprojectenv/bin/python3 /home/8host/myprojectdir/myprojectenv/bin/gunicorn -
-access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application
Тарифы
└─1181 /home/8host/myprojectdir/myprojectenv/bin/python3 /home/8host/myprojectdir/myprojectenv/bin/gunicorn -
-access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myproject.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"
Если вывод команды curl или systemctl status сообщает об ошибке, проверьте логи для получения дополнительных
сведений:
Теперь приложение Gunicorn готово. Настройте Nginx для передачи трафика приложения.
Добавьте в файл блок server. Задайте порт, который должен прослушивать веб-сервер (в данном случае – стандартный
порт 80) и укажите доменное имя или IP в директиве server_name.
server {
listen 80;
server_name server_domain_or_IP;
Веб-сервер Nginx должен игнорировать проблемы с фавиконом. Затем нужно указать местонахождение статических
файлов, собранных в каталоге ~/myprojectdir/static. У всех этих файлов стандартный префикс URI (/static), потому можно
создать блок location для обслуживания этих запросов.
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 8/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
server {
listen 80;
server_name server_domain_or_IP;
location /static/ {
Услуги
root /home/8host/myprojectdir;
Преимущества
}
} Тарифы
Информаторий
Теперь создайте блок location / {} для всех остальных запросов. Добавьте в него стандартный файл proxy_params, который
входит в установку Nginx, и направьте трафик на сокет Gunicorn. Контакты
server {
listen 80;
Регистрация
server_name server_domain_or_IP;
ВХОД
location /static/ {
root /home/8host/myprojectdir;
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
sudo nginx -t
Теперь вы можете просмотреть приложение в браузере, открыв IP-адрес или домен и указав порт 80.
Поскольку порт сервера разработки (8000) больше не используется, его нужно заблокировать.
Теперь откройте в браузере доменное имя или IP, чтобы просмотреть приложение.
Примечание: После настройки обратного прокси-сервера Nginx настоятельно рекомендуется защитить подключения
при помощи сертификатов SSL/TLS. В противном случае все данные будут передаваться в виде простого текста и легко
могут быть перехвачены злоумышленниками. Если у вас есть домен, вы можете получить бесплатный доверенный
сертификат от Let’s Encrypt. Подробнее об этом – в этом мануале. Чтобы создать самоподписанный сертификат,
читайте эту статью.
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 9/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
Если Nginx отображает страницу по умолчанию и не проксирует запросы для вашего приложения, попробуйте настроить
директиву server_name в файле /etc/nginx/sites-available/myproject и указать в ней IP-адрес или доменное имя сервера.
Услуги
Nginx использует директиву server_name, чтобы определить, какой блок server использовать для ответа на запросы. Если
Преимущества
вы видите страницу Nginx по умолчанию, это значит, что Nginx не смог явно выполнить запрос к блоку sever, поэтому он
вернулся к блоку по умолчанию, определенному в /etc/nginx/sites-available/default. Тарифы
Информаторий
Директиву server_name в виртуальном хосте вашего проекта должна содержать более конкретное значение, чем
виртуальный хост по умолчанию.
Контакты
Основное место для поиска такой информации – это логи ошибок Nginx. Как правило, здесь можно узнать, какие условия
вызвали проблемы во время проксирования. Чтобы открыть логи, введите:
Теперь сделайте в своем браузере еще один запрос, чтобы создать новую ошибку (попробуйте обновить страницу). Вы
должны увидеть новое сообщение об ошибке, записанное в лог. Это сообщение поможет вам сузить проблему.
Это значит, что Nginx не смог найти файл gunicorn.sock в указанном месте. Вы должны сравнить расположение proxy_pass,
определенное в файле /etc/nginx/sites-available/myproject, и фактическое расположение файла gunicorn.sock, созданного
блоком gunicorn.socket systemd.
Если вы не можете найти файл gunicorn.sock в каталоге /run, вероятно, сокет-файл не смог его создать. Вернитесь к
разделу 6 данного мануала.
Если вы получили:
Это указывает на то, что Nginx не смог подключиться к сокету Gunicorn из-за проблем с правами доступа. Это может
произойти, когда процедура выполняется через пользователя root, а не sudo. Хотя systemd может создать файл сокета
Gunicorn, Nginx не может получить к нему доступ.
Это бывает, если в какой-то точке между корневым каталогом (/) и файлом gunicorn.sock есть ограничения доступа. Чтобы
просмотреть права сокет-файла и каждого из его родительских каталогов, передайте абсолютный путь к файлу сокета
команде namei:
namei -l /run/gunicorn.sock
f: /run/gunicorn.sock
В выводе отображаются права для каждого из компонентов каталога. Изучив права доступа (первый столбец) и
собственности (второй и третий столбец), вы можете выяснить, какой тип доступа открыт к сокету.
В приведенном выше примере файл сокета и каждый из каталогов, ведущих к нему, предоставляют право на чтение и
выполнение всем пользователям (столбец прав для каталогов заканчивается на r-x вместо —). Значит, процесс Nginx
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 10/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
может доступ к сокету.
Если какой-либо из каталогов, ведущих к сокету, не предоставляет таких прав, Nginx не сможет получить доступ к сокету.
Также Nginx должен входить в группу, которая является владельцем сокет-файла.
Услуги
Django выдает сообщение «could not connect to server: Connection refused» Преимущества
При попытке получить доступ к приложению в веб-браузере Django может выдать такое сообщение: Тарифы
Информаторий
OperationalError at /admin/login/
Это значит, что Django не может подключиться к базе данных Postgres. Убедитесь, что экземпляр Postgres запущен:
ВХОД
sudo systemctl status postgresql
Если это не решило проблему, убедитесь, что параметры базы данных, определенные в файле
~/myprojectdir/myproject/settings.py, указаны корректно.
Общие действия
При появлении любых неполадок проверяйте логи – они могут сузить область ваших поисков. Проверьте каждый лог по
очереди и найдите сообщения, указывающие на проблемные области.
При обновлении конфигурации или приложения вам, вероятно, потребуется перезапустить процессы, чтобы изменения
вступили в силу.
Если вы обновите приложение Django, вы можете перезапустить процесс Gunicorn с помощью команды:
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 11/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
Полученное тестовое приложение можно использовать в качестве шаблона для разработки более сложного приложения.
Добавить комментарий
Продукт Преимущества
Тарифы Доступность
Помощь Информация
Техподдержка О компании
Информаторий Контакты
Способы оплаты
Отзывы
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 12/13
16.11.2021, 14:38 Разработка Django-приложения на PostgreSQL + Nginx + Gunicorn в Debian 9 | 8HOST.COM
Информаторий
Контакты
Регистрация
ВХОД
https://www.8host.com/blog/razrabotka-django-prilozheniya-na-postgresql-nginx-gunicorn-v-debian-9/ 13/13