Инструкция по развёртыванию приложения Django Python3 на веб сервере Apache для операционной системы CentOS 7
Published: 2022-07-26 05:03:00

Инструкция написана начинающим пользователем систем _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](https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-apache-and-mod_wsgi-on-centos-7) излишне указано, что пользователь _apache_ должен быть добавлен в группу пользователя системы)
- Служба _SELinux_ может блокировать доступ _apache_ к необходимым файлам. Один из вариантов отключить _SELinux_, а лучше настроить её для работы с _apache_
- Внимательно подойти к созданию файла конфигурации _\[имя файла\].conf._ Рабочий пример с комментариями [django.conf](https://yadi.sk/d/XnMw3Xfv1ra59A)
- Убедиться, что версия _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`
`lynx`[`http://0.0.0.0:8000`](http://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`
Важно запускать эту команду из активной виртуальной среды После выполнения команды в директории <span dir="">_\~_</span>_/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_](http://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](https://yadi.sk/d/XnMw3Xfv1ra59A). Заменить _\[имя пользователя\]_ на текущее[django.conf]
10\. Запустить службу _httpd_
    `sudo systemctl restart httpd`
После выполненных действий по адресу сервера должна отображаться приветственная страница _django_