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.
fuente
plugins=python3
oplugins=python36
Respuestas:
Bueno, como no estaba exactamente abrumado por las respuestas, aquí está la solución que se me ocurrió:
Primero, creé un nuevo virtualenv con un intérprete de Python 3:
Luego instalé el stock uwsgi de Pypi, que se compila automáticamente con un intérprete de Python 3:
/etc/uwsgi-python3
Creé un directorio de configuración que contiene el emperor.ini y un subdirectorio vasallos, que contiene vassal.ini. Finalmente, agregué la siguiente línea a/etc/rc.local
Ahora hay un emperador uwsgi corriendo que usa el intérprete Python 3 para sus vasallos. No interfiere con otro uwsgi Emperor que ya se estaba ejecutando y usa el intérprete Python 2.7.
Sé que no es óptimo, porque no estoy usando la arquitectura de intérprete conectable que se explica en la documentación (¡gracias Roberto! No sé cómo podría haberlo pasado por alto). Sin embargo, funciona sin problemas y no tuve que tocar mi instalación uwsgi existente que sirve a un montón de aplicaciones de producción.
fuente
uwsgi
instalación global , seguí este enfoque. Nice ... +1./venv/bin/uwsgi --python-version
). ¡Perfecto!Bajo osx hice así. Desinstalé todos los uwsgi en mi sistema (de brew from pip, etc.).
Después de eso descargué bajo / usr / local el código fuente
después
De esta manera, creé un ejecutable sin complementos para Python.
Después de eso hice cada complemento para cada versión en mi sistema:
Ahora tengo 3 complementos.
En mis archivos ini para el emperador, especifiqué el directorio de complementos y la versión del complemento para cada archivo
Hice un enlace simbólico del binario uwsgi en mi carpeta / usr / local
Y después de correr el emperador
Y voila ahora puedo ejecutar el proyecto python26, python27 y python36 simultáneamente
fuente
uwsgi
conpython 3.6
Otra posible solución es reutilizar el "emperador" de todo el sistema, y solo sustituir el vasallo con la nueva versión. De esta manera, no necesita inventar ninguna carpeta nueva
/etc
ni iniciar nuevos serviciosrc.local
.uwsgi
través depip
un virtualenv.Edite lo
/etc/uwsgi/apps-enabled/your-app.ini
siguiente:plugins=...
línea (porque pip-compileduwsgi
no admite complementos).Agrega la línea:
Esto obligará al emperador uWSGI a lanzar su propio
uwsgi
binario como vasallo.Recargue su aplicación en el emperador
service uwsgi restart your-app
.El último paso por qué informa un error al reiniciar el servidor:
Sin embargo, en realidad, el nuevo vasallo comienza bien, así como todas las demás aplicaciones. No encontré el tiempo para depurar esto.
fuente