Установка связки Django + PostgreSQL + Nginx + Gunicorn в Ubuntu 14.04

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

Данное руководство поможет установить и настроить компоненты, необходимые для обслуживания приложений Django на сервере Ubuntu 14.04: СУБД PostgreSQL (вместо SQLite), сервер приложений Gunicorn, Nginx (как обратный прокси-сервер для Gunicorn).

Требования

Для выполнения руководства понадобится:

  • Свежий предварительно настроенный сервер Ubuntu 14.04 (руководство по настройке – здесь).
  • Пользователь с доступом к sudo.

Фреймворк Django будет установлен в виртуальной среде (virtual environment). Это позволяет изолировать проект от общесистемной среды и использовать индивидуальные версии программ.

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

Для начала нужно установить все необходимые компоненты из репозиториев Ubuntu. Позже можно использовать  менеджер пакетов Python под названием pip для установки дополнительных компонентов.

Обновите индекс пакетов системы и установите необходимые пакеты:

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

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

2: Создание базы данных и пользователя 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

3: Виртуальная среда Python

Теперь нужно подготовить виртуальную среду Python, в которой будет храниться приложение.

Для этого нужно установить инструмент virtualenv:

sudo pip install virtualenv

Создайте каталог для хранения приложения и откройте его:

mkdir ~/myproject
cd ~/myproject

Примечание: Вместо условного названия каталога укажите название вашего проекта.

В этом каталоге нужно создать виртуальную среду Python:

virtualenv myprojectenv

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

Прежде чем установить зависимости Python, нужно включить виртуальную среду.

source myprojectenv/bin/activate

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

(myprojectenv)user@host:~/myproject$

Теперь можно установить Django, Gunicorn и psycopg2 (адаптер PostgreSQL).

pip install django gunicorn psycopg2

4: Создание и настройка проекта Django

Теперь все компоненты Python установлены. Приступайте к созданию файлов проекта.

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

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

django-admin.py startproject myproject .

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

После этого нужно настроить проект. Откройте файл settings.py в текстовом редакторе:

nano myproject/settings.py

Для начала найдите DATABASES – раздел настроек доступа к БД. Этот раздел содержит настройки для БД SQLite, однако проект использует БД PostgreSQL. Замените данные стандартной БД данными PostgreSQL. Укажите имя БД, имя и пароль пользователя базы данных, а затем укажите, что база данных находится на локальном компьютере. Настройки порта (параметр PORT) можно не заполнять.

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

Перейдите в конец файла и добавьте параметр, указывающий, где должны находиться статические файлы. Это необходимо для того, чтобы веб-сервер Nginx мог обрабатывать запросы по этим файлам. Следующая строка поместит эти файлы в каталог под названием 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:

It worked!
Congratulations on your first Django-powered page.

Добавьте в конец ссылки /admin в конец адреса. Браузер запросит учётные данные администратора.

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

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

Тестирование Gunicorn

Теперь нужно проверить, может ли веб-сервер Gunicorn обслуживать приложение. Наберите:

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

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

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

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

Примечание: Чтобы узнать больше о спецификации WSGI, откройте эту ссылку.

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

Теперь приложение Django настроено. Отключите виртуальную среду:

deactivate

6: Создание файла Upstart для Gunicorn

Теперь нужно настроить автозапуск сервера приложений. Для этого создайте скрипт Upstart.

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

sudo nano /etc/init/gunicorn.conf

Начните скрипт с простой строки description, которая указывает, для чего предназначен данный файл. Затем определите системные уровни запуска, на которых этот сервис должен автоматически запускаться (как правило, для сервисов выбирают уровни запуска 2, 3, 4 и 5). Сервис будет запущен, когда система находится на любом из этих уровней; на каком-либо другом уровне запуска (например, при перезагрузке системы, выключении, в однопользовательском режиме и т.п.) сервис будет отключен.

description "Gunicorn application server handling myproject"
start on runlevel [2345] stop on runlevel [!2345]

Добавьте в скрипт автоматическую перезагрузку сервиса в случае сбоя. Затем укажите пользователя и группу для запуска сервиса (в руководстве это стандартный системный пользователь – все файлы принадлежат ему). Также нужно разрешить доступ группе 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 (это более быстрый и безопасный способ). Добавьте любые другие необходимые настройки в этот файл; к примеру, здесь можно указать количество рабочих процессов.

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

7: Nginx как обратный прокси-сервер для Gunicorn

Создайте новый блок server в каталоге sites-available:

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

Задайте порт, который должен прослушивать веб-сервер (в данном случае – стандартный порт 80) и укажите доменное имя или IP в директиве server_name.

server {
listen 80;
server_name server_domain_or_IP;
}

Веб-сервер Nginx должен игнорировать проблемы с фавиконом. Затем нужно указать местонахождение статических файлов, собранных в каталоге ~/myproject/static. У всех этих файлов стандартный префикс URI (/static), потому можно создать блок location для обслуживания этих запросов.

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 настроен в качестве обратного прокси-сервера для обработки клиентских подключений.

Tags: , , , , ,

Добавить комментарий