conda - менеджер пакетов и для создания виртуальной среды для размещения вашего приложения на Python (например, для развертывания модели машинного обучения)

Flask - фреймворк для использования кода Python в качестве конечной точки API.

apache - интерфейсный веб-сервер, который будет обслуживать API.

mod_wsgi - пакет, который предоставляет модуль Apache, реализующий WSGI-совместимый интерфейс для размещения веб-приложений на основе Python поверх веб-сервера Apache.

Здесь мы настроим 3 примера приложений python-flask и 3 различных виртуальных среды conda. Каждое приложение будет иметь коннектор шлюза wsgi, обращающийся к нему и вызывающий приложение в нем. Затем Apache будет настроен для обращения к их соответствующим средам conda и запуска каждого приложения в одной среде и обслуживания всех из них по разным URL-адресам.

Предпосылки установки:

Есть два способа настроить mod_wsgi в конфигурации apache.

  1. Установите его как модуль apache напрямую и обслуживайте приложения в нескольких виртуальных средах conda / python.
  2. Установите и скомпилируйте его как модуль python в виртуальных средах conda / python отдельно и настройте apache для его использования.

Мы сосредоточимся на первом методе, так как он лучше всего рекомендуется для производственных сред и прост в настройке нескольких приложений, поскольку он будет доступен во всем мире.

Предварительные условия:

Установите apache и miniconda. Вы можете следить за моим постом здесь.

Установите mod_wsgi:

Здесь мы устанавливаем соответствующий пакет mod_wsgi для python 3.6.

Установите и включите соответствующий модуль apache. Вы можете найти точную версию модуля, соответствующую вашему дистрибутиву ОС, на сайте ниже.

Https://packages.ubuntu.com/bionic/libapache2-mod-wsgi-py3

(base)~/Python-3.6.5/flaskproject$ sudo apt-get install libapache2-mod-wsgi-py3
Unpacking libapache2-mod-wsgi-py3 (4.3.0-1.1build1) ...
Setting up libapache2-mod-wsgi-py3 (4.3.0-1.1build1) ...
apache2_invoke: Enable module wsgi
(TestEnv)~/Python-3.6.5/flaskproject$ sudo a2enmod wsgi
Module wsgi already enabled

Проверьте версию пакета и соответствующую информацию, чтобы убедиться, что он включен.

(base)/etc/apache2/mods-enabled$ apt-cache show libapache2-mod-wsgi-py3 
Package: libapache2-mod-wsgi-py3
Priority: optional
Section: universe/httpd
Installed-Size: 243
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Debian Python Modules Team <[email protected]>
Architecture: amd64
Source: mod-wsgi
Version: 4.3.0-1.1build1
Provides: httpd-wsgi
Depends: libc6 (>= 2.14), libpython3.5 (>= 3.5.0~b1), apache2-api-20120211, apache2-bin (>= 2.4.16), python3 (>= 3.5), python3 (<< 3.6)
(base) ~$ sudo apachectl -M | grep wsgi
 wsgi_module (shared)

Создание сред Conda:

Создайте несколько сред conda с помощью flask. Вы также можете установить дополнительные пакеты с файлом environment.yml.

(base) ~$ conda create -n app1_env python=3.6 flask
Collecting package metadata (current_repodata.json): done
Solving environment: done
.
.
## Package Plan ##
environment location: /home/ubuntu/miniconda3/envs/app1_env
added / updated specs:
    - flask
    - python=3.6

Проверьте среды и их соответствующие каталоги.

(base) $ conda env list
# conda environments:
base                  *  /home/ubuntu/miniconda3
app1_env                 /home/ubuntu/miniconda3/envs/app1_env
app2_env                 /home/ubuntu/miniconda3/envs/app2_env
app3_env                 /home/ubuntu/miniconda3/envs/app3_env

Настройте приложения:

Настройте каталоги приложений в корне документа Apache ‘/ var / www / html’.

(base)/var/www/html$ ls -lrth
total 40K

-rw-r--r-- 1 root     root      12K Sep 18 09:47 index.html

drwxr-xr-x 2 root     root     4.0K Sep 25 09:42 app1
drwxr-xr-x 2 root     root     4.0K Sep 25 09:42 app2
drwxr-xr-x 2 root     root     4.0K Sep 25 09:42 app3

Здесь мы настраиваем образец приложения Python в каждом из каталогов.

(base)/var/www/html/app1$ ls -lrth
total 8.0K
-rwxr-xr-x 1 root root 129 Sep 25 09:42 wsgi.py
-rw-r--r-- 1 root root 102 Sep 25 09:42 sample.py

Это содержимое примера приложения hello world. Мы создадим эти файлы во всех трех каталогах приложений как «Hello World, from app1 / 2/3» соответственно.

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World, from app1."

Создайте файл коннектора wsgi.py, который будет импортировать коннектор flask из sample.py. Убедитесь, что вы настроили системный путь для каталога приложения.

import sys
sys.path.insert(0, "/var/www/html/app1")
from sample import app as application

Настроить apache:

Откройте файл конфигурации apache.

(base)/etc/apache2/sites-enabled$ sudo vi 000-default.conf

Добавьте ниже конфигурацию для каждого приложения. Это специфические директивы mod_wsgi. Добавьте их в раздел ‹/VirtualHost›. Обратите внимание на путь ‘WSGIScriptAlia, он будет определять URL-адреса для каждого приложения. Еще одна вещь, которую необходимо обеспечить, - это переменная «python-path» в директиве «WSGIDaemonProcess». Этот параметр будет указывать среду conda для каждого приложения.

WSGIDaemonProcess app1 python- path=/home/ubuntu/miniconda3/envs/app1_env/lib/python3.6/site-packages
WSGIScriptAlias /app1 /var/www/html/app1/wsgi.py
        <Directory /var/www/html/app1>
                WSGIProcessGroup app1
                WSGIApplicationGroup %{GLOBAL}
                Order deny,allow
                Allow from all
        </Directory>
WSGIDaemonProcess app2 python-path=/home/ubuntu/miniconda3/envs/app2_env/lib/python3.6/site-packages
WSGIScriptAlias /app2 /var/www/html/app2/wsgi.py
        <Directory /var/www/html/app2>
                WSGIProcessGroup app2
                WSGIApplicationGroup %{GLOBAL}
                Order deny,allow
                Allow from all
        </Directory>
</VirtualHost>

Убедитесь, что в конфигурации apache есть ошибки.

(base)/etc/apache2/sites-enabled$ sudo apachectl -t
Syntax OK

Изящно перезагрузите демон apache и протестируйте сайт.

http:<Your IP>:80/app1
http:<Your IP>:80/app2
http:<Your IP>:80/app3

Вот как мы можем настроить несколько флеш-приложений на apache с помощью mod_wsgi. Это очень важный сценарий использования для размещения API-интерфейсов модели машинного обучения для разных моделей на flask и apache.

Подпишитесь на нас в Twitter 🐦 и Facebook 👥 и присоединитесь к нашей группе Facebook 💬 .

Чтобы присоединиться к нашему сообществу Slack 🗣️ и читать наши еженедельные темы о Фавнах 🗞️, нажмите здесь⬇

Если этот пост был полезен, пожалуйста, нажмите несколько раз кнопку хлопка 👏 ниже, чтобы выразить поддержку автору! ⬇