Установка и настройка Django с Postgres, Nginx и Gunicorn

Предварительные условия

Предполагается, что VPS с Debian 7 или подобным дистрибутивом Linux (например, Ubuntu) уже установлен.

Для удобства данное руководство разделено на 2 части. Первая часть (разделы 1 – 6) охватывает только установку. Продвинутые пользователи Django, которым необходимы только инструкции по установке остального ПО, могут сразу же переходить к разделу 6. Пользователи, которым необходимы советы по настройке,  могут переходить к разделу 7.

 1: Обновление пакетов

Прежде чем начать установку, необходимо обновить программные пакеты на VPS. Для этого подключитесь к VPS по SSH и запустите следующие команды:

sudo apt-get update
sudo apt-get upgrade

Первая команда загружает все обновления для пакетов, управляемых командой apt-get. Вторая команда устанавливает загруженные обновления. Если даные команды обнаружат новые доступные версии пакетов, будет выведено извещение, предлагающее указать, нужно ли устанавливать обновления. Нажмите Y и клавишу Enter при появлении такого извещения.

 2: Установка и создание Virtualenv

Установить инструмент virtualenv очень просто. Для этого запустите приведенную ниже команду:

sudo apt-get install python-virtualenv

Готово! Теперь нужно создать virtualenv (или виртуальную среду), чтобы разместить и постоянно хранить в ней Django и другие пакеты Python:

sudo virtualenv /opt/myenv

Обратите внимание: в каталоге /opt был создан новый каталог по имени myenv. Согласно данному руководству, в этом каталоге и нужно развернуть виртуальную среду. Чтобы развернуть среду в другом каталоге, не забудьте заменить /opt/myenv путем к этому каталогу. Некоторые разработчики создают каталог по имени webapps в root-каталоге сервера.

 3: Установка Django

Теперь нужно активировать virtualenv, чтобы пакеты Python были установлены не общесистемно, а изолированно, внутри среды. Итак, чтобы активировать virtualenv:

source /opt/myenv/bin/activate

Обратите внимание, имя каталога, содержащего виртуальную среду (myenv) внесено в начало терминальной строки. Это помогает легко определить, активирована ли virtualenv и какая именно среда является текущей (в случае, если на VPS  существует несколько virtualenv).

Теперь можно приступить к установке Django. Для этого используйте pip, менеджер пакетов Python (аналог easy_install). Запустите команду:

pip install django

Django установлен внутри активной virtualenv. Теперь нужно запустить сервер баз данных.

4: Установка PostgreSQL

Большинство пользователей Django предпочитают использовать PostgreSQL в качестве сервера баз данных. Он намного более устойчивый к ошибкам, чем MySQL; кроме того, Django ORM работает с PostgreSQL намного лучше, чем с MySQL, MSSQL и т.п.

Поскольку на данном этапе активная  virtualenv не нужна, ее необходимо дезактивировать, запустив команду:

deactivate

Данная команда дезактивирует текущую активную виртуальную среду. Теперь необходимо установить зависимости PostgreSQL (для его работы с Django) с помощью следующей команды:

sudo apt-get install libpq-dev python-dev

Установив все необходимые зависимости, установите PostgreSQL:

sudo apt-get install postgresql postgresql-contrib

Теперь PostgreSQL установлен и готов к работе.

5: Установка NGINX

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

sudo apt-get install nginx

Обратите внимание: NGINX не запускается автоматически, его нужно будет запустить вручную; не забудьте вернуться к этому перед настройкой VPS.

 6: Установка Gunicorn

Gunicorn – это очень мощный HTTP-сервер Python WSGI. Поскольку Gunicorn является пакетом Python, необходимо активировать виртуальную среду, прежде чем его устанавливать. Это делается так:

source /opt/myenv/bin/activate

Убедитесь в том, что «myenv» внесен в начало терминальной строки. Активировав виртуальную среду, запустите команду:

pip install gunicorn

Теперь Gunicorn установлен внутри virtualenv.

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

7: Настройка PostgreSQL

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

sudo su - postgres

Сейчас строка терминала должна вывести «postgres@сервер». Если это так, запустите следующую команду, которая создаст базу данных:

createdb mydb

Это создаст базу даных под названием mydb (если в команду не были внесены изменения). Конечно, базу данных можно назвать как угодно. Теперь создайте пользователя базы данных с помощью следующей команды:

createuser -P

На данном этапе появятся 6 извещений. Первое запрашивает имя нового пользователя (выберите любое удобное имя). Следующие два извещения запросят установить и подтвердить пароль для нового пользователя. В последних трех извещениях нужно просто ввести «n» и нажать Enter. Это гарантирует, что новый пользователь имеет доступ только к тем файлам, к которым ему даете доступ вы. Теперь активируйте интерфейс командной строки PostgreSQL:

psql

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

GRANT ALL PRIVILEGES ON DATABASE mydb TO имя_пользователя;

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

8: Создание проекта Django

На данном этапе необходим тестовый проект Django, который покажет, все ли работает должным образом. Перейдите из текущего каталога в каталог virtualenv (в данном случае это /opt/myenv):

cd /opt/myenv

Теперь убедитесь в том, что виртуальная среда активна. Для этого можно запустить следующую команду:

source /opt/myenv/bin/activate

Теперь, когда виртуальная среда активна, запустите следующую команду, которая создаст новый проект Django:

django-admin.py startproject myproject

В каталоге виртуальной среды должен появиться новый каталог по имени myproject. Именно в нем хранятся файлы нового проекта Django.

Чтобы Django имел возможность взаимодействовать с базой данных, нужно установить бекэнд PostgreSQL. Убедитесь, что виртуальная среда активна, и запустите команду:

pip install psycopg2

Перейдите в каталог myproject, а затем в его подкаталог с таким же именем:

cd /opt/myenv/myproject/myproject

В текстовом редакторе откройте файл settings.py:

nano settings.py

Найдите настройки БД и отредактируйте их следующим образом:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'mydb', # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': 'myuser',
'PASSWORD': 'password',
'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '', # Set to empty string for default.
}
}

Сохраните изменения и закройте файл. Теперь поднимитесь на каталог выше, в главный каталог проекта Django (/opt/myenv/myproject).

cd /opt/myenv/myproject

Если виртуальная среда не была активирована, активируйте ее.

source /opt/myenv/bin/activate

Активировав virtualenv, запустите следующую команду, чтобы Django мог добавить начальные конфигурации и другие таблицы в базу данных:

python manage.py syncdb

Выведенный результат покажет список установленных таблиц, а затем спросит, нужно ли создать суперпользователя (не является обязательным и зависит от того, что будет использоваться: система аутентификации Джанго или Django admin).

9: Настройка Gunicorn

Настройка Gunicorn сильно зависит от потребностей приложения, потому данное руководство содержит лишь краткое описание процесса запуска Gunicorn и некоторые его общие настройки.

Для начала нужно рассмотреть запуск сервера Gunicorn с настройками по умолчанию. Для этого используйте команду:

gunicorn_django --bind домен_или_ip.com:8001

Не забудьте заменить фразу «домен_или_ip» своим доменным или IP-адресом VPS. Теперь откройте веб-браузер и посетите домен_или_ip.com:8001. Должен появиться экран приветствия Django.

Если внимательно посмотреть на выведенный предыдущей командой результат, можно заметить, что запущен только один процесс Gunicorn. Но что делать, если нужно запустить широкомасштабное приложение на большом сервере? Все, что нужно – это немного изменить команду:

gunicorn_django --workers=3 --bind домен_или_ip.com:8001

Как видите, теперь было загружено 3 процесса. Изменяя значение –workers, можно запустить любое количество процессов.

Поскольку команда, запускающая Gunicorn, была выполнена как root, Gunicorn сейчас запущен как root. Чтобы изменить это, нужно снова немного отредактировать команду:

gunicorn_django --workers=3 --user=nobody --bind домен_или_ip.com:8001

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

cd /opt/myenv

Откройте конфигурационный файл с помощью текстового редактора (в приведенном ниже примере используется nano):

sudo nano gunicorn_config.py

Внесите следующий блок кода:

command = '/opt/myenv/bin/gunicorn'
pythonpath = '/opt/myenv/myproject'
bind = '127.0.0.1:8001'
workers = 3
user = nobody

Сохраните и закройте файл. Данные опции выполняют следующее: устанавливают путь к исполнительным файлам gunicorn, домен и порт для соединения с Gunicorn,вносят каталог проекта в путь Python, определяют количество процессов gunicorn и пользователя, с помощью которого будет  работать Gunicorn.

Теперь для запуска сервера понадобится более длинная команда. Введите в командную строку следующее:

/opt/myenv/bin/gunicorn -c /opt/myenv/gunicorn_config.py myproject.wsgi

Как можно заметить, в данной команде был использован флаг –с. Он указывает gunicorn на существующий конфигурационный файл, который нужно использовать (задается после флага). Наконец, нужно передать ссылку на файл WSGI точечной нотации Python, чтобы указать Gunicorn, где находится файл WSGI.

Запуская Gunicorn подобным образом, нужно либо включить Gunicorn в отдельной screen-сессии, либо перевести процесс в фоновый режим, нажав ctrl + z, затем bg и enter сразу после запуска команды Gunicorn. Это переведет процесс в фоновый режим, что означает, что процесс будет работать даже после завершения текущей сессии. Также из-за этого возникает небольшая проблема – необходимость запускать или перезапускать Gunicorn вручную после перезагрузки или сбоя VPS. Чтобы решить эту проблему, многие используют демон supervisord для управления  Gunicorn.

Конечно, это далеко не исчерпывающий список опций конфигураций для Gunicorn. Пожалуйста, прочитайте документацию Gunicorn, которую можно найти по ссылке gunicorn.org, чтобы получить больше информации по данной теме.

10: Настройка NGINX

Итак, для начала нужно запустить NGINX:

sudo service nginx start

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

STATIC_ROOT = "/opt/myenv/static/"

Конечно, данные файлы можно расположить где угодно; но для поддержания чистоты рекомендуется разместить их вне папки проекта Django, но внутри каталога виртуальной среды.

Указав местонахождение статических файлов, можно переходить к настройке NGINX для обработки этих файлов. Откройте новый конфигурационный файл NGINX с помощью следующей команды (в случае необходимости замените «nano» другим редактором):

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

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

server {
server_name домен_или_ip.com;
access_log off;
location /static/ {
alias /opt/myenv/static/;
}
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
}
}

Сохраните изменения и закройте файл. Приведенный выше блок кода говорит NGINX обслуживать все, что запрашивается на домен_или_ip.com/static/ из статического каталога проекта Django. Все запрашиваемое на домен_или_ip.com, будет проксировано на локальный хост, порт 8001 (на котором запущен Gunicorn). Без этого IP-адресом каждого запроса будет 127.0.0.1, а именем хоста будет имя хоста данного VPS.

Теперь нужно установить символьную ссылку, указывающую на данный конфигурационный файл, в каталог /etc/nginx/sites-enabled. Таким образом NGINX определяет, активен ли сайт. Перейдите в каталог /etc/nginx/sites-enabled:

cd /etc/nginx/sites-enabled

В данном каталоге запустите:

sudo ln -s ../sites-available/myproject

Это создаст необходимую символьную ссылку, что укажет NGINX на новый конфигурационный файл сайта.

Кроме того, нужно удалить блок nginx по умолчанию:

`sudo rm default'

Теперь нужно перезапустить NGINX, чтобы внесенные изменения вступили в силу. Для этого запустите:

sudo service nginx restart

Готово! Теперь Django установлен и работает с PostgreSQL, веб-приложение доступно в сети, NGINX обрабатывает статические файлы, а Gunicorn используется как сервер приложения. Задать вопросы и получить ценные советы по данной теме можно в комментариях к статье.

Tags: , , , , , , , , ,

2 комментария

Добавить комментарий для Владимир Отменить ответ