DEV Community

Danil Poletavkin
Danil Poletavkin

Posted on

1 1

Инструкция по развёртыванию приложения 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

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

While many AI coding tools operate as simple command-response systems, Qodo Gen 1.0 represents the next generation: autonomous, multi-step problem-solving agents that work alongside you.

Read full post

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay