DEV Community

Danil Poletavkin
Danil Poletavkin

Posted on

Инструкция по развёртыванию приложения Django Python3 на веб сервере Apache для операционной системы CentOS 7

Инструкция написана начинающим пользователем систем Linux и неспециалистом по программам Apache и Django
В данной инструкции использовались следующие версии пакетов:
python3-pip-9.0.3-8.el7
httpd-2.4.6-97.el7.centos.5
python3-mod_wsgi-4.7.1-2.el7
django 2.1.13

Замечания

  • Изменить уровень служебных сообщений журнала в файле httpd.conf на LogLevel info чтобы видеть ошибки
  • Важно, чтобы у всех необходимых для apache директорий был доступ o+rx. Раз доступ есть у пользователей не относящихся к группе, добавлять пользователя apache в какую-либо группу не нужно (например в руководстве How To Serve Django Applications with Apache and mod_wsgi on CentOS 7 | DigitalOcean излишне указано, что пользователь apache должен быть добавлен в группу пользователя системы)
  • Служба SELinux может блокировать доступ apache к необходимым файлам. Один из вариантов отключить SELinux, а лучше настроить её для работы с apache
  • Внимательно подойти к созданию файла конфигурации [имя файла].conf. Рабочий пример с комментариями django.conf
  • Убедиться, что версия mod_wsgi соответствует версии python при помощи которой создаётся проект django и виртуальная среда. Например для версии Python3.x это будет mod_wsgi.4.x.x

Порядок действий

Все команды рекомендуется запускать из-под учётной записи пользователя, а не администратора. Далее все адреса к директориям и файлам указаны относительно домашней директории пользователя

Django

1. Установить python3-pip. Пакеты python относятся к python версии 2, а пакеты python3 - к python версии 3
sudo yum install python3-pip
2. Установить пакет для создания виртуальных сред virtualenv.
sudo pip3 install virtualenv
3. Находясь в директории пользователя создать виртуальную среду
virutalenv [имя среды, например 'venv']
Будет создана директория venv
4. Активировать виртуальную среду
source venv/bin/activate
5. Установить django. Так как это общий пример, будем использовать провайдера базы данных по умолчанию, это sqlite. На момент написания инструкции при установке django последней версии возникает ошибка о том, что установлена устаревшая версия sqlite и требуется версия не ниже 3.8.x. Так как это ознакомительная инструкция, будем использовать версию django 2.1.x, например 2.1.13. В реальном приложении вероятно, что будет использоваться другой провайдер базы данных.
pip3 install django==2.1.13
6. Создать новый проект django
django-admin startproject [имя проекта, например 'myproject']
7. В файле myproject/myproject/settings.py указать, с каких адресов будет разрешён вызов приложения django. Для примера разрешим вызов со всех адресов
ALLOWED_HOSTS = ['*']
8. Создадим и применим миграции базы данных
myproject/manage.py makemigrations
myproject/manage.py migrate
9. Запустим приложение, используя порт 8000
myproject/manage.py runserver 0.0.0.0:8000
10. Так как система без графического интерфейса, для того, чтобы посмотреть веб-страницу нашего django-проекта используем программу lynx с другого окна терминала
sudo yum install lynx
lynxhttp://0.0.0.0:8000
11. Остановим приложение
12. Этот шаг понадобится для доступа к приложению через apache. Для того, чтобы apache мог запустить наше приложение, понадобятся статические файлы, которые необходимо собрать с отдельную папку командой collectstatic. Прежде, чем это сделать, нужно указать django в какую именно папку собирать статические файлы. Для этого нужно добавить следующую строку в файл myproject/myproject/settings.py STATIC_ROOT=os.path.join(BASE_DIR,'static/')
13. Теперь соберём статические файлы
myproject/manage.py collectstatic
Важно запускать эту команду из активной виртуальной среды После выполнения команды в директории ~/myproject/ появится новая папка static
14. Можно деактивировать виртуальную среду
deactivate

Apache

  • В CentOS главная служба Apache называется httpd.
  • При установке по умолчанию главный файл конфигурации размещается по адресу /etc/httpd/conf/httpd.conf
  • Дополнительные файлы конфигурации, которые создаются для веб-приложений размещаются по адресу /etc/httpd/conf.d/. Команды из этих файлов переопределяют команды главного файла /etc/httpd/conf/httpd.conf
  • Для того, чтобы видеть подробные сообщения об ошибках, в файле httpd.conf нужно изменить уровень сообщений журнала с LogLevel warn на LogLevel info. В этом же файле указано, по какому адресу находится журнал с сообщениями об ошибках, по умолчанию это файл /etc/httpd/logs/error_log

1. Установить пакет apache
sudo yum install httpd
2. Проверим работу службы httpd.
Для этого сначала откроем порт 80 для внешних соединений по протоколу tcp
sudo firewall-cmd --permanent --add-port=80/tcp
включим службу http файервола
sudo firewall-cmd --permanent --add-service=http
перезапустим файерволл
sudo firewall-cmd --reload
теперь запустим apache
sudo systemctl start httpd
После этого при переходе по адресу сервера должна отобразиться приветственная страница
3. Установить пакет mod_wsgi. WSGI - это модуль, который позволяет apache обрабатывать приложения python. Как сказано в замечаниях, версия модуля должна соответствовать версии python, при помощи которой создавался проект django
sudo yum install python3-mod_wsgi
Если появляется сообщение, что пакет не найден, то установить пакет rh-python36-mod_wsgi
sudo yum install rh-python36-mod_wsgi
4. Проверим, что модуль mod_wsgi установился в папку модулей apache.
ls -l /usr/lib64/httpd/modules
В списке должен присутствовать файл mod_wsgi_python3.so. Этот модуль apache будет использовать при обработке конфигурационного файла для приложения django, который мы создадим далее
5. Откроем доступ сторонним пользователям к папкам проекта, для того, чтобы apache был способен использовать все необходимые файлы (реальный проект рекомендуется создавать в отдельной папке вне домашней директории пользователя)
sudo chmod -R o+rx /home/[пользователь]/myproject/myproject/wsgi.py
sudo chmod -R o+rx /home/[пользователь]/venv/lib/python3.6/site-packages
Чтобы проверить права доступа к папкам можно использовать команды
namei -l /home/[пользователь]/myproject/myproject/wsgi.py
namei -l /home/[пользователь]/venv/lib/python3.6/site-packages
Эта команда отобразит все папки по пути к конечному пункту. У всех директорий права доступа других пользователей должны быть r-x. Если команда chmod -R не сработала для директории /home/[пользователь] то изменить права доступа отдельно для этой директории. Также проверить права доступа у файла wsgi.py
6. Отключить selinux (если знаете как, то лучше не отключать, а настроить для работы с apache). Конфигурация SELinux располагается в файле /etc/selinux/config, в комментариях этого файла указано как отключить службу. Статус службы можно посмотреть командой
sestatus
7. Перезагрузить компьютер чтобы изменения SELinux вступили в силу
sudo reboot
После перезагрузки команда sestatus должна показывать disabled
8. Очистить (удалить содержимое) файл /etc/httpd/conf.d/welcome.conf. Этот файл используется apache для отображения приветственной страницы
9. Создать файл /etc/httpd/conf.d/[имя файла, например 'django'].conf
sudo touch /etc/httpd/conf.d/django.conf
и вставить в него содержимое файла django.conf. Заменить [имя пользователя] на текущее[django.conf]
10. Запустить службу httpd
sudo systemctl restart httpd
После выполненных действий по адресу сервера должна отображаться приветственная страница django

Top comments (0)