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:
# apt install nginx
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:
# mkdir /var/www/example
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:
# systemctl restart nginx
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:
# certbot --nginx
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.