[[Vorlage(Getestet, jammy, focal)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:mit Root-Rechten arbeiten:] [:Editor:einen Editor öffnen] }}} [[Inhaltsverzeichnis()]] [[Bild(gunicorn_logo.jpg, 100, align=left)]] [http://gunicorn.org/ Gunicorn] {en} ist ein in [:Python:] geschriebener HTTP-Webserver, der Python-Webapplikation, welche [wikpedia:Web_Server_Gateway_Interface: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 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]: {{{#!vorlage Paketinstallation gunicorn3, universe }}} 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. == via pip == [[Vorlage(pipinstallation, 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 [http://docs.gunicorn.org/en/stable/install.html#async-workers Dokumentation] {en} von Gunicorn beschrieben. = Benutzung = Der allgemeine Befehl zum Starten des Server lautet: {{{#!vorlage Befehl 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 [http://docs.gunicorn.org/en/stable/run.html#gunicorn Dokumentation] {en} 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: {{{#!vorlage Tabelle <-2 tableclass="zebra_start3" rowclass="titel">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 [https://docs.python.org/3/library/concurrent.futures.html Concurrent Futures] {en} 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 [http://docs.gunicorn.org/en/stable/configure.html#configuration-file Dokumentation] {en} }}} 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 [http://docs.gunicorn.org/en/stable/settings.html Settings] {en}. == 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 zu den synchronen und asynchronen Workern ist auch in der Dokumentation im Kapitel [http://docs.gunicorn.org/en/stable/design.html Design] {en} zu finden. = Links = == intern == * [:waitress:] - alternativer, in Python geschriebener WSGI Applikationsserver == extern == * [http://www.gunicorn.org Homepage] {en} * [http://docs.gunicorn.org/en/stable/index.html Dokumentation] {en} * [github:benoitc/gunicorn:Quellcode] {en} * [:Apache/mod_wsgi:mod_wsgi] - Python WSGI-Applikationen über mod_wsgi und den Apache Webserver ausliefern * [https://uwsgi-docs.readthedocs.io/en/latest/ uWSGI] {en} - alternativer Server für Python WSGI-Applikationen #tag: Server, Python