Question Différentes versions de Python sous le même empereur d'Uwsgi?


J'exécute un empereur d'Uwsgi avec divers Vassals qui desservent chacun une application Python spécifique à partir d'un serveur virtuel différent. Puisque uwsgi a été compilé avec son propre interpréteur Python 2.7, essayer d'utiliser virtualenv avec Python 3 génère l'erreur suivante dans vassal.log:

ImportError: No module named site

Je crois que l'origine de cette erreur est qu'Uwsgi utilise son interpréteur intégré Python 2.7, alors que le répertoire virtualenv dans lequel il s'exécute ne prend en charge que les interprètes Python 3. En effet, quand j’utilise un autre uwsgi (simplement en l’installant avec pip install uwsgi dans le même virtualenv), l'erreur disparaît. Cependant, j'aimerais qu'un empereur règne sur plusieurs virtualenv différents. L'installation d'un uwsgi distinct dans chacun d'eux n'est donc pas une option.

Selon cette réponse Sur Stackoverflow, la bonne façon de résoudre ce problème est de compiler uwsgi avec différents interprètes Python en tant que modules chargeables. Avant de m'engager dans cette approche, j'aimerais savoir comment configurer mes Vassals pour qu'ils utilisent chacun un autre plug-in d'interprétation.

À l’heure actuelle, j’ai un empereur qui est lancé à partir de mon / etc / rc.local avec les paramètres suivants:

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

Ensuite, j'ai un tas de Vassals avec des fichiers ini comme celui-ci:

[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

Je n'ai aucun problème à compiler une version peaufinée de uwsgi avec plusieurs plugins d'interpréteur, mais j'aimerais savoir ce que je dois changer dans ma configuration pour réellement utilisation ces interprètes séparés. Puis-je simplement dire un vassal.ini:

plugin = python3.4

et dans un autre:

plugin = python2.7

?

Aidez-moi à comprendre comment combiner les serveurs virtuels Python 2.7 et Python 3 sous le même empereur uwsgi.


6
2017-10-03 21:02


origine


vous pouvez suivre ce paragraphe: uwsgi-docs.readthedocs.org/en/latest/… - roberto


Réponses:


Eh bien, comme je n’étais pas vraiment submergé par les réponses, voici la solution que j’ai moi-même trouvée:

Tout d'abord, j'ai créé un nouveau virtualenv avec un interpréteur Python 3:

mkvirtualenv -p /usr/bin/python3 python3env

Ensuite, j'ai installé le stock uwsgi de Pypi, qui est automatiquement compilé avec un interpréteur Python 3:

pip install uwsgi

J'ai créé un répertoire de configuration /etc/uwsgi-python3 qui contient emperor.ini et un sous-répertoire vassals, contenant vassal.ini. Enfin, j'ai ajouté la ligne suivante à /etc/rc.local

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

Maintenant, il y a un empereur Uwsgi en cours d'exécution qui utilise l'interpréteur Python 3 pour ses vassaux. Il n’interfère pas avec un autre empereur uwsgi qui était déjà en cours d’exécution et qui utilise l’interpréteur Python 2.7.

Je sais que ce n'est pas optimal, parce que je n'utilise pas l'architecture d'interpréteur enfichable qui est expliqué dans la documentation (merci roberto! Je ne sais pas comment j'aurais pu oublier ça). Cependant, il fonctionne parfaitement et je n'ai pas eu à toucher à mon installation uwsgi existante qui dessert un ensemble d'applications de production.


6
2017-10-05 08:20



Après avoir lutté avec un global uwsgi l'installation, je suis allé avec cette approche. Nice ... +1 - nicorellius
@ hedgie: tu es un dieu! Je sais qu'il ne devrait y avoir aucun commentaire avec juste un "Merci!" (déjà voté), mais vous le méritez. Le lien permettant de créer les plug-ins Python uniques ne fonctionnait pas pour moi sur mon Ubuntu localisé, mais le démarrage de uwsgi installé dans l'environnement virtuel fonctionnait avec la version correcte de Python (./venv/bin/uwsgi --python-version). Parfait! - taffit
J'ai le même problème avec virtualenv sur py 2.7.14 et uwsgi installé globalement sur py 2.7.5. Obtention de l'erreur du site d'importation même si c'est toujours tout python 2.7 - radtek


Sous osx j'ai fait comme ça. J'ai désinstallé tous les uwsgi sur mon système (de brasser à partir de pip, etc.).

Après cela, j'ai téléchargé sous / usr / local le code source

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

après

cd uwsgi-2.0.17
make PROFILE=nolang

De cette façon, j'ai créé un exécutable sans plugins pour python.

Après cela, j'ai créé chaque plugin pour chaque version de mon système:

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"

Maintenant, j'ai 3 plugins.

Dans mes fichiers ini pour l'empereur, j'ai spécifié le répertoire des plugins et la version du plugin pour chaque fichier.

[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

...

J'ai créé un lien symbolique vers le binaire uwsgi dans mon dossier / usr / local

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

Et après avoir couru l'empereur

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

Et voila maintenant je peux lancer python26, python27 et python36 simultanément


1
2018-06-15 06:46





Une autre solution possible consiste à réutiliser "l'empereur" à l'échelle du système et à ne remplacer que le vassal par la nouvelle version. De cette façon, vous n’avez pas besoin d’inventer de nouveaux dossiers sous /etc ni lancer de nouveaux services à rc.local.

  1. Installer uwsgi via pip dans un virtualenv.
  2. Modifier le /etc/uwsgi/apps-enabled/your-app.ini comme suit:

    • Retirer le plugins=... line (parce que pip-compilé uwsgi ne supporte pas les plugins).
    • Ajouter la ligne:

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

      Cela obligera l’empereur uWSGI à lancer le vôtre. uwsgi binaire comme le vassal.

  3. Rechargez votre application dans l'empereur service uwsgi restart your-app.

La dernière étape consiste à signaler un échec du redémarrage du serveur:

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

Cependant, en réalité, le nouveau vassal commence bien ainsi que toutes les autres applications. Je n'ai pas trouvé le temps de déboguer ceci.


0
2018-01-17 12:00