Як налаштувати зв'язок 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 під свої потреби. Це стосується як режимів роботи, так і управління завантаженням. Однак у межах однієї статті всі їх розглянути неможливо. Для цього краще звернутися до документації по даному серверу.