NGINX als Proxy Server für Gunicorn unter Plesk einrichten

Andreas Kaiser
3 min readJun 10, 2017

--

Eine vermeintlich einfache Aufgabe stell sich im Zusammenspiel mit Plesk mal wieder als große Herausforderung heraus. Auf einem neuen Server sollte eine Subdomain eine Django Applikation ausliefern. Das Szenario ist Folgendes:

  • Django App läuft unter Gunicorn, Port 8000
  • Nginx ist als Proxy Server davorgeschaltet und soll auf Port 80 für diese Subdomain lauschen.

Im Prinzip nichts außergewöhnliches aber dank Plesk (ist zur Serververwaltung notwendig) wird es schwierig.

Django App und Gunicorn

Die Django App liegt auf dem Server im Verzeichnis:

/opt/django/myapp

Django selbst und alle benötigten Libs laufen in einem virtualenv.

Gunicorn ist folgendermaßen gestartet:

(django)/opt/django/myapp$ gunicorn -b 127.0.0.1:8000 -b 0.0.0.0:8000 myapp:app

Ein Aufruf von:

http://subdomain.domain.tld:8000

bringt auch die gewünschte Seite im Browser zur Anzeige.

Plesk Stolpersteine

Plesk bietet die Möglichkeit, neben dem Standard Webserver Apache auch noch Nginx zu installieren. Nginx liefert dann die statischen Dateien aus und dient als Proxy für Apache.

In dem gewünschten Szenario soll Nginx als Proxy für Gunicorn dienen. Das heißt, Nginx lauscht am Port 80 (dem Standardport) und leitet alle Aufrufe (außer für statische Inhalte wie Bilder, Javascript Dateien, css Dateien) in Richtung Gunicorn Port 8000 weiter.

Bei einer Serververwaltung ohne Plesk, also nur durch die Kommandozeile, stellt das o.g. Szenario kein Problem dar. Die Verwaltung über Plesk bietet aber auf der einen Seite Komfort, auf der anderen Seite gestalten sich einfache Sachen kompliziert. Einfach mal so eine Konfigurationsdatei anpassen funktioniert nicht. Plesk hat für fast alle Konfigurationen seine eigenen Konfigurationsdateien und überschreibt Änderungen, welche außerhalb von Plesk vorgenommen wurden gnadenlos. Ruft man diese Konfigurationsdateien in einem Editor auf um sie zu ändern, wird man im Header der Datei auch davor gewarnt.

Plesk Version

Mit der installierten Version von Plesk 12.5 kam ich zu keinem Ergebnis. Deshalb werde ich auch nicht weiter darauf eingehen. Also das verfügbare Plesk Update auf die Version 17.x (Onyx) durchführen. Nur hier kann Nginx als Server ohne Apache eingestellt werden.

Das Update von Plesk 12.5 auf Plesk 17.x verlief ohne Probleme (ich rede hier von einem V-Server gehostet bei Strato).

Plesk Einstellungen (Version 17.x Onyx)

Da außer Django Anwendungen bei dieser (Sub)Domain keine anderen Scriptsprachen zum Einsatz kommen sollen habe ich unter: Hosting Einstellungen für diese (Sub)Domain alles ausgeschaltet.

Nicht wundern, dass die Python-Unterstützung auch ausgeschaltet ist. Django basiert ja auf Python wird aber nicht durch Apache bedient, sondern durch Gunicorn. Apache soll ja keine Rolle in diesem Szenario spielen.

Für die betreffende (Sub)Domain dann unter Websites & Einstellungen zum Punkt Einstellungen für Apache & nginx wechseln.

Hier müssen jetzt folgende Einstellungen vorgenommen werden (wichtig ist nur der Bereich nginx-Einstellungen):

Entscheidend ist, dass das Häkchen bei Proxymodus nicht gesetzt ist! Nur so arbeitet Nginx ohne Apache!

Anpassen der Nginx Konfiguration

Wie schon geschrieben, werden die Konfigurationsfiles durch Plesk generiert und eigene Änderungen darin werden überschrieben. Unter den Zusätzlichen nginx-Anweisungen habe ich folgendes eingefügt:

## Set the location routing.
location / {
try_files $uri @django;
}

location @django {
proxy_pass http://127.0.0.1:8000;
}

# serve static files

location /static/ {
alias /opt/django/myapp/static/;
}

Um diese paar Zeilen ging es eigentlich nur. :-( Die Datei findet man dann in dem Pfad:

/var/www/vhosts/system/<sub-domain-name>/conf/vhost_nginx.conf

Wichtig ist, dass diese Datei nicht automatisch von Plesk überschrieben wird.

Mit diesen Einstellungen läuft die Django App ohne Problem hinter Nginx und Gunicorn.

Schlussbemerkungen

Im Adminbereich fehlten noch alle statischen Files. Hier half ein einfaches:

$ python manage.py collectstatic

im Pfad der Django App.

Über Anregungen und Kommentare würde ich mich wie immer sehr freuen!

Originally published at Mosenturm Blog.

--

--

Andreas Kaiser

Python, Django, HTML5, Javascript, Software Entwicklung / Schulungen