Diverse versioni di Python sotto lo stesso imperatore uwsgi?


9

Sto eseguendo un imperatore uwsgi con vari Vassals che ognuno serve un'app Python specifica da un virtualenv diverso. Poiché uwsgi è stato compilato con il proprio interprete Python 2.7, il tentativo di utilizzare un virtualenv con Python 3 al suo interno produce il seguente errore in vassal.log:

ImportError: No module named site

Credo che l'origine di questo errore sia che uwsgi sta usando il suo interprete Python 2.7 incorporato, mentre la directory virtualenv in cui è in esecuzione supporta solo gli interpreti Python 3. Infatti, quando uso un altro uwsgi (semplicemente installandolo con pip install uwsginella stessa virtualenv), l'errore scompare. Tuttavia, vorrei che un imperatore regnasse su diversi virtual virtual, quindi installare un uwsgi separato in ciascuno non è un'opzione.

Secondo questa risposta su StackOverflow, il modo giusto per risolverlo è compilare uwsgi con diversi interpreti Python come moduli caricabili. Prima di impegnarmi in questo approccio, vorrei sapere come posso configurare i miei Vassals per utilizzare ciascuno un altro plug-in interprete.

In questo momento ho un imperatore che viene avviato dal mio /etc/rc.local con le seguenti impostazioni:

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

Poi ho un sacco di Vassals con file ini come questo:

[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

Non ho problemi a compilare una versione ottimizzata di uwsgi con diversi plug-in per interpreti, ma mi piacerebbe sapere cosa devo cambiare nella mia configurazione per utilizzare effettivamente questi interpreti separati. Posso solo dire un vassal.ini:

plugin = python3.4

e in un altro:

plugin = python2.7

?

Ti prego, aiutami a capire come combinare Python 2.7 e Python 3 virtualenvs sotto lo stesso imperatore uwsgi.


puoi seguire questo paragrafo: uwsgi-docs.readthedocs.org/en/latest/…
roberto

Questo è stato utile per creare un plug-in Python 3.6 per uwsgi, paulox.net/2017/04/04/how-to-use-uwsgi-with-python3-6-in-ubuntu Sono stato in grado di specificare in quale versione utilizzare ogni vassallo a seconda della versione desiderata plugins=python3oplugins=python36
Dfranc3373,

Risposte:


9

Bene, dal momento che non sono stato esattamente sopraffatto dalle risposte, ecco la soluzione che mi è venuta in mente:

Innanzitutto, ho creato un nuovo virtualenv con un interprete Python 3:

mkvirtualenv -p /usr/bin/python3 python3env

Quindi ho installato lo stock uwsgi da Pypi, che viene compilato automaticamente con un interprete Python 3:

pip install uwsgi

Ho creato una directory di configurazione /etc/uwsgi-python3che contiene emperor.ini e una sottodirectory vassals, contenente vassal.ini. Alla fine ho aggiunto la seguente riga a/etc/rc.local

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

Ora c'è un imperatore uwsgi in esecuzione che usa l'interprete Python 3 per i suoi vassalli. Non interferisce con un altro imperatore uwsgi che era già in esecuzione e utilizza l'interprete Python 2.7.

So che non è ottimale, perché non sto usando l'architettura dell'interprete collegabile che è spiegata nella documentazione (grazie roberto! Non so come avrei potuto ignorarlo). Tuttavia, funziona perfettamente e non ho dovuto toccare la mia installazione uwsgi esistente che serve un sacco di app di produzione.


Dopo aver lottato con uwsgiun'installazione globale , ho seguito questo approccio. Nice ... +1
nicorellius

@hedgie: sei un dio! So che non ci dovrebbero essere commenti con solo un "Grazie!" (già votato), ma te lo meriti. Il link per la creazione dei singoli plugin Python non ha funzionato per me sul mio Ubuntu localizzato, ma l'avvio di uwsgi installato nell'ambiente virtuale funziona con la versione corretta di Python ( ./venv/bin/uwsgi --python-version). Perfetto!
Taffit,

Sto riscontrando lo stesso problema con virtualenv su py 2.7.14 e uwsgi installato a livello globale su py 2.7.5. Ottenere l'errore del sito di importazione anche se è ancora tutto Python 2.7
Radtek,

3

Sotto osx ho fatto così. Ho smontato tutti gli uwsgi sul mio sistema (dalla produzione di pip ecc.).

Dopo di che ho scaricato sotto / usr / local il codice sorgente

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

dopo

cd uwsgi-2.0.17
make PROFILE=nolang

In questo modo ho creato un eseguibile senza plugin per Python.

Dopo di che ho creato ogni plugin per ogni versione sul mio sistema:

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"

Ora ho 3 plugin.

Nei miei file ini per l'imperatore ho specificato la directory dei plugin e la versione del plugin per ciascun file

[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

...

Ho collegato il binario uwsgi nella mia cartella / usr / local

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

E dopo eseguire l'imperatore

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

E voilà ora posso eseguire contemporaneamente i progetti python26, python27 e python36


Ci sono molte soluzioni in giro, ma questo davvero risolto il problema che ho avuto in esecuzione uwsgiconpython 3.6
Evhz

0

Un'altra possibile soluzione è quella di riutilizzare "l'imperatore" a livello di sistema e sostituire il vassallo con la nuova versione. In questo modo non è necessario inventare nuove cartelle /etcné avviare nuovi servizi rc.local.

  1. Installa uwsgitramite pipin virtualenv.
  2. Modifica il /etc/uwsgi/apps-enabled/your-app.iniseguente:

    • Rimuovi la plugins=...linea (perché pip compilato uwsginon supporta i plugin).
    • Aggiungi la riga:

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

      Questo costringerà l'imperatore uWSGI a lanciare il tuo uwsgibinario come vassallo.

  3. Ricarica la tua app nell'imperatore service uwsgi restart your-app.

L'ultimo passaggio segnala che non è stato possibile riavviare il server:

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

Tuttavia, in realtà, il nuovo vassal inizia bene così come tutte le altre app. Non ho trovato il tempo per eseguire il debug di questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.