Я управляю 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.
источник
plugins=python3
илиplugins=python36
Ответы:
Ну, так как я не был полностью поражен ответами, вот решение, которое я придумал сам:
Сначала я создал новый virtualenv с интерпретатором Python 3:
Затем я установил исходный код uwsgi из Pypi, который автоматически компилируется с интерпретатором Python 3:
Я создал каталог конфигурации,
/etc/uwsgi-python3
который содержит emperor.ini и подкаталог vassals, содержащий vassal.ini. Наконец, я добавил следующую строку/etc/rc.local
Теперь работает uwsgi Emperor, который использует интерпретатор Python 3 для своих вассалов. Это не мешает другому uwsgi Emperor, который уже работал и использует интерпретатор Python 2.7.
Я знаю, что это не оптимально, потому что я не использую подключаемую архитектуру интерпретатора, которая описана в документации (спасибо, Роберто! Я не знаю, как я мог пропустить это). Тем не менее, он работает безупречно, и мне не пришлось трогать мою существующую установку UWSGI, которая обслуживает кучу производственных приложений.
источник
uwsgi
установкой, я пошел с этим подходом. Ницца ... +1./venv/bin/uwsgi --python-version
). Отлично!Под OSX я сделал так. Я удалил все UWSGI в моей системе (от brew, pip и т. Д.).
После этого я скачал в / usr / local исходный код
после
Таким образом, я создал исполняемый файл без плагинов для Python.
После этого я сделал каждый плагин для каждой версии в моей системе:
Теперь у меня есть 3 плагина.
В моих INI-файлах для императора я указал директорию плагинов и версию плагина для каждого файла
Я сделал ссылку на двоичный файл uwsgi в моей папке / usr / local
И после запуска императора
И вуаля, теперь я могу запускать проекты python26, python27 и python36 одновременно
источник
uwsgi
сpython 3.6
Другим возможным решением является повторное использование общесистемного «императора» и замена только вассала новой версией. Таким образом, вам не нужно ни изобретать новые папки,
/etc
ни запускать новые сервисыrc.local
.uwsgi
черезpip
в virtualenv.Отредактируйте
/etc/uwsgi/apps-enabled/your-app.ini
следующим образом:plugins=...
строку (потому что скомпилированный pipuwsgi
не поддерживает плагины).Добавьте строку:
Это заставит императора uWSGI запустить ваш собственный
uwsgi
бинарный файл в качестве вассала.Перезагрузите ваше приложение в императоре
service uwsgi restart your-app
.Последний шаг иногда сообщает об ошибке перезапуска сервера:
Тем не менее, на самом деле, новый вассал запускается нормально, как и все другие приложения. Я не нашел времени для отладки этого.
источник