Разные версии Python под одним и тем же uwsgi Emperor?

9

Я управляю uwsgi Emperor с различными вассалами, каждый из которых обслуживает определенное приложение Python из разных virtualenv. Поскольку uwsgi был скомпилирован с собственным интерпретатором Python 2.7, попытка использовать virtualenv с Python 3 в нем приводит к следующей ошибке в vassal.log:

ImportError: No module named site

Я полагаю, что причиной этой ошибки является то, что uwsgi использует встроенный интерпретатор Python 2.7, а каталог virtualenv, в котором он работает, поддерживает только интерпретаторы Python 3. Действительно, когда я использую другой uwsgi (просто установив его pip install uwsgiв тот же virtualenv), ошибка исчезает. Однако, я бы хотел, чтобы один Император управлял несколькими разными virtualenvs, поэтому установка отдельного uwsgi в каждом из них не вариант.

Согласно этому ответу о Stackoverflow, правильный способ решить эту проблему - это скомпилировать uwsgi с различными интерпретаторами Python в качестве загружаемых модулей. Прежде чем перейти к такому подходу, я хотел бы узнать, как я могу настроить своих Vassals для каждого использования другого плагина интерпретатора.

Прямо сейчас у меня есть один Emperor, который запускается из моего /etc/rc.local со следующими настройками:

[uwsgi]
uid = www-data
gid = www-data
master = true
emperor = /etc/uwsgi/vassals
daemonize = /var/log/uwsgi/emperor.log

Тогда у меня есть куча вассалов с INI-файлами вроде этого:

[uwsgi]
master = false
single-interpreter = true
socket = /tmp/%n.sock
virtualenv = /home/user/.virtualenvs/djangoproject
chdir = /home/user/djangoproject
wsgi-file = project/wsgi.py
logto = /var/log/uwsgi/%n.log

У меня нет проблем с компиляцией измененной версии uwsgi с несколькими плагинами интерпретатора, но я хотел бы знать, что мне нужно изменить в моей конфигурации, чтобы фактически использовать эти отдельные интерпретаторы. Могу я просто сказать один vassal.ini:

plugin = python3.4

а в другом:

plugin = python2.7

?

Пожалуйста, помогите мне понять, как объединить Python 2.7 и Python 3 virtualenvs под одним и тем же uwsgi Emperor.

hedgie
источник
Вы можете следовать этому пункту: uwsgi-docs.readthedocs.org/en/latest/…
Роберто
Это пригодилось для создания плагина Python 3.6 для uwsgi, paulox.net/2017/04/04/how-to-use-uwsgi-with-python3-6-in-ubuntu. Мне удалось указать, какую версию использовать в каждый вассал в зависимости от того, какую версию вы хотите plugins=python3илиplugins=python36
Dfranc3373

Ответы:

9

Ну, так как я не был полностью поражен ответами, вот решение, которое я придумал сам:

Сначала я создал новый virtualenv с интерпретатором Python 3:

mkvirtualenv -p /usr/bin/python3 python3env

Затем я установил исходный код uwsgi из Pypi, который автоматически компилируется с интерпретатором Python 3:

pip install uwsgi

Я создал каталог конфигурации, /etc/uwsgi-python3который содержит emperor.ini и подкаталог vassals, содержащий vassal.ini. Наконец, я добавил следующую строку/etc/rc.local

/home/user/.virtualenvs/python3env/bin/uwsgi --ini /etc/uwsgi-python3/emperor.ini

Теперь работает uwsgi Emperor, который использует интерпретатор Python 3 для своих вассалов. Это не мешает другому uwsgi Emperor, который уже работал и использует интерпретатор Python 2.7.

Я знаю, что это не оптимально, потому что я не использую подключаемую архитектуру интерпретатора, которая описана в документации (спасибо, Роберто! Я не знаю, как я мог пропустить это). Тем не менее, он работает безупречно, и мне не пришлось трогать мою существующую установку UWSGI, которая обслуживает кучу производственных приложений.

hedgie
источник
После борьбы с глобальной uwsgiустановкой, я пошел с этим подходом. Ницца ... +1
nicorellius
@hedgie: ты бог! Я знаю, что не должно быть никаких комментариев только с "Спасибо!" (уже проголосовал), но вы это заслужили. Ссылка для сборки отдельных плагинов Python у меня не работала на моей локализованной Ubuntu, но запуск uwsgi, установленного в виртуальной среде, выполняется с правильной версией python ( ./venv/bin/uwsgi --python-version). Отлично!
Таффит
У меня та же проблема с virtualenv на py 2.7.14 и uwsgi, установленным глобально на py 2.7.5. Получение ошибки сайта импорта, несмотря на то, что все еще Python 2.7
Radtek
3

Под OSX я сделал так. Я удалил все UWSGI в моей системе (от brew, pip и т. Д.).

После этого я скачал в / usr / local исходный код

wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar zxvf uwsgi-latest.tar.gz

после

cd uwsgi-2.0.17
make PROFILE=nolang

Таким образом, я создал исполняемый файл без плагинов для Python.

После этого я сделал каждый плагин для каждой версии в моей системе:

PYTHON=python3.6 ./uwsgi --build-plugin "plugins/python python36"
PYTHON=python2.7 ./uwsgi --build-plugin "plugins/python python27"
PYTHON=python2.6 ./uwsgi --build-plugin "plugins/python python26"

Теперь у меня есть 3 плагина.

В моих INI-файлах для императора я указал директорию плагинов и версию плагина для каждого файла

[uwsgi]
plugins-dir = /usr/local/uwsgi-2.0.17
plugin = python36

[uwsgi]
plugins-dir = /usr/local/uwsgi-2.0.17
plugin = python27

[uwsgi]
plugins-dir = /usr/local/uwsgi-2.0.17
plugin = python26

...

Я сделал ссылку на двоичный файл uwsgi в моей папке / usr / local

ln -s /usr/local/uwsgi-2.0.17/uwsgi /usr/local/bin/uwsgi

И после запуска императора

uwsgi --emperor /PATH/TO/INI/FILES/FOLDER/

И вуаля, теперь я могу запускать проекты python26, python27 и python36 одновременно

Джованни Брешиа
источник
Есть много решений вокруг, но это одна действительно решить проблему я работает uwsgiсpython 3.6
Evhz
0

Другим возможным решением является повторное использование общесистемного «императора» и замена только вассала новой версией. Таким образом, вам не нужно ни изобретать новые папки, /etcни запускать новые сервисы rc.local.

  1. Установить uwsgiчерез pipв virtualenv.
  2. Отредактируйте /etc/uwsgi/apps-enabled/your-app.iniследующим образом:

    • Удалите plugins=...строку (потому что скомпилированный pip uwsgiне поддерживает плагины).
    • Добавьте строку:

      unprivileged-binary-patch = /path/to/your/venv/bin/uwsgi
      

      Это заставит императора uWSGI запустить ваш собственный uwsgiбинарный файл в качестве вассала.

  3. Перезагрузите ваше приложение в императоре service uwsgi restart your-app.

Последний шаг иногда сообщает об ошибке перезапуска сервера:

 * Starting app server(s) uwsgi
   ...fail!

Тем не менее, на самом деле, новый вассал запускается нормально, как и все другие приложения. Я не нашел времени для отладки этого.

KT.
источник