J'exécute un empereur uwsgi avec divers vassaux qui servent chacun une application Python spécifique à partir d'un virtualenv différent. Puisque uwsgi a été compilé avec son propre interpréteur Python 2.7, essayer d'utiliser un virtualenv avec Python 3 dans celui-ci produit l'erreur suivante dans vassal.log:
ImportError: No module named site
Je crois que l'origine de cette erreur est que uwsgi utilise son interpréteur Python 2.7 intégré, tandis que le répertoire virtualenv dans lequel il s'exécute ne prend en charge que les interprètes Python 3. En effet, lorsque 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, donc installer un uwsgi séparé dans chacun n'est pas une option.
Selon cette réponse sur Stackoverflow, la bonne façon de résoudre ce problème consiste à compiler uwsgi avec différents interprètes Python sous forme de modules chargeables. Avant de m'engager dans cette approche, j'aimerais savoir comment je peux configurer mes Vassals pour utiliser chacun un autre plugin d'interpréteur.
En ce moment, j'ai un empereur qui est démarré à 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 Vassaux 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 modifiée de uwsgi avec plusieurs plugins d'interpréteur, mais j'aimerais savoir ce que je dois changer dans ma configuration pour utiliser réellement ces interprètes séparés. Puis-je simplement dire un vassal.ini:
plugin = python3.4
et dans un autre:
plugin = python2.7
?
S'il vous plaît, aidez-moi à comprendre comment combiner Python 2.7 et Python 3 virtualenvs sous le même empereur uwsgi.
la source
plugins=python3
ouplugins=python36
Réponses:
Eh bien, comme je n'ai pas été 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:
J'ai ensuite installé le stock uwsgi de Pypi, qui se compile automatiquement avec un interpréteur Python 3:
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
Maintenant, il y a un uwsgi Emperor 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 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 qui est 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.
la source
uwsgi
installation globale , j'ai opté pour cette approche. Nice ... +1./venv/bin/uwsgi --python-version
). Parfait!Sous osx j'ai fait comme ça. J'ai désinstallé tous les uwsgi sur mon système (de l'infusion du pip, etc.).
Après cela, j'ai téléchargé sous / usr / local le code source
après
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:
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
J'ai créé un lien symbolique vers le binaire uwsgi dans mon dossier / usr / local
Et après avoir couru l'empereur
Et voila maintenant, je peux exécuter le projet python26, python27 et python36 simultanément
la source
uwsgi
avecpython 3.6
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
/etc
ni de lancer de nouveaux servicesrc.local
.uwsgi
viapip
dans un virtualenv.Modifiez le
/etc/uwsgi/apps-enabled/your-app.ini
comme suit:plugins=...
ligne (car pip-compileduwsgi
ne prend pas en charge les plugins).Ajoutez la ligne:
Cela forcera l'empereur uWSGI à lancer votre propre
uwsgi
binaire en tant que vassal.Rechargez votre application dans l'empereur
service uwsgi restart your-app
.La dernière étape signale un échec de redémarrage du serveur:
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 cela.
la source