Python >> Tutoriel Python >  >> Python

Différentes versions de Python sous le même empereur uwsgi ?

Solution 1 :

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

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 compilé automatiquement avec un interpréteur Python 3 :

pip install uwsgi

J'ai créé un répertoire de configuration /etc/uwsgi-python3 qui contient le fichier empereur.ini et un sous-répertoire vassaux, 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

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

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

Solution 2 :

Sous osx j'ai fait comme ça. J'ai désinstallé tous les uwsgi sur mon système (de brew 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 lié symboliquement 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 exécuté l'empereur

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

Et voilà, je peux maintenant exécuter les projets python26, python27 et python36 simultanément

Solution 3 :

Une autre solution possible consiste à réutiliser "l'empereur" à l'échelle du système et à ne remplacer le vassal que 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 par pip dans un environnement virtuel.
  2. Modifiez le /etc/uwsgi/apps-enabled/your-app.ini comme suit :

    • Supprimez le plugins=... ligne (parce que pip compilé uwsgi ne prend pas en charge les plugins).
    • Ajoutez la ligne :

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

      Cela forcera l'empereur uWSGI à lancer votre propre uwsgi binaire comme vassal.

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

La dernière étape signale en quelque sorte un échec de redémarrage du serveur :

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

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