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

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

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

Требования

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

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

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

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

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

Чтобы включить репозиторий EPEL, выполните:

sudo yum install epel-release

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

sudo yum install python-pip python-devel postgresql-server postgresql-devel postgresql-contrib gcc nginx

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

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

Запуск PostgreSQL

Сначала нужно инициировать БД PostgreSQL:

sudo postgresql-setup initdb

Теперь включите сервис PostgreSQL:

sudo systemctl start postgresql

После этого нужно откорректировать конфигурационный файл:

sudo nano /var/lib/pgsql/data/pg_hba.conf

Этот файл отвечает за настройку аутентификации СУБД. На данный момент СУБД открывает доступ только если имя пользователя системы совпадает с именем пользователя базы данных. Такое поведение подходит для локальной поддержки, но в данном случчае лучше настроить аутентификацию на основе пароля.

Для этого отредактируйте строки host в конце файла. Измените значение в последнем столбце на md5.

. . .
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
#host    all             all             ::1/128                 ident
host    all             all             ::1/128                 md5

Сохраните и закройте файл.

Перезапустите сервис PostgreSQL:

sudo systemctl restart postgresql
sudo systemctl enable 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: Создание файла Systemd

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

Создайте файл Systemd для Gunicorn:

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

Начните с раздела [Unit], который позволяет определить метаданные и зависимости. Поместите здесь описание сервиса здесь и укажите сеть:

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

Затем добавьте раздел [Service]. Укажите пользователя и группу, при помощи которых нужно запускать процесс. Передайте права на процесс текущему сетевому пользователю – он владеет всеми соответствующими файлами. Чтобы сервер Nginx мог взаимодействовать с процессами Gunicorn, передайте права на процесс его группе.

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

Здесь можно указать количество рабочих процессов; в руководстве будет использоваться 3 процесса. Настройте Unix-сокеты вместо сетевых портов для взаимодействия с Nginx (это более быстрый и безопасный способ).

[Unit] Description=gunicorn daemon
After=network.target
[Service] User=user
Group=nginx
WorkingDirectory=/home/user/myproject
ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application

Осталось добавить раздел [Install]. Он будет запускать сервис при запуске системы:

[Unit] Description=gunicorn daemon
After=network.target
[Service] User=user
Group=nginx
WorkingDirectory=/home/user/myproject
ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application
[Install] WantedBy=multi-user.target

Файл Systemd готов. Сохраните и закройте его.

Теперь можно включить сервис Gunicorn:

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

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

Теперь приложение Gunicorn готово. Настройте Nginx для передачи запросов на сокет.

Конфигурационный файл Nginx

Откройте стандартный конфигурационный файл Nginx:

sudo nano /etc/nginx/nginx.conf

Найдите пустой блок server:

http {
. . .
include /etc/nginx/conf.d/*.conf;
server {
}
server {
listen 80 default_server;
. . .

В этом блоке можно задать все параметры приложения Django. Укажите порт, который нужно прослушивать, и доменное имя или 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 / {} для всех остальных запросов. Добавьте в него стандартные заголовки проксирования HTTP. Направьте трафик на сокет 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 / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unix:/home/user/myproject/myproject.so
ck;
}
}

Сохраните и закройте файл.

Настройка привилегий

Пользователь nginx должен иметь доступ к каталогу приложения. По умолчанию CentOS блокирует домашние каталоги пользователей. Потому нужно добавить пользователя nginx в группу сетевого пользователя, которому принадлежат права на приложение.

Для этого используйте команду:

sudo usermod -a -G user nginx

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

Проверьте синтаксис на наличие ошибок.

sudo nginx -t

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

chmod 710 /home/user

Проверьте синтаксис на наличие ошибок.

sudo nginx -t

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

sudo service nginx restart

Запустите сервис Nginx:

sudo systemctl enable nginx

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

Заключение

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

Tags: , , , , ,

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

  • Vitaly Kholodov says:

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

  • kolya says:

    Все понятно , но только почему когда я запускаю в браузере у меня ”

    502 Bad Gateway” ( Все проверил перезагрузил , запустил , все ок.. но ошибка)

    • omar khalid says:

      Проверьте поле пользователя в первой строке файла /etc/nginx/nginx.conf. По умолчанию это apache или www-data. Измените имя на пользователя /etc/nginx/nginx.conf в файле nginx.conf, если вы вошли в систему как user. Если не помогло проверьте файл /var/log/nginx/error.log

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