Как настроить связь Django с веб-сервером
Большое количество языков разработки веб-приложений привело к снижению эффективности взаимодействия последних с веб-серверами посредством стандартных общих интерфейсов, например, таких, как CGI, FastCGI и других подобных. Поддержка серверов WSGI некоторыми из фреймворков, в частности, Django позволяет устранить существующие недостатки и, соответственно, повысить качество работы веб-приложений. Как установить Django мы рассматривали ранее.
Далее рассмотрим правильной настройки интерфейса взаимодействия между фреймворком и веб-сервером
Общие принципы взаимодействия компонентов и их характеристики
Веб-фреймворки призваны обеспечивать разработку и функционирование сайтов и приложений, но они не адаптированы к выполнению некоторых видов специфических задач, в частности, заниматься приёмом, обработкой и маршрутизацией большого количества запросов с веб-сервера. Для выполнения этих и подобных задач разработаны специальные сервера, берущие на себя все вопросы согласования работы веб-сервера и приложения.
Одним из таких серверов является WSGI (Web-Server Gateway Interface), выполняющий множество посреднических функций между веб-сервером и приложением, написанным на языке Python. Какие конкретно функции берёт на себя указанный компонент, зависит от типа его реализации, которых в мире существует множество. Наиболее известные из них: uWSGI, mod_wsgi, Gunicorn, CherryPy.
На данный момент создано несколько фреймворков, поддерживающих работу с WSGI. Одним из них является Django, в котором, начиная с версии 1.4, модуль WSGI создаётся автоматически при развёртывании системы. Для обеспечения эффективной работы системы необходимо подбирать связку компонентов в конфигурации системы. Выбираться должна как реализация WSGI-сервера, так и веб-сервер, с которым будет работать WSGI. Наиболее популярны следующие связки компонентов:
• Nginx <-> uWSGI;
• Nginx <-> Gunicorn.
Рассмотрим кратко эти компоненты.
Сервер uWSGI
Сервер uWSGI был разработан одной из итальянских компаний и предназначался для обеспечения полного цикла работы веб-хостинга. Со временем проект стал расширяться, и сейчас, кроме языка Python он также поддерживает языки Perl, Lua и некоторые другие из интерпретируемых языков.
Сервер Gunicorn
Сервер Gunicorn изначально был ориентирован на работу в UNIX-подобных системах в качестве http-сервера – посредника между приложением и веб-сервером. Часто его используют совместно с Nginx.
Nginx является высокопроизводительным http-сервером, также выполняющим функции обратного прокси и почтового сервера. Скорость работы и ресурсоёмкость позволяют использовать его в качестве фронтэнда для более мощных веб-серверов. В такой связке Nginx выполняет роль распределителя между веб-клиентом и несколькими серверами. В связке с сервером Gunicorn он обычно выполняет функции обратного прокси-сервера.
Ниже будет рассмотрена настройка взаимодействия между веб-сервером и программным окружением Django посредством связки Nginx <-> uWSGI.
Практическая реализация конфигурации программной среды для веб-приложения Django
Перед использованием любой из реализаций WSGI для настройки взаимодействия приложения с веб-сервером, нужно выполнить базовые установки и настройки программного окружения приложения Django. Перечислим пошагово эти действия в порядке последовательности их выполнения:
• Установка программной среды Python и активация виртуального окружения;
• Развёртывание фреймворка Django в созданной среде;
• Базовая установка веб-сервера Nginx.
Отметим, что способ реализации указанных шагов зависит от типа и версии операционной системы (ОС), установленной на сервере. Будем исходить из того, что на нашем сервере установлена ОС Debian/Ubuntu и язык Python версии 3.8.
Установка программной среды Python
Для реализации этого шага в терминале следует выполнить ряд следующих команд(детально здесь):
Инсталляция программных пакетов для формирования виртуального окружения Python
$ sudo apt install python3.8-venv
Создание каталога(прим.)
$ mkdir djangogirls
Переход в каталог
$ cd djangogirls
Создание каталога виртуального окружения
$ python3 -m venv myvenv
Активация виртуального окружения
$ source myvenv/bin/activate
Развёртывание фреймворка Django
Перечислим команды, которые нужно будет ввести в терминале:
Установка менеджера пакетов Pip необходимого для установки и развёртывания Django
$ apt install python3-pip
Установка Django, где файл requirements.txt содержит название версии программы
$ pip install -r requirements.txt
Создание структуры файлов и каталогов для нового проекта с именем mysite
$ django-admin startproject mysite
Проверка работоспособности проекта mysite
$ python manage.py runserver 0.0.0.0:8000
Базовая установка веб-сервера Nginx.
Ниже приведены соответствующие команды.
Установка сервера
$ sudo apt install nginx
Запуск сервера
$ sudo /etc/init.d/nginx start # start nginx
Для проверки работоспособности сервера и, соответственно, надёжности работы связки веб-клиент <-> веб-сервер достаточно открыть Nginx в браузере через 80-й порт. При этом должно появиться сообщение: «Добро пожаловать в Nginx!». Если появилось, значит всё в порядке – сервер работоспособный.
Следующие шаги по настройке программной среды будут зависеть от типа реализации WSGI сервера. Рассмотрим их.
Метод nginx+uwsgi
Для реализации данной связки компонентов нужно будет выполнить ряд следующих действий:
• Локальная установка uWSGI в каталог виртуального окружения;
• Настройка сервера Nginx для нашего сайта;
• Корректировка установок Django;
• Проверка работы с файлами сервера Nginx;
• Настройка системы на использование сокетов Unix;
• Проверка работоспособности связки установленных компонентов;
• Настройка uWSGI.
Локальная установка uWSGI в каталог виртуального окружения. Произведём установку пакета uWSGI в каталог djangogirls. Для этого мы должны ввести в терминале:
Переход в каталог
$ cd djangogirls
Установка uWSGI
$ pip install uwsgi
Запуск проекта mysite с помощью uWSGI с использованием порта 8000
$ uwsgi --http :8000 --module mysite.wsgi
Для проверки достаточно направить браузер на сервер, введя в его адресной строке следующий адрес:
http://mydoman.com:8000, где mydoman.com – доменное имя нашего сервера.
Если сайт появляется, то это означает, что связка веб-клиент <-> uWSGI <-> Django работоспособна.
Настройка сервера Nginx для нашего сайта. Создадим файл и поместим в него директивы, приведённые ниже. Для этого введём в терминале:
$ nano mysite_nginx.conf
В открывшийся новый файл запишем следующее:
1. # mysite_nginx.conf
2.
3. # the upstream component nginx needs to connect to
4. upstream django {
5. # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
6. server 127.0.0.1:8001; # for a web port socket (we'll use this first)
7. }
8.
9. # configuration of the server
10. server {
11. # the port your site will be served on
12. listen 8000;
13. # the domain name it will serve for
14. server_name mydoman.com; # substitute your machine's IP address or FQDN
15. charset utf-8;
16.
17. # max upload size
18. client_max_body_size 75M; # adjust to taste
19.
20. # Django media
21. location /media {
22. alias /path/to/your/mysite/media; # your Django project's media files - amend as required
23. }
24.
25. location /static {
26. alias /path/to/your/mysite/static; # your Django project's static files - amend as required
27. }
28.
29. # Finally, send all non-media requests to the Django server.
30. location / {
31. uwsgi_pass django;
32. include /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed
33. }
34. }
После этого сохраним изменения, закроем файл и поместим его в каталог /etc/nginx/sites-available/.
Записанные директивы предписывают серверу загружать статические и мультимедийные файлы и обрабатывать запросы, связанные с Django. Для крупных проектов могут устанавливаться два веб-сервера: один для обработки файлов, а другой – для обслуживания приложений Django.
Для того, чтобы установленный веб-сервер смог увидеть созданный файл, установим ссылку на него из /etc/nginx/sites-enabled:
$ sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/
Корректировка установок Django.
Перед запуском настроенного нами веб-сервера необходимо собрать все статические файлы в постоянный каталог. Для этого достаточно отредактировать файл установок Django. Введём в терминале:
$ nano mysite/settings.py
В открывшемся файле установок изменим значение соответствующего параметра, сохраним изменения и закроем файл:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
После этого введём в терминале команду:
$ python manage.py collectstatic
Таким образом, все статические файлы будут собраны воедино.
Проверка работы с файлами сервера Nginx.
Протестируем сервер на корректность обработки файлов. Для этого создадим файл с именем test.png в директории media:
$ nano /path/to/your/project/project/media/test.png
Сохраним файл и перезагрузим сервер:
$ sudo /etc/init.d/nginx restart
После чего введём в адресной строке браузера:
http://mydoman.com:8000/media/test.png
Если содержимое файла отобразится, то это будет означать, что наш веб-сервер способен обеспечивать корректный файловый сервис.
Настройка системы на использование сокетов Unix
Целесообразно использование сокетов Unix вместо сокетов портов TCP, которые мы использовали до этого. Для того, чтобы это настроить, достаточно отредактировать файл mysite_nginx.conf . Введём команду вызова редактора файлов:
$ nano /etc/nginx/sites-available/mysite_nginx.conf
В открывшемся содержимом файла нужно раскомментировать следующую строку: и закомментировать строку: server 127.0.0.1:8001. После чего сохранить изменения и закрыть файл.
server unix:///path/to/your/mysite/mysite.sock
Теперь следует перезагрузить сервер с помощью команды:
$ sudo /etc/init.d/nginx restart
Для корректной работы сокетов, возможно, понадобится выполнить дополнительные настройки, например, добавить пользователей сервера в группу nginx, а также установить необходимые разрешения для сокета, чтобы сервер мог его использовать. Также, возможно, придётся проанализировать содержимое журнала ошибок nginx. Но, в любом случае, всё это устранимо.
Проверка работоспособности связки установленных компонентов. Теперь запустим наш проект Django с использованием установленных компонентов nginx и uwsgi:
$ uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666
Результат проверим в браузере:
http://mydoman.com:8000/
Если сайт отображается, то это означает, что связка:
веб-клиент <-> веб-сервер <-> socket <-> uWSGI <-> Python/Django - работоспособна, что нам и нужно.
Настройка uWSGI для использования файла .ini
Это удобный способ управлять конфигурацией, варьируя параметры в файле .ini. Для настройки такой возможности создадим .ini файл и поместим туда нужные параметры:
$ nano mysite_uwsgi.ini
Во вновь созданный файл вставим следующие строки:
1. # mysite_uwsgi.ini file
2. [uwsgi]
3.
4. # Django-related settings
5. # the base directory (full path)
6. chdir = /path/to/your/project
7. # Django's wsgi file
8. module = project.wsgi
9. # the virtualenv (full path)
10. home = /path/to/virtualenv
11.
12. # process-related settings
13. # master
14. master = true
15. # maximum number of worker processes
16. processes = 10
17. # the socket (use the full path to be safe
18. socket = /path/to/your/project/mysite.sock
19. # ... with appropriate permissions - may be needed
20. # chmod-socket = 664
21. # clear environment on exit
22. vacuum = true
Сохраним изменения и закроем файл.
Теперь можно использовать созданный файл .ini для запуска проекта:
$ uwsgi --ini mysite_uwsgi.ini # the --ini option is used to specify a file
Сервер uWSGI нами был установлен в пределах каталога виртуального кружения. Для его установки в пределах всей системы нужно выполнить следующие действия:
Отключение виртуального сервера
$ deactivate $ sudo pip install uwsgi # Or install LTS (long term support).
$ pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz
Существует ещё немало возможностей для настройки сервера uWSGI под свои нужды. Это касается как режимов его работы, так и управления загрузкой. Однако в пределах одной статьи все их рассмотреть не представляется возможным. Для этой цели лучше обратиться к документации по данному серверу.