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

Вступление

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

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

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

Для выполнения этого руководства у вас должен быть свежий экземпляр сервера Ubuntu 14.04 с пользователем без полномочий root с настроенными привилегиямиsudo. Вы можете узнать, как это настроить, пройдя через нашinitial server setup guide.

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

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

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

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

Чтобы начать процесс, мы загрузим и установим все нужные нам элементы из репозиториев Ubuntu. Мы будем использовать менеджер пакетов Pythonpip для установки дополнительных компонентов чуть позже.

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

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

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

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

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

Чтобы работать с Postgres в его конфигурации по умолчанию, лучше временно перейти на системного пользователяpostgres. Сделайте это сейчас, набрав:

sudo su - postgres

При работе от имени пользователяpostgres вы можете войти прямо в интерактивный сеанс PostgreSQL без дальнейшей аутентификации, набрав:

psql

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

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

CREATE DATABASE myproject;

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

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

CREATE USER myprojectuser WITH PASSWORD 'password';

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

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

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

\q

Теперь выйдите из сеанса пользовательской оболочкиpostgres, чтобы вернуться к обычному сеансу пользовательской оболочки, набрав:

exit

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

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

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

sudo pip install virtualenv

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

mkdir ~/myproject
cd ~/myproject

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

virtualenv myprojectenv

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

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

source myprojectenv/bin/activate

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

Активировав виртуальную среду, установите Django, Gunicorn и адаптер PostgreSQLpsycopg2 с локальным экземпляромpip:

pip install django gunicorn psycopg2

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

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

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

Поскольку у нас уже есть каталог проекта, мы скажем Django установить файлы здесь. Он создаст каталог второго уровня с реальным кодом, который является нормальным, и поместит сценарий управления в этот каталог. Ключом к этому является точка в конце, которая указывает Django создавать файлы в текущем каталоге:

django-admin.py startproject myproject .

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

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

nano myproject/settings.py

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

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

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

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

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

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

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

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

cd ~/myproject
./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://server_domain_or_IP:8000

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

Django index page

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

Django admin login

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

Django admin interface

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

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

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

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

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

Мы передали Gunicorn модуль, указав относительный путь к каталогу файлаwsgi.py Django, который является точкой входа в наше приложение, используя синтаксис модуля Python. Внутри этого файла определена функцияapplication, которая используется для связи с приложением. Чтобы узнать больше о спецификации WSGI, щелкнитеhere.

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

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

deactivate

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

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

Создайте и откройте файл Upstart для Gunicorn с правамиsudo в текстовом редакторе:

sudo nano /etc/init/gunicorn.conf

Мы начнем с простой строки описания, чтобы указать, для чего нужен наш сервисный файл. Затем мы перейдем к определению уровней запуска системы, где эта служба должна запускаться автоматически. Обычные уровни запуска для запуска служб: 2, 3, 4 и 5. Мы запустим наш сервис, когда система находится в любом из них. Мы скажем, чтобы он остановился, когда он находится на любом другом уровне выполнения (например, когда система перезагружается, выключается или в однопользовательском режиме):

description "Gunicorn application server handling myproject"

start on runlevel [2345]
stop on runlevel [!2345]

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

description "Gunicorn application server handling myproject"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid user
setgid www-data
chdir /home/user/myproject

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

description "Gunicorn application server handling myproject"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid user
setgid www-data
chdir /home/user/myproject

exec myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application

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

Запустите сервис Gunicorn, набрав:

sudo service gunicorn start

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

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

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

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

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

server {
    listen 80;
    server_name server_domain_or_IP;
}

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

server {
    listen 80;
    server_name server_domain_or_IP;

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

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

server {
    listen 80;
    server_name server_domain_or_IP;

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

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

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

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

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

sudo nginx -t

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

sudo service nginx restart

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

Заключение

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

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

Related