Ubuntu 16.04 Xenial Xerus
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.
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 gegebenenfalls vorzuziehen.
Der Gunicorn-Server kann über das folgende Paket installiert werden[1]:
gunicorn (universe)
mit apturl
Paketliste zum Kopieren:
sudo apt-get install gunicorn
sudo aptitude install gunicorn
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.
Guncorn kann sowohl für Python 2.7 als auch Python 3 manuell installiert werden. Der Server funktioniert auch bei einer Installation in einem virtual environment. Die Befehle lauten[2]:
pip3 install gunicorn #für Python 3 pip install gunicorn #für Python 2.7
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.
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.
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 .
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.
Diese Revision wurde am 8. September 2016 17:13 von verdooft erstellt.