Gunicorn
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 20.04 Focal Fossa
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Gunicorn 🇬🇧 ist ein in Python geschriebener HTTP-Webserver, der Python-Webapplikation, welche WSGI nutzen, ausliefert.
Der Server arbeitet nach dem Pre-Fork-Modell, d.h. es gibt einen Hauptserverprozess, der dann seinerseits "Worker-Prozesse" (auf Deutsch: Arbeiter-Prozesse) startet. Die Worker arbeiten dann die Anfragen an den Server ab.
Gunicorn kennt sowohl synchron als auch asynchron arbeitenden Worker (siehe Abschnitt Worker-Modelle). Gängige - und empfohlene - Praxis ist aber, dass der Gunicorn-Server hinter nginx arbeitet, welcher als Proxy-Server für Gunicorn agiert.
Installation¶
Gunicorn ist in den offiziellen Paketquellen enthalten, sowohl als Server als auch als Python-Modul. Allerdings ist die Version nicht die neuste Version und enthält nicht unbedingt alle sicherheitsrelevanten Patches. Von der ist die manuelle Installation via pip vorzuziehen.
Der Gunicorn-Server kann über das folgende Paket installiert werden[1]:
gunicorn3 (universe)
Befehl zum Installieren der Pakete:
sudo apt-get install gunicorn3
Oder mit apturl installieren, Link: apt://gunicorn3
Ein Vorteil diese Methode ist, dass das Logging direkt systemweit konfiguriert wird. D.h. Gunicorn loggt direkt nach /var/log/gunicorn und die Logdateien werden automatisch durch logrotate
archiviert.
Manuell¶
Guncorn kann auch manuell installiert werden. Der Server funktioniert auch bei einer Installation in einem virtual environment. Die Befehle lauten[2]:
pip3 install gunicorn
Asynchrone Worker¶
Wer Gunicorn mit asynchronen Workern betrieben möchte, der benötigt je noch gewünschtem Worker noch weitere Python-Module, welche über pip installiert werden müssen. Das Vorgehen ist recht einfach und in der Dokumentation 🇬🇧 von Gunicorn beschrieben.
Benutzung¶
Der allgemeine Befehl zum Starten des Server lautet:
gunicorn [OPTIONEN] APP
wobei APP
der Einstiegspunkt der WSGI-Applikation sein muss.
Werden keine Optionen angegeben, läuft Gunicorn mit den Rechten des Benutzers, der den Server gestartet hat. Der Server lauscht auf localhost
auf Port 8000 und läuft mit einem synchronen Worker.
Ein einfaches Beispiel einer WSGI-Applikation zum Testen des Server ist in der Dokumentation 🇬🇧 zu finden. Natürlich kann man die Applikation auch mit einem WSGI-kompatiblen Python-Webframework wie Bottle, Django oder Flask erstellen.
Optionen¶
Gunicorn kennt eine ganze Reihe von Optionen, im Folgenden sind einige davon erklärt:
Optionen von Gunicorn | |
Option | Erklärung |
-b ADRESSE , --bind ADRESSE | ADRESSE ist die IP-Adresse und der Port, auf dem Gunicorn lauschen soll. Standardwert ist 127.0.0.1:8000 (also Localhost und Port 8000). Möchte man, dass der Server sowie über eine IP4- also auch IP6-Adresse erreichbar ist, muss man die Option -b zweimal nutzen, einmal für IP4 und einmal für IP6 |
-w ANZAHL , --workers ANZAHL | Startet den Server mit ANZAHL Workern. Voreinstellung ist 1. Es wird empfohlen, nicht mehr als die 4-facher Anzahl der CPU-Kerne als Worker-Prozesse zu starten. |
-k WORKER , --worker-class WORKER | Gunicorn läuft mit der Worker-Modell worker . Wenn keine zusätzlichen Module für Worker installiert wurden, stehen sync (der synchrone Worker) und unter Python 3 gthread (ein asynchroner, thread-basierter Worker, der das Python-Modul Concurrent Futures 🇬🇧 nutzt). Standard ist sync . |
-c CONFIGDATEI , --config CONFIGDATEI | Lädt alle Optionen für die Konfiguration aus der Konfigurationsdatei CONFIGDATEI. Weitere Informationen dazu findet man in der Dokumentation 🇬🇧 |
Gunicorn kennt noch viele weitere Optionen, z.B. zum Logging, Begrenzen der maximalen Anzahl der Request etc. Alle Optionen findet man in der Dokumentation im Abschnitt Settings 🇬🇧.
Worker-Modelle¶
Wie bereits erwähnt, kennt Gunicorn synchrone und asynchrone Worker. Standardmäßig wird der synchrone Worker verwendet.
Der Einsatz von asynchronen Workern ist dann sinnvoll, wenn z.B. Gunicorn direkt über das Internet erreichbar ist (also kein anderer Webserver als Proxy vorgeschaltet ist), wenn das Generieren einer Antwort auf einen HTTP-Request relativ lange dauert (z.B. weil eine langwierige Berechnung erfolgt, wenn Daten gestreamt werden oder Web Sockets zum Einsatz kommen).
Eine ausführlichere Erklärung zum asynchronen und den asynchronen Workern ist auch in der Dokumentation im Kapitel Design 🇬🇧 zu finden.
Links¶
Homepage 🇬🇧
Quellcode 🇬🇧
mod_wsgi - Python WSGI-Applikationen über mod_wsgi und den Apache Webserver ausliefern
uWSGI 🇬🇧 - alternativer Server für Python WSGI-Applikationen