Zum Hauptinhalt springen

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.

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

  1. Erstellen und aktivieren Sie ein neues virtuelles Environment:

    $ mkdir ~/beispielapp/ && cd ~/beispielapp/
    $ python -m venv .venv
  2. 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:

  1. Installieren Sie die Django-CLI:

    (.venv) $ pip install Django
  2. 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/
  3. 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.

  1. 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.target

    Diese Einstellungen variieren je nach System und Anwendung. Wir empfehlen, die offizielle Dokumentation für die Konfigurationsparameter und Best Practices zu konsultieren.

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

  1. 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
  2. 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.

  1. Führen Sie das Installationsskript von pyenv aus:

    $ curl https://pyenv.run | bash
  2. Fügen Sie den folgenden Inhalt zur ~/.bashrc hinzu: `bash

    pyenv 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!

  3. Laden Sie die Shell neu:

    $ exec "$SHELL"
  4. Installieren Sie die gewünschte Python-Version:

    $ pyenv install -v 3.9.11
    $ pyenv global 3.9.11