Estoy ejecutando un Emperador uwsgi con varios Vassals que sirven a una aplicación Python específica de un virtualenv diferente. Como uwsgi se compiló con su propio intérprete de Python 2.7, intentar usar un virtualenv con Python 3 produce el siguiente error en vassal.log:
ImportError: No module named site
Creo que el origen de este error es que uwsgi está utilizando su intérprete de Python 2.7 incorporado, mientras que el directorio virtualenv en el que se ejecuta solo admite intérpretes de Python 3. De hecho, cuando uso otro uwsgi (simplemente instalándolo con pip install uwsgi
el mismo virtualenv), el error desaparece. Sin embargo, me gustaría que un Emperador gobernara sobre varios virtualenvs diferentes, por lo que instalar un uwsgi separado en cada uno no es una opción.
De acuerdo con esta respuesta en Stackoverflow, la forma correcta de resolver esto es compilar uwsgi con diferentes intérpretes de Python como módulos cargables. Antes de comprometerme con este enfoque, me gustaría saber cómo puedo configurar mis Vassals para que cada uno use otro complemento de intérprete.
En este momento tengo un Emperador que se inicia desde mi /etc/rc.local con la siguiente configuración:
[uwsgi]
uid = www-data
gid = www-data
master = true
emperor = /etc/uwsgi/vassals
daemonize = /var/log/uwsgi/emperor.log
Luego tengo un montón de Vassals con archivos ini como este:
[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
No tengo problemas para compilar una versión ajustada de uwsgi con varios complementos de intérprete, pero me gustaría saber qué tengo que cambiar en mi configuración para usar estos intérpretes por separado. ¿Puedo decir un solo vassal.ini:
plugin = python3.4
y en otro:
plugin = python2.7
?
Por favor, ayúdame a descubrir cómo combinar Python 2.7 y Python 3 virtualenvs bajo el mismo uwsgi Emperor.
plugins=python3
oplugins=python36