Flask-Anwendung mit uWSGI, Nginx und SSL auf Debian 10 bereitstellen

Wenn du eine Webanwendung mit Flask entwickelst, wirst du schnell feststellen, dass der integrierte Server hauptsächlich für Entwicklungszwecke gedacht ist. In dieser Anleitung zeigen wir dir, wie du dein Flask-Projekt auf einem Debian-10-Cloudserver mit Nginx als Reverse Proxy, uWSGI als Applikationsserver und Certbot für eine SSL-Verschlüsselung betreibst.

Voraussetzungen für das Flask-Hosting auf Debian 10

  • Ein vollständig aktualisiertes Debian-10-System
  • Root-Rechte oder Sudo-Zugriff
  • Ein Domainname ist optional, wird aber empfohlen

Du kannst die Einrichtung auch ohne Domain durchführen, indem du localhost in der Nginx-Konfiguration verwendest. In diesem Fall ist es jedoch nicht möglich, ein gültiges SSL-Zertifikat über Certbot zu erhalten – diesen Schritt solltest du dann überspringen.

Schritt 1: Nginx unter Debian 10 installieren

Installiere das Nginx-Paket mit folgendem Befehl:

Nach der Installation kannst du die Funktion testen, indem du die IP-Adresse deines Servers im Browser aufrufst. Die Standard-Startseite von Nginx sollte angezeigt werden.

Wenn du eine Domain besitzt, richte die DNS-Einträge entsprechend ein. In diesem Beispiel werden folgende Werte verwendet:

  • IPv4-Adresse: 192.0.2.123
  • Servernamen: example.com und www.example.com

Schritt 2: Flask installieren und uWSGI konfigurieren

Installiere zunächst die benötigten Python-Entwicklungstools sowie Flask und uWSGI:

  # apt install python3-pip python-dev
  # pip3 install uwsgi flask

Erstelle danach ein Verzeichnis, in dem deine Website-Dateien liegen sollen:

Falls du bereits eine Flask-Anwendung hast, verschiebe diese in das Verzeichnis /var/www/example. Alternativ kannst du zum Testen folgende einfache Anwendung erstellen:

  # nano /var/www/example/main.py

Füge diesen Code in die Datei ein:

  from flask import Flask
  app = Flask(__name__)

  @app.route("/")
  def index():
      return "Hello World!"

  if __name__ == "__main__":
      app.run(host="0.0.0.0")

Jetzt richtest du eine Konfigurationsdatei für uWSGI ein:

  # nano /var/www/example/config-uwsgi.ini

Trage folgenden Inhalt in die Datei ein:

  [uwsgi]

  app = main
  module = %(app)
  callable = app

  socket = /var/www/example/example.sock
  chdir = /var/www/example
  chmod-socket = 666

  processes = 4
  die-on-term = true

Für leistungsfähigere Server kannst du den Wert bei processes entsprechend erhöhen.

 

Schritt 3: Nginx für Flask und uWSGI einrichten

Beginne damit, die Standardkonfiguration von Nginx zu löschen:

  # rm /etc/nginx/sites-enabled/default

Erstelle anschließend eine benutzerdefinierte Nginx-Konfigurationsdatei:

  # nano /var/www/example/config-nginx.conf

Füge die folgende Konfiguration in die Datei ein. Falls du keine Domain verwendest, ersetze example.com und www.example.com durch localhost bei server_name:

  server {

      listen 80;
      listen [::]:80;

      server_name example.com www.example.com;

      location / {
          include uwsgi_params;
          uwsgi_pass unix:/var/www/example/example.sock;
      }
  }

Erstelle nun einen symbolischen Link, damit Nginx diese Konfiguration erkennt, indem du sie mit dem Verzeichnis conf.d verknüpfst:

  # ln -s /var/www/example/config-nginx.conf /etc/nginx/conf.d/

Um die neuen Einstellungen zu aktivieren, starte den Nginx-Dienst neu:

Schritt 4: uWSGI-Applikationsserver starten

Obwohl Nginx jetzt korrekt konfiguriert ist, um Anfragen an uWSGI weiterzuleiten, läuft der uWSGI-Dienst selbst noch nicht. Verwende nohup, um ihn im Hintergrund zu starten:

  # nohup uwsgi /var/www/example/config-uwsgi.ini &

Nach dem Start kannst du mit Strg + C ein SIGINT-Signal senden. Der uWSGI-Prozess sollte weiterhin im Hintergrund laufen. Für den produktiven Betrieb empfiehlt es sich, uWSGI beim Systemstart automatisch über einen systemd-Dienst ausführen zu lassen.

Rufe nun im Browser die Adresse deines Servers auf. Du solltest dort die Ausgabe Hello World! von deiner Flask-Anwendung sehen.

Schritt 5: Flask-Anwendung mit SSL absichern

Wenn du eine öffentliche Domain nutzt, kannst du die Website mit einem kostenlosen SSL-Zertifikat absichern.

Installiere zuerst Certbot zusammen mit dem passenden Plugin für Nginx:

  # apt install certbot python-certbot-nginx

Fordere anschließend das SSL-Zertifikat an:

Folge den Anweisungen von Certbot. Akzeptiere die Nutzungsbedingungen und wähle alle Domains aus, für die ein Zertifikat generiert werden soll (mit Enter bestätigen).

Wenn du gefragt wirst, ob HTTP-Anfragen automatisch auf HTTPS umgeleitet werden sollen, wähle die entsprechende Option zur Weiterleitung aus.

Fazit

Mit dieser verständlichen Anleitung läuft deine Flask-Webanwendung jetzt erfolgreich auf einem Debian-10-Server – betrieben über Nginx und uWSGI und geschützt durch ein SSL-Zertifikat von Certbot. Für den produktiven Einsatz solltest du uWSGI so einrichten, dass es beim Start automatisch unter einem Benutzer mit eingeschränkten Rechten ausgeführt wird. Weitere Empfehlungen findest du in der offiziellen Dokumentation von Flask und uWSGI.

Quelle: vultr.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren: