Verschiedene Python-Versionen unter dem gleichen uwsgi Emperor?

9

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 uwsgiverschwindet 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.

Hedgie
quelle
Sie können diesem Absatz folgen: uwsgi-docs.readthedocs.org/en/latest/…
roberto
Dies war praktisch, um ein Python 3.6-Plugin für uwsgi zu erstellen. Paulox.net/2017/04/04/how-to-use-uwsgi-with-python3-6-in-ubuntu Ich konnte angeben, in welcher Version verwendet werden soll jeder Vasall je nachdem welche Version Sie wollen plugins=python3oderplugins=python36
Dfranc3373

Antworten:

9

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:

mkvirtualenv -p /usr/bin/python3 python3env

Dann habe ich das Standard-Uwsgi von Pypi installiert, das automatisch mit einem Python 3-Interpreter kompiliert wird:

pip install uwsgi

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

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

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.

Hedgie
quelle
Nachdem ich mit einer globalen uwsgiInstallation zu kämpfen hatte , entschied ich mich für diesen Ansatz. Schön ... +1
nicorellius
@hedgie: du bist ein Gott! Ich weiß, dass es keine Kommentare mit nur einem "Danke!" Geben sollte. (bereits positiv bewertet), aber Sie haben es verdient. Der Link zum Erstellen der einzelnen Python-Plugins funktionierte auf meinem lokalisierten Ubuntu nicht, aber das Starten des in der virtuellen Umgebung installierten uwsgi wird mit der richtigen Python-Version ( ./venv/bin/uwsgi --python-version) ausgeführt. Perfekt!
Taft
Ich habe das gleiche Problem mit virtualenv auf py 2.7.14 und uwsgi global auf py 2.7.5 installiert. Erhalten der Import-Site-Fehler, obwohl es immer noch alles Python 2.7
Radtek
3

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

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

nach

cd uwsgi-2.0.17
make PROFILE=nolang

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:

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"

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

[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

...

Ich habe die uwsgi-Binärdatei in meinem Ordner / usr / local symlinkiert

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

Und nach dem Kaiser laufen

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

Und voila jetzt kann ich python26, python27 und python36 gleichzeitig ausführen

Giovanni Brescia
quelle
Es gibt viele Lösungen um, aber dieses wirklich löste das Problem , das ich hatte , läuft uwsgimitpython 3.6
Evhz
0

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 /etcoder neue Dienste für starten rc.local.

  1. Installieren Sie uwsgivia pipin eine virtuelle Umgebung.
  2. Bearbeiten Sie /etc/uwsgi/apps-enabled/your-app.iniFolgendes wie folgt:

    • Entfernen Sie die plugins=...Zeile (da pip-compiled uwsgikeine Plugins unterstützt).
    • Fügen Sie die Zeile hinzu:

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

      Dies wird den uWSGI-Kaiser zwingen, Ihre eigene uwsgiBinärdatei als Vasall zu starten .

  3. Laden Sie Ihre App im Kaiser neu service uwsgi restart your-app.

Der letzte Schritt meldet einen Fehler beim Neustart des Servers:

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

In Wirklichkeit startet der neue Vasall jedoch genauso gut wie alle anderen Apps. Ich habe keine Zeit gefunden, dies zu debuggen.

KT.
quelle