Python Applikation mit uWSGI betreiben
Dieses Tutorial erklärt, wie Sie eine einfache Python-Anwendung mit uWSGI im Userspace betreiben können.
Für das nachfolgende Beispiel gehen wir davon aus, dass Ihre Anwendung wsgi unterstützt. Wenn Sie Django oder Flask verwenden, ist dies bereits der Fall.
1. Python installieren
Auf Ihrem Managed Server ist Python bereits vorinstalliert, jedoch ist die verfügbare Version basierend auf der jeweiligen Ubuntu-Version fixiert.
Ubuntu | Python |
---|---|
18.04 (Bionic) | 3.6.* |
20.04 (Focal) | 3.8.* |
22.04 (Jammy) | 3.10.* |
Falls Sie eine spezifische Python-Version benötigen, können Sie unserem Beispiel im Abschnitt "Alternative Python-Versionen installieren" folgen.
2. Virtuelles Environment einrichten (venv)
Es empfiehlt sich, ihre Python-Applikationen mittels virtuellen Environments oder kurz venv
, voneinander zu trennen.
-
Erstellen und aktivieren Sie ein neues virtuelles Environment:
$ mkdir ~/beispielapp/ && cd ~/beispielapp/
$ python -m venv .venv -
Installieren Sie uWSGI im soeben erstellen Environment:
$ source .venv/bin/activate
(.venv) $ pip install uwsgi
Falls die Installation von uWSGI fehlschlägt, liegt das Problem möglicherweise an fehlenden Paketen/Bibliotheken. Bitte wenden Sie sich an unseren Support, damit wir diese für Sie installieren können.
3. Bereitstellung der Applikation
Die Schritte zum Bereitstellen Ihrer Anwendung hängen ganz von Ihrer Anwendung ab. Bei Django müssen Sie beispielsweise das Django-Paket installieren, daraufhin alle Dateien auf den Server hochladen und die Abhängigkeiten installieren:
-
Installieren Sie die Django-CLI:
(.venv) $ pip install Django
-
Kopieren Sie die Anwendungsdateien auf Ihren Server:
rsync -Hav --delete --exclude='node_modules/*' --exclude='logs/*' --exclude='.git/*' --exclude='.venv/*' ./local_project www-data @server.nine.ch:beispielapp/
-
Installieren Sie Ihre Abhängigkeiten:
(.venv) $ pip install -r requirements.txt
4. Anwendung als Dienst ausführen
Um sicherzustellen, dass ein Dienst nach einem Anwendungsabsturz oder einem System-neustart neu gestartet wird, sollte immer ein Systemd-Benutzerdienst verwendet werden. Die Konfiguration für eine solche Systemd-Dienst hängt von Ihrer Anwendung ab. Das folgende Beispiel geht davon aus, dass eine Django-App eingesetzt wird.
-
Erstellen Sie den Service in
~/.config/systemd/user/beispielapp.service
:[Unit]
Description=beispielapp
[Service]
WorkingDirectory=%h/beispielapp
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
Environment=PYTHON_VERSION=3.9.11
Environment=PATH=%h/.pyenv/versions/$PYTHON_VERSION/bin:$PATH
EnvironmentFile=%h/beispielapp/.env
ExecStart=%h/beispielapp/.venv/bin/uwsgi \
--module=beispielapp.wsgi:application \
--master \
--http=127.0.0.1:3000 \
--enable-threads \
--threads=2 \
--processes=4 \
--harakiri=20 \
--max-requests=5000 \
--vacuum \
--home=%h/beispielapp/.venv
[Install]
WantedBy=default.targetDiese Einstellungen variieren je nach System und Anwendung. Wir empfehlen, die offizielle Dokumentation für die Konfigurationsparameter und Best Practices zu konsultieren.
-
Starten Sie den Dienst:
touch ~/beispielapp/.env # Stellen Sie sicher, dass die Umgebungsdatei vorhanden ist
systemctl --user daemon-reload
systemctl --user enable beispielapp.service
systemctl --user start beispielapp.service
systemctl --user status beispielapp.service
5. Webserver konfigurieren
Die Anwendung wird jetzt auf einem lokalen Port ausgeführt. Um die Anwendung über Port 80/443 zu erreichen, muss der Webserver diese HTTP-Anforderungen an den uWSGI-Dienst weiterleiten.
Auf Ihrem Managed Server sind bereits zwei nine-manage-vhost-Templates für diesen Anwendungsfall vorinstalliert: proxy
und proxy_letsencrypt
.
-
Erstellen Sie einen neuen vHost und geben Sie den Port der Anwendungen über die Template-Variable mit:
$ sudo nine-manage-vhosts virtual-host create beispiel.com --template proxy --template-variable PROXYPORT=3000 --webroot ~/beispielapp/static
Virtual Host created: beispiel.com
beispiel.com
===========
DOMAIN: beispiel.com
USER: www-data
WEBROOT: /home/www-data/beispielapp/static
TEMPLATE: proxy
TEMPLATE VARIABLES: PROXYPORT
3000
ALIASES: www.beispiel.com
beispiel.com.server.nine.ch -
Erstellen und verwenden Sie ein Let's Encrypt-Zertifikat für HTTPS:
$ sudo nine-manage-vhosts certificate register-client --contact-email=mymail@beispiel.com
$ sudo nine-manage-vhosts certificate create --virtual-host beispiel.com
$ sudo nine-manage-vhosts virtual-host update beispiel.com --template=proxy_letsencrypt_https --template-variable PROXYPORT=3000
Fertig! Ihre Anwendung sollte über die Ports 80 und 443 erreichbar sein.
Alternative Python-Versionen installieren
Für mehr Flexibilität mit verschiedenen Python-Versionen, empfehlen wir die Verwendung von pyenv.
-
Führen Sie das Installationsskript von pyenv aus:
$ curl https://pyenv.run | bash
-
Fügen Sie den folgenden Inhalt zur
~/.bashrc
hinzu: `bashpyenv bei der Bash-Initialisierung laden
export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init --path)" eval "$(pyenv virtualenv-init -)" ` Bitte beachten Sie, dass diese Einstellungen je nach Shell variieren können!
-
Laden Sie die Shell neu:
$ exec "$SHELL"
-
Installieren Sie die gewünschte Python-Version:
$ pyenv install -v 3.9.11
$ pyenv global 3.9.11