Опубликовано Оставить комментарий

Как выбрать и настроить хостинг для Python-скриптов и веб-приложений

PYTHON Hosting Providers.

Python (Пайтон) — это мощный и универсальный язык программирования, который используется для разработки программ различного назначения. Он достаточно популярен как среди новичков, так и среди опытных разработчиков. Python применяется в трех основных направлениях: разработка веб-сайтов, машинное обучение и автоматизация процессов. Этот язык кроссплатформенный, что позволяет запускать его на различных операционных системах.

Кому читать эту статью:

  • Студенты курсов по Python: Часто учебные курсы не охватывают аспекты развертывания приложений в продакшене. Эта статья поможет понять, как запустить ваши программы на реальных серверах.
  • Заказчики программ на Python: Если вы столкнулись с проблемой запуска заказанного у программиста приложения и не получили понятных инструкций, эта статья поможет вам разобраться с основными этапами развертывания.

Кому не читать эту статью:

  • DevOps-инженеры: Если вы знаете, что такое Docker и бессерверные решения, то эта статья не предоставит вам новой информации.

Варианты развертывания приложений на Python

Настройка окружения для разработки и запуска веб-приложений на Python может быть сложной задачей, особенно если у вас ограниченный опыт в управлении сервером. Рассмотрим основные типы хостингов:

  • Чистый VPS. Настройка чистого VPS вручную предоставляет максимальный контроль и гибкость. Это требует достаточно больших знаний и опыта в администрировании серверов, но позволяет полностью настроить сервер под свои нужды. Ниже, в этой статье мы рассмотрим полный пример запуска на VPS веб приложения Python Flask.
  • Виртуальный хостинг. Панели управления, такие как WHM/Cpanel и ISP Manager, поддерживают запуск Python-программ. Однако на виртуальном хостинге часто нужно писать в техподдержку для включения поддержки Python и настройки SSH-доступа. Этот вариант может быть сложным и требует частого взаимодействия с технической поддержкой хостинг провайдера.
  • VPS с панелью управления. Виртуальные частные серверы (VPS) с установленными панелями управления (например, WHM/Cpanel, ISP Manager) могут быть удобнее для запуска Python-приложений. Они предоставляют больше контроля и возможностей для настройки окружения. Если вам необходима панель для одновременного запуска не только python приложения, и других сайтов например на PHP вам следует рассмотреть этот вариант.
  • Бессерверные решения, предлагаемые облачными провайдерами (Azure, GCE, AWS), позволяют запускать приложения без необходимости управлять серверами. Это может быть экономичным вариантом при небольшой нагрузке, но стоимость может значительно вырасти с увеличением нагрузки.
  • GitOps application engines. Ряд облачных платформ (Azure, GCE, AWS, Digital Ocean) предлагают возможности развертывания приложений непосредственно из репозиториев Git. Это упрощает процесс деплоя и позволяет интегрировать CI/CD процессы.

Выбор хостинга Python

При выборе хостинга для ботов телеграмм, скриптов и Python-приложений на Flask или Django, наиболее подходящим вариантом является использование виртуального частного сервера (VPS/VDS). VPS обеспечивает высокий уровень контроля над сервером и позволяет гибко настраивать окружение для вашего приложения. Для тестирования и небольших проектов подойдет любой дешевый VPS. Это позволит вам развернуть приложение, отладить его и убедиться, что оно работает корректно.

По мере роста вашего проекта и увеличения нагрузки, вы можете переходить на более мощные тарифные планы VPS. Это позволит вам масштабировать ресурсы (процессор, оперативную память, дисковое пространство) в соответствии с потребностями вашего приложения, обеспечивая стабильную и эффективную работу. Использование VPS предоставляет гибкость и возможность плавного масштабирования, что делает его оптимальным выбором для развертывания Python-приложений на Flask и Django.

Для начальных проектов можно заказать дешевый хостинг (VPS) для Python у таких хостинг провайдеров :

  1. PQ Hosting: Тариф Aluminium (1 vCPU / 1 Gb RAM / 25 Gb NVMe). Цена 4.77 € в месяц. Промокод WOW2TOP предоставляет 15% скидки для новых клиентов.
  2. Украинский хостинг провайдер HyperHost: Тариф «VPS Доступный» (2 vCPU / 1.5 Gb RAM / 25 Gb SSD). Цена 6.96 € в месяц. На более дешевом тарифе Python запрещен. Промокод WOW2TOP предоставляет 10% скидки для новых клиентов.
  3. Friendhosting (Френдхостинг): Тариф Micro NVMe (1 vCPU / 512 mb RAM / 10 Gb NVMe). Цена 3.49 € в месяц.
  4. Облачный провайдер DigitalOcean: Тариф в разделе Basic Droplets (1 vCPU / 512 RAM / 10 Gb SSD). Цена начинается от 6 долларов в месяц, но учтите для граждан Украины цена на 20% больше из-за НДС введенного в 2022 году.

Если ваш проект становится более сложным и требует высокой производительности, рекомендуется перейти на тарифы VPS с улучшенными характеристиками и поддержкой. Подробнее о выборе подходящего VPS/VDS -тарифа вы можете узнать на нашей странице выбора VPS.

Пример запуска приложения Python Flask на VPS

В начальном разделе мы рассмотрим, как сконфигурировать Linux среду для работы с Python и добавить поддержку Flask. Если мне приходится настраивать сервер из под Windows, использую SSH клиента MobaXterm, потому что он дополнительно устанавливает подключение по протоколу SFTP, что позволяет копировать файлы на удаленный сервер. Если проект большой используйте для копирования файлов проекта FileZilla (в режиме SFTP).

Шаг 1: Как работает веб-стек для Python-приложений

Gunicorn — это легковесный веб-сервер, предназначенный для запуска и создания нескольких рабочих процессов (воркеров) нашего Python-приложения. Перед ним стоит Nginx, который обслуживает статические файлы (css, js, png и т.д.) напрямую, а запросы к динамическому контенту перенаправляет на Gunicorn. Gunicorn передает запросы нашему приложению через стандарт WSGI.

  1. Nginx: Принимает HTTP-запрос от клиента и передает его на Gunicorn.
  2. Gunicorn: Получает запрос от Nginx и использует WSGI для передачи его в Python-приложение.
  3. WSGI: Интерфейс, через который Gunicorn взаимодействует с Python-приложением, передавая ему запрос.
  4. Python: Обрабатывает запрос, взаимодействует с бизнес-логикой и возвращает ответ через WSGI.
  5. Gunicorn: Получает ответ от Python-приложения и передает его обратно Nginx.
  6. Nginx: Отправляет окончательный ответ клиенту.
Diagram of how the Nginx Gunicorn WSGI Python stack works.

Шаг 2: Как сконфигурировать Linux среду для работы с Python

Итак, мы получили от хостера root доступ к чистому VPS. Обычно на VPS кроме демона SSH ничего нет. Заходим на сервер по SSH, обновляем операционную систему и если нужно перегружаем VPS:

apt update
apt full-upgrade
reboot

Проверяем установлен pip или нет:

pip --version
pip 24.0 from /usr/local/lib/python3.10/dist-packages/pip (python 3.10)

Как видим, у меня pip уже установлен, если нет — нужно выполнить команду ниже. И давайте сразу установим зависимости, которые нам нужны для будущей настройки и запуска Flask:

apt install python3-venv python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools

Даже если вы только что установили Python какие-то пакеты будут в системе по умолчанию. Проверяем какие пакеты установлены в python:

pip list
...
[notice] A new release of pip is available: 23.3.1 -> 24.0
[notice] To update, run: python3 -m pip install --upgrade pip

Как видно в листинге выше, мне предлагают обновить pip, обновим его, рекомендуемой командой:

python3 -m pip install --upgrade pip

Шаг 3: Создания пользователя

Нам нужно создать пользователя от которого будет запускаться наше python приложение. Зададим ему системной оболочкой bash (мне так привычней) и установим пароль:

adduser  --shell /bin/bash diegdev

Adding user `diegdev' ...
Adding new group `diegdev' (1004) ...
Adding new user `diegdev' (1004) with group `diegdev' ...
Creating home directory `/home/diegdev' ...
Copying files from `/etc/skel' ...
New password:
Is the information correct? [Y/n] y

Добавим пользователя в группу sudo, чтобы у него был возможность получать привилегии суперпользователя (root):

usermod -aG sudo diegdev

Вы сейчас находитесь под root. И если вам нужно переключиться на нового пользователя diegdev и сразу перейти в его домашний каталог, используйте команду su. Можно без дефиса, но тогда вам дополнительно придется набрать команду cd, чтобы попасть в домашнюю папку.

su - diegdev

Шаг 4: Что такое виртуальная среда Python

Для запуска Python скриптов или веб приложений (Flask, Django) рекомендуется всегда использовать виртуальное окружение. Создавать их можно разными способами, например с помощью: venv, pyenv, virtualenv, anaconda.

Мы будем использовать модуль venv, который поддерживает создание облегченных “виртуальных сред”, каждая из которых имеет свой собственный независимый набор пакетов Python, установленных в каталоге вашего сайта. Виртуальная среда создается поверх существующей установки Python, известной как “базовый” Python, и при желании может быть изолирована от пакетов в базовой среде. Поэтому вашему приложению доступны только те пакеты, которые явно установлены в виртуальной среде. При использовании из виртуальной среды обычные средства установки, такие как pip, будут устанавливать пакеты Python в виртуальную среду без необходимости явного указания на это.

Модуль venv, мы установили выше как зависимость, если вы этого не сделали, запустите установку:

apt install python3-venv

Шаг 5: Загрузим приложение Python на хостинг

До этого этапа мы все настройки производили из под пользователя root. Но теперь вы можете передать программисту вашего проекта SSH доступ от пользователя diegdev и пусть он зальет файлы проекта.

Для загрузки проекта на сервер есть три основных способа:

  1. загрузка через протоколы передачи файлов (FTP, FTPS, SFTP);
  2. использование git-репозитория;
  3. деплой проекта с помощью инструментов, встроенных в IDE, с которой вы работаете.

Я для загрузки файлов буду использовать SSH клиента MobaXterm, вы можете использовать например FileZilla (в режиме подключения SFTP). На скриншоте я показал, как загрузить архив приложения на сервер под пользователем diegdev используя MobaXterm.

Как загрузить сайт на python на сервер.

Мой проект содержит 2 файла, права принадлежат пользователю diegdev и расположен в директории /home/diegdev/diegapp:

ls -l /home/diegdev/diegapp

-rw-rw-r-- 1 diegdev diegdev 193 Jun 16 18:25 myapp.py
-rw-rw-r-- 1 diegdev diegdev 109 Jun 13 15:46 requirements.txt

Шаг 6: Настраиваем виртуальную среду

Модуль venv мы установили выше и я объяснил для чего он нужен.

Далее под пользователем diegdev переходим в ранее созданный каталог проекта и создаем виртуальную среду проекта.

/home/diegdev/diegapp
python3 -m venv diegappenv

Активируем среду, используя утилиту source. Как видите строка приглашение bash изменилась, добавилось в круглых скобках название созданной выше виртуальной среды Python.

diegdev@wiki:~/diegapp$ source diegappenv/bin/activate
(diegappenv) diegdev@wiki:~/diegapp$

Чтобы выйти из этого режима используйте команду deactivate, после ввода ее любые команды Python снова будут использовать системную среду Python. Не забываем, что запускать наше приложение нужно только из виртуальной среды.

deactivate

Шаг 7: Установка пакетов зависимостей requirements.txt

Когда проект готов, программист должен был создать список зависимостей вашего проекта и поместить в файл requirements.txt. Если он не знает как создать файл requirements.txt (в моей практике было и такое) вышлите ему ссылку на эту статью.

Для создания requirements.txt используйте модуль Freeze. В ниже приведённой команде укажите правильный путь для сохранения файла. В файле requirements.txt теперь лежит список всех установленных пакетов и их версии, которые использует ваш проект.

python -m pip freeze > projects/your_project/requirements.txt

Выполним команду для установки зависимостей из файла requirements.txt:

pip install -r requirements.txt
pip install requirements.txt

Чтобы проверить, какие пакеты установились выполните команду:

(diegappenv) diegdev@wiki:~/diegapp$ python -m pip list
Package      Version
------------ -------
blinker      1.8.2
click        8.1.7
Flask        3.0.3
itsdangerous 2.2.0
Jinja2       3.1.4
MarkupSafe   2.1.5
pip          22.0.2
setuptools   59.6.0
Werkzeug     3.0.3

Шаг 8: Установка пакетов Gunicorn и Flask

Gunicorn может быть установлен в операционной системе, но я настоятельно рекомендую устанавливать через pip в виртуальной среде. Далее устанавливаем Gunicorn и Flask:

(diegappenv) diegdev@wiki:~/diegapp$ pip install gunicorn flask

Шаг 9: Создание точки входа WSGI

Содержимое файла myapp.py:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1 style='color:green'>Hosting Consultant</h1>Leave a review on the site <a href='https://dieg.info' target='_blank'>dieg.info</a>, it will help others!</li>"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

Допустим главный файл вашего приложения называется myapp.py и вы находитесь с ним в одной директории. Протестируем его работу на прямую без Gunicorn.

(diegappenv) diegdev@wiki:~/diegapp$ python myapp.py

Если ошибок нет и вы можете открыть в браузере свое приложение создадим файл wsgi.py в корне директории diegapp, который будет работать в качестве точки входа для нашего flask приложения. Она необходима для сервера Gunicorn, чтобы взаимодействовать с приложением. Мой wsgi.py содержит такой код:

from myapp import app

if __name__ == "__main__":
    app.run()

Проверим, что Gunicorn может правильно работать в связке с приложением. Для этого необходимо запустить команду:

(diegappenv) diegdev@wiki:~/diegapp$ gunicorn --bind 0.0.0.0:7777 wsgi:app

В результате мы должны получить следующие сообщения, а в браузере при переходе по вашему ip и порту 7777 вы увидите ваш работающий сайт на Flask.

(diegappenv) diegdev@wiki:~/diegapp$ gunicorn --workers 3 --bind 0.0.0.0:7777 wsgi:app
[2024-06-16 21:40:01 +0300] [11395] [INFO] Starting gunicorn 22.0.0
[2024-06-16 21:40:01 +0300] [11395] [INFO] Listening at: http://0.0.0.0:7777 (11395)
[2024-06-16 21:40:01 +0300] [11395] [INFO] Using worker: sync
[2024-06-16 21:40:01 +0300] [11396] [INFO] Booting worker with pid: 11396

Если все заработало, то нажмите CTRL+C в окне терминала, чтобы остановить gunicorn. Далее переходите к следующему шагу.

Ниже немножко дополнительной информации к запуску веб сервера Gunicorn. Ключи запуска:

  • Ключ -w или —workers означает количество воркеров. Gunicorn — это серьёзный веб-сервер, рассчитанный на большую нагрузку. Он умеет обрабатывать несколько запросов одновременно благодаря своей архитектуре. У Gunicorn есть главный процесс, который управляет набором рабочих процессов — воркеров. Главный процесс только распределяет запросы от клиентов сайта, а обрабатывают их воркеры. Одного воркера мало, чтобы разогнать Gunicorn по максимуму. Это всё из-за того, что воркеру мешают операции ввода/вывода, из за которых Python засыпает и ждёт ответа. Если воркеров будет мало, сервер работает не в полную силу, а если слишком много — тормозит. Число воркеров зависит от ядер процессора и посмотреть их количество можно утилитой nproc. Документация Gunicorn советует придерживаться такой формулы: N воркеров = Количество ядер x 2 + 1. То есть для VPS с двумя ядрами получаем 5 воркеров. Если у процессора 1 ядро, то по формуле получаем 3 воркера.
  • Ключ -b или —bind означает “привязка” к определённому IP-адресу вашего VPS и порту. Можно запустить веб-сервер также локально на адресе 127.0.0.1, либо на всех сетевых интерфейсах сразу через 0.0.0.0.
  • 7777 номер порта, на котором работает ваше приложение. Соответственно в браузере вы его должны задать явно, например, если ваш IP на VPS 10.10.10.10, тогда в браузере нужно ввести http://10.10.10.10:7777
  • wsgi — название вашего скрипта без .py, а app — название функции. Так вы укажете Gunicorn, где искать функцию, которая обработает запрос браузера.

Для запуска gunicorn, вы также можете использовать варианта с sock, это экономит ресурсы VPS не занимая порты. Но это уже на ваше усмотрение, в этом руководстве используйте ip и порт. Строка запуска с sock будет выглядеть так:

gunicorn --workers 3 --bind unix:diegapp.sock -m 007 wsgi:app

Для проверки корректной работы вашего приложения используйте утилиту curl:

curl --unix-socket /home/diegdev/diegapp.sock localhost

Шаг 10: Настройка автоматического запуска Gunicorn

Настройка автоматического запуска Gunicorn через systemd выходит за рамки этой статьи. Мы используем возможности самого сервера Gunicorn для запуска в фоновом режиме.

Запустим его как демон используя ключ D. Там же укажем, чтобы ваше приложение обрабатывало запросы только на локалхост (порт 7777) — это запретит злоумышленникам получить доступ к нашему серверу.

gunicorn -D --workers 3 --bind 127.0.0.1:7777 wsgi:app

В командной строке ничего не должно появиться, в отличие от обычного запуска. Чтобы убедиться в том, что gunicorn запущен и работает используйте утилиту ps и вы увидите 4 запущенных процесса:

ps -ef | grep gunicorn
...
diegdev    11570   11569  0 21:55 ?        00:00:00 /home/diegdev/diegapp/diegappenv/bin/python3 /home/diegdev/diegapp/diegappenv/bin/gunicorn -D --workers 3 --bind 127.0.0.1:7777 wsgi:app
...

Шаг 11: Настройка nginx proxy для приложения Flask

Устанавливаем Nginx:

sudo apt install nginx

Далее настраиваем виртуальный домен, в нашем пример dieg.dev.

sudo nano /etc/nginx/sites-available/dieg.dev.conf

Файл dieg.dev.conf минимально должен содержать такие строки:

server {
    listen 80;
    server_name dieg.dev;

    location / {
        include proxy_params;
        proxy_pass http://127.0.0.1:7777;
    }
}

Далее включаем наш домен в Nginx при помощи создания символической ссылки на файл. Проверяем на ошибки и перезапускаем Nginx.

sudo ln -s /etc/nginx/sites-available/dieg.dev.conf /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

Всё! Теперь ваше приложение доступно всему миру.

Для соответствия стандартам безопасности, желательно установить бесплатный SSL сертификат. Установка SSL Let’s Encrypt выходит за рамки этой статьи, но не должна вызвать у вас трудностей. Вам нужно установить программу certbot. Приведу кратко команды для нашего примера с доменом dieg.dev:

sudo apt install python3-certbot-nginx
sudo certbot --nginx -d dieg.dev

Отвечаем на вопросы последней команды. В результате настройки виртуального домена в Nginx будут изменены, Nginx автоматически будет перезагружен и вы в браузере увидите значок защищенного соединения у сайта.

Заключение

Вы должны понимать, что развёртывание Python-приложений требует более глубоких знаний от разработчика, чем, например, PHP-хостинг с сайтом на WordPress. Не каждая техническая поддержка выбранного вами хостинг-провайдера возьмётся запускать ваше Python-приложение, а тем более оптимизировать его производительность. В контексте приведенного примера, минимум, что нужно сделать, это настроить Nginx для обслуживания статических файлов, установить SSL-сертификат и определить оптимальное количество воркеров для Nginx и Gunicorn в зависимости от характеристик вашей VPS/VDS. Для успешного развертывания и работы ваших Python-приложений, рассмотрите использование проверенных VPS/VDS хостинг-провайдеров.

Ценообразование для хостинга Python: если вы погуглите распространенный вопрос о стоимости размещения Telegram-бота на Python, потребляющего 300 МБ ОЗУ, вы не найдете конкретного ответа в интернет. Надеюсь, моя статья подсказала вам, почему такого ответа нет.

Dmytro Yakovenko
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *