Установка связки 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: CentOS 7, Django, Gunicorn, NGINX, PostgreSQL, WSGI
3 комментария
К сожалению, вы забыли упомянуть что нужно открыть 80 порт на сервере, я чуть не убил себя за 2 дня мучений деплоя проекта и только сегодня до меня дошла эта светлая мысль. Если тут есть модеры, впишите пожалуйста в свою статью это
Все понятно , но только почему когда я запускаю в браузере у меня ”
502 Bad Gateway” ( Все проверил перезагрузил , запустил , все ок.. но ошибка)
Проверьте поле пользователя в первой строке файла /etc/nginx/nginx.conf. По умолчанию это apache или www-data. Измените имя на пользователя /etc/nginx/nginx.conf в файле nginx.conf, если вы вошли в систему как user. Если не помогло проверьте файл /var/log/nginx/error.log