Ich verwende einen uwsgi-Kaiser mit verschiedenen Vasallen, die jeweils eine bestimmte Python-App aus einer anderen virtuellen Umgebung bedienen. Da uwsgi mit einem eigenen Python 2.7-Interpreter kompiliert wurde, führt der Versuch, eine virtuelle Umgebung mit Python 3 zu verwenden, in vassal.log zu folgendem Fehler:
ImportError: No module named site
Ich glaube, der Grund für diesen Fehler ist, dass uwsgi seinen integrierten Python 2.7-Interpreter verwendet, während das Verzeichnis virtualenv, in dem es ausgeführt wird, nur Python 3-Interpreter unterstützt. In der Tat pip install uwsgi
verschwindet der Fehler , wenn ich ein anderes uwsgi verwende (indem ich es einfach in derselben virtuellen Umgebung installiere). Ich möchte jedoch, dass ein Kaiser über mehrere verschiedene virtuelle Umgebungen herrscht, daher ist die Installation eines separaten UWSGI in jedem keine Option.
Nach dieser Antwort auf Stackoverflow besteht der richtige Weg, dies zu lösen, darin, uwsgi mit verschiedenen Python-Interpreten als ladbare Module zu kompilieren. Bevor ich mich zu diesem Ansatz verpflichte, möchte ich wissen, wie ich meine Vasallen so konfigurieren kann, dass sie jeweils ein anderes Interpreter-Plugin verwenden.
Im Moment habe ich einen Kaiser, der von meinem /etc/rc.local mit den folgenden Einstellungen gestartet wird:
[uwsgi]
uid = www-data
gid = www-data
master = true
emperor = /etc/uwsgi/vassals
daemonize = /var/log/uwsgi/emperor.log
Dann habe ich ein paar Vasallen mit INI-Dateien wie diesen:
[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
Ich habe kein Problem damit, eine optimierte Version von uwsgi mit mehreren Interpreter-Plugins zu kompilieren, aber ich möchte wissen, was ich in meiner Konfiguration ändern muss, um diese separaten Interpreter tatsächlich zu verwenden . Kann ich nur eine vassal.ini sagen:
plugin = python3.4
und in einem anderen:
plugin = python2.7
?
Bitte helfen Sie mir herauszufinden, wie Sie Python 2.7- und Python 3-Virtualenvs unter demselben uwsgi Emperor kombinieren können.
quelle
plugins=python3
oderplugins=python36
Antworten:
Nun, da ich nicht gerade von den Antworten überwältigt war, habe ich mir hier die Lösung ausgedacht:
Zuerst habe ich eine neue virtuelle Umgebung mit einem Python 3-Interpreter erstellt:
Dann habe ich das Standard-Uwsgi von Pypi installiert, das automatisch mit einem Python 3-Interpreter kompiliert wird:
Ich habe ein Konfigurationsverzeichnis erstellt
/etc/uwsgi-python3
, das die Datei emperor.ini und ein Unterverzeichnis vassals enthält, das die Datei vassal.ini enthält. Schließlich habe ich die folgende Zeile hinzugefügt/etc/rc.local
Jetzt läuft ein uwsgi Emperor, der den Python 3-Interpreter für seine Vasallen verwendet. Es stört keinen anderen uwsgi Emperor, der bereits ausgeführt wurde und den Python 2.7-Interpreter verwendet.
Ich weiß, dass es nicht optimal ist, weil ich nicht die steckbare Interpreter-Architektur verwende, die in der Dokumentation erläutert wird (danke roberto! Ich weiß nicht, wie ich das hätte übersehen können). Es läuft jedoch einwandfrei und ich musste meine vorhandene uwsgi-Installation, die eine Reihe von Produktions-Apps bereitstellt, nicht berühren.
quelle
uwsgi
Installation zu kämpfen hatte , entschied ich mich für diesen Ansatz. Schön ... +1./venv/bin/uwsgi --python-version
) ausgeführt. Perfekt!Unter osx habe ich so gemacht. Ich habe alle uwsgi auf meinem System deinstalliert (vom Brauen von Pip usw.).
Danach habe ich unter / usr / local den Quellcode heruntergeladen
nach
Auf diese Weise habe ich eine ausführbare Datei ohne Plugins für Python erstellt.
Danach habe ich jedes Plugin für jede Version auf meinem System erstellt:
Jetzt habe ich 3 Plugins.
In meinen INI-Dateien für den Kaiser habe ich das Plugins-Verzeichnis und die Plugin-Version für jede Datei angegeben
Ich habe die uwsgi-Binärdatei in meinem Ordner / usr / local symlinkiert
Und nach dem Kaiser laufen
Und voila jetzt kann ich python26, python27 und python36 gleichzeitig ausführen
quelle
uwsgi
mitpython 3.6
Eine andere mögliche Lösung besteht darin, den systemweiten "Kaiser" wiederzuverwenden und nur den Vasallen durch die neue Version zu ersetzen. Auf diese Weise müssen Sie keine neuen Ordner erfinden
/etc
oder neue Dienste für startenrc.local
.uwsgi
viapip
in eine virtuelle Umgebung.Bearbeiten Sie
/etc/uwsgi/apps-enabled/your-app.ini
Folgendes wie folgt:plugins=...
Zeile (da pip-compileduwsgi
keine Plugins unterstützt).Fügen Sie die Zeile hinzu:
Dies wird den uWSGI-Kaiser zwingen, Ihre eigene
uwsgi
Binärdatei als Vasall zu starten .Laden Sie Ihre App im Kaiser neu
service uwsgi restart your-app
.Der letzte Schritt meldet einen Fehler beim Neustart des Servers:
In Wirklichkeit startet der neue Vasall jedoch genauso gut wie alle anderen Apps. Ich habe keine Zeit gefunden, dies zu debuggen.
quelle