В этой статье мы покажем, как настроить сервер с Ubuntu 20.04, установить и настроить компоненты, необходимые для развертывания приложений Python. Настроим WSGI-сервер Gunicorn для взаимодействия с нашим приложением. Он предоставит нам интерфейс, обеспечивающий преобразование клиентских запросов по протоколу HTTP в вызовы Python, исполняемые приложением. Потом мы настроим Nginx как обратный прокси-сервер для Gunicorn, чтобы перенаправлять запросы на Gunicorn-сервер, а также при необходимости защитить HTTP-соединения с помощью SSL-сертификата или воспользоваться другими полезными функциями: балансировкой нагрузки, кэшированием и другими. Все эти тонкости могут оказаться полезными при настройке работы с облачными сервисами, которые предоставляет timeweb.cloud.
Для начала необходимо обновить все пакеты. Когда вы создаете новый экземпляр виртуальной машины стоит обновить ОС и её пакеты до последней версии, чтобы защитить вашу виртуальную машину от эксплойтов, а также использовать самый новый функционал ОС.
Для обновления системы воспользуемся пакетным менеджером apt
(advanced packaging tool) — утилитой для установки, обновления и удаления программных пакетов в операционных системах Linux.
Обновление происходит с помощью команды:
sudo apt update
В Ubuntu последняя версия интерпретатора Python доступна по умолчанию. Проверим версию с помощью команды:
python3 --version
Результат:
Python 3.8.10
Настроим виртуальную среду. Это позволит нашему проекту иметь свои собственные зависимости, отдельные от тех, что есть у других проектов. Устанавливаем пакет virtualenv, который позволит создавать виртуальные среды:
sudo apt-get install python3-venv python3-dev
Создаём папку для нашего проекта и перейдем в нее:
mkdir myapp
cd myapp
Создаём виртуальную среду:
python3 -m venv venv
И папку самого проекта:
mkdir app
В папке нашего проекта должно быть два объекта — app
и venv
.
Проверить это можно с помощью стандартной для Linux систем команды для просмотра содержимого каталога:
ls
myapp venv
Виртуальную среду необходимо активировать, чтобы все последующие компоненты устанавливались для проекта локально:
source venv/bin/activate
клауд
Gunicorn (Green Unicorn) — это HTTP-сервер Python WSGI для UNIX. Сервер Gunicorn легко совместим с различными веб-фреймворками, быстрый, прост в реализации, требует мало ресурсов сервера.
Установка Python Gunicorn:
pip install gunicorn
WSGI (Web Server Gateway Interface) — стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, и самим веб-сервером, например Nginx.
WSGI-сервер вызывается приложением, которое позволяет нам запускать программный код в рамках обработки запросов. Обычно программный код предоставляется как объект с именем application
в модуле Python, доступном для сервера. Стандартно в файле wsgi.py
содержится такое вызываемое приложение.
Для примера создадим такой файл с помощью текстового редактора nano:
nano wsgi.py
И поместим в него простой пример кода:
from aiohttp import web
async def index(request):
return web.Response(text="Welcome home!")
app = web.Application()
app.router.add_get('/', index)
В коде выше импортируется aiohttp. Библиотека aiohttp предоставляет асинхронный HTTP-клиент, построенный поверх asyncio. HTTP-запросы — классический пример того, что хорошо подходит для асинхронности, поскольку они предполагают ожидание ответа от сервера, в течение которого было бы удобно и эффективно выполнять другой код. Данная библиотека предоставляет возможность отправлять запросы последовательно, но не дожидаясь первого ответа, прежде чем отправлять новый. Удобно запускать серверы aiohttp за Nginx.
Запустить сервер можно с помощью команды построенной по шаблону:
gunicorn [OPTIONS] [WSGI_APP]
Где [WSGI_APP]
состоит из $(MODULE_NAME):$(VARIABLE_NAME)
, a [OPTIONS]
— набор параметров для настройки Gunicorn.
Простейшая команда будет выглядеть так:
gunicorn wsgi:app
Если потребуется перезапустить Gunicorn можно использовать команду restart gunicorn
:
sudo systemctl restart gunicorn
Systemd — менеджер системных служб, который позволяет строго управлять процессами, ресурсами и разрешениями. Создадим сокет, который systemd будет прослушивать и автоматически запускать Gunicorn в ответ на трафик.
Добавим конфигурации для службы и сокета соответственно:
sudo nano /etc/systemd/system/gunicorn.service
В этот файл с помощью текстового редактора добавим следующее:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
Type=notify
User=someuser
Group=someuser
RuntimeDirectory=gunicorn
WorkingDirectory=/home/someuser/myapp
ExecStart=/путь/до/исполняемого/файла/gunicorn wsgi:app
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
[Install]
WantedBy=multi-user.target
В строке ExecStart
необходимо указать путь до исполняемого файла gunicorn в виртуальном окружении. Вероятно, он будет выглядеть примерно так: /home/someuser/myapp/venv/bin/gunicorn
.
А в /etc/systemd/system/gunicorn.socket
добавим:
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
SocketUser=www-data
[Install]
WantedBy=sockets.target
Включаем и запускаем сокет:
systemctl enable --now gunicorn.socket
Рассмотрим полезные параметры Gunicorn в Python 3. Все возможные параметры можно посмотреть в официальной документации.
-b BIND
, --bind=BIND
— указание серверного сокета. Можно указать в форматах: $(HOST), $(HOST):$(PORT).
Например:
gunicorn --bind=127.0.0.1:8080 wsgi:app
Эта команда запустит наше приложение локально на порту 8080.
-w WORKERS
, --workers=WORKERS
— количество рабочих процессов. Обычно это число должно составлять от 2 до 4 на ядро сервера.
Пример:
gunicorn --workers=2 wsgi:app
-k WORKERCLASS
, --worker-class=WORKERCLASS
— тип рабочего процесса для запуска.
sync
— тип процесса по умолчанию. Это самый простой тип — синхронный рабочий процесс, который обрабатывает один запрос за раз. Другие типы может потребоваться устанавливать как зависимости.
Доступные асинхронные рабочие процессы основаны на Greenlets (через Eventlet и Gevent). Greenlets — это реализация совместной многопоточности для Python. Соответствующие параметры — eventlet и gevent.
Мы будем использовать асинхронный тип процесса, совместимый с aiohttp:
gunicorn wsgi:app --bind localhost:8080 --worker-class aiohttp.GunicornWebWorker
Также возможно использовать флаг --access-logfile, чтобы разрешить заполнение журнала доступа.
Например:
gunicorn wsgi:app --access-logfile access.log
С помощью такой команды можно указать журнал для логирования ошибок:
gunicorn wsgi:app --error-logfile error.log
Степень детализации выходных данных журнала ошибок можно установить с помощью флага --log-level.
При работе с log в Gunicorn доступны следующие уровни:
По умолчанию установлен уровень ‘info’, отрезающий информацию, относящуюся к ‘debug’.
Запустим команду для установки Nginx:
sudo apt install nginx
Давайте проверим сможет ли демон Nginx подключиться к созданному ранее сокету:
sudo -u www-data curl --unix-socket /run/gunicorn.sock http
Таким образом служба Gunicorn будет автоматически запущена, и мы увидим HTML-код от сервера в терминале.
Настройка Nginx происходит путем добавления конфигурационных файлов для виртуальных хостов.
Стоит хранить конфигурацию каждого прокси в директории /etc/nginx/sites-available
.
Запуск каждого из прокси серверов осуществляется через создание ссылки на него в директорию /etc/nginx/sites-enabled
. При запуске Nginx автоматически пробегается по этой директории и включает нужные прокси сервера.
Таким образом, создадим конфигурационный файл:
sudo nano /etc/nginx/sites-available/myconfig.conf
Далее создадим ссылку через команду:
sudo ln -s /etc/nginx/sites-available/myconfig.conf /etc/nginx/sites-enabled
Nginx необходимо перезапускать после любых изменений, внесенных в конфигурационный файл, чтобы новые настройки начали действовать.
Сначала проверим корректность синтаксиса в файле:
nginx -t
И перезапустим:
nginx -s reload
Разверните свое Python-приложение в облаке Timeweb Cloud
Надеемся, наш гайд по развертыванию приложений в Python оказался полезным для вас. Если остались какие-то вопросы, пишите в комментарии! Больше о Python читайте в наших инструкциях.
Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.
Если у вас что то не работает уберите home
WorkingDirectory=/home/someuser/myapp