NGINX und Gunicorn

NGINX

NGINX (ausgeprochen „engine x“) ist ein unter BSD-Lizenz stehender Webserver und Reverse Proxy. Die Software NGINX ist 2004 erschienen und wurde von Igor Sysoev entwickelt. Sie beinhaltet einen Webserver, E-Mail-Proxy und Reverse Proxy und steht unter BSD-Lizenz. Wesentliche Merkmale von NGINX sind der schonende Umgang mit den Serverressourcen und die hohe Performance.

NGNIX muss als Erstes eingerichtet werden, damit ein Webserver zur Verfügung steht.

Gestartet wird NGINX mit:

sudo systemctl start nginx

Gestoppt wird NGINX mit:

sudo systemctl stop nginx

Neustart von NGINX mit:

sudo systemctl restart nginx

Statusabfrage von NGINX mit:

sudo systemctl status nginx

Der NGINX-Server hat eine völlig andere Konfiguration als der Apache-Webserver. Darum ist es wichtig NGINX zu verstehen, wenn man ihn konfigurieren will.

Ich kann Ihnen das Tuturial Nginx Server- und Standortblockauswahlalgorithmen verstehen nur empfehlen, wenn Sie bisher noch nichts mit NGNIX gemacht haben.


NGNIX Einrichtung für Gunicorn

Damit wir den Webserver auf Port 80 und für die mit Flask programmierte Seite separat abfragen können, brauchen wir zwei verschiedene IP-Adressen oder Ports.

Ich verwende dazu folgende Ports:

  • Port 80 HTTP-Webserver
  • Port 800 HTTP-Webserver über Gunicorn
  • Port 8000 Gunicorn
  • Port 5000 Spyder IDE (Entwicklungsumgebung)

NGINX-Konfigurationsdatei für die Ausgabe der Daten über Gunicorn:

/etc/nginx/sites-available/mynginx:

server {
	listen 800;
	# LTE geht nur über IP4
	# listen [::]:800;

	server_name 0.0.0.0 127.0.0.1;

	# Gunicorn
	
	location = /favicon.ico {
		access_log off;
		log_not_found off;
		}
	
	location / {
       proxy_pass http://localhost:8000;
       }
}


Beschreibung: mynginx

  • listen 800;
    Der Server läuft auf Port 800. Das ist erforderlich, da der normale Webserver auf Port 80 läuft und ich keinen öffentlichen Servernamen vergeben konnte. Damit ist der Server mit [IP-Adresse]:800 erreichbar.
    .
  • # listen [::]:800;
    IP6 ist abgeschaltet, da LTE nur IP4 kann und interne IP-Adressen nutzt. Darum läuft auf dem Raspberry Pi 4B auch noch ein WireGuard Client, um die Verbindung nach außen herzustellen.
    .
  • server_name 0.0.0.0 127.0.0.1;
    Der Server ist für alle externen IP-Adressen und localhost erreichbar.
    Hinweis:
    Da der Server hinter einer Mobilfunkanbindung (LTE) läuft und nur über WireGuard erreichbar ist, können nur die VPN-Nutzer darauf zugreifen.
    .
  • location = /favicon.ico { access_log off; log_not_found off; }
    Fehlermeldungen durch Browser von favicon.ico im Log abschalten.
    .
  • location / { proxy_pass http://localhost:8000; }
    Gunicorn sendet die Daten auf localhost:8000. Dadurch kann Gunicorn direkt nur auf localhost abgefragt werden. Der Port ist auch praktisch zur Fehlersuche, falls mal etwas nicht funktioniert.

Diese Datei wird unter /etc/nginx/sites-available/mynginx abgespeichert.
Damit sie aktiv wird, muss ein Link nach /etc/nginx/sites-enabled/mynginx gemacht werden.

Das erzeugen wir im Terminal mit dem Befehl:

sudo ln -s  /etc/nginx/sites-available/mynginx  /etc/nginx/sites-enabled/mynginx

Durch diese Konfiguration erreichen Sie auf Ihrem Webserver die Seiten, die unter /var/www/html liegen, über Port 80 und die Seiten zum Steuern der Relais mit Flask und Gunicorn über Port 800.

Wichtiger Hinweis:
Verwenden Sie NICHT Firefox, er hat einen Fehler und nimmt den Port (:800) bei der Abfrage nicht mit.

Chromium funktioniert.


Gunicorn

Gunicorn soll hier nicht über einen Service, sondern über http://localhost: 8000 kommunizieren. Zum Schalten des Relais ist das performant genug und erleichtert die Fehlersuche, wenn mal etwas nicht funktioniert.

Die Konfiguration dafür erfolgt in der Datei:

/etc/systemd/system/gunicorn.service:

[Unit]
# Klaus Munsteiner 2022-05-04
Description=Gunicorn starten
After=network.target

[Service]
# Korrekten User eintragen
User=pi
Group=www-data
ExecStart=/usr/bin/gunicorn --bind localhost:8000 --pythonpath /var/www/html/relais-steuern/ relais:app

[Install]
WantedBy=multi-user.target

Damit Gunicorn bei jedem Systemstart gestartet wird, muss es in systemctl aktiviert werden.
Das erfolgt im Terminal mit dem Befehl:

sudo systemctl enable gunicorn.service

Als Antwort sehen Sie, dass ein Link angelegt wurde:

Created symlink /etc/systemd/system/multi-user.target.wants/gunicorn.service /etc/systemd/system/gunicorn.service.

Jetzt noch Gunicorn starten:

sudo systemctl start gunicorn.service

Abfragen, ob alles richtig funktioniert:

sudo systemctl status gunicorn.service

Wenn Sie mal etwas im Code geändert haben, müssen Sie Gunicorn neu starten:

sudo systemctl restart gunicorn.service

Zum Schluss machen Sie ein Reboot, fragen im Browser mit localhost ab, ob NGINX läuft und im Terminal überprüfen Sie den Status von Gunicorn.


Programm

Damit Sie schnell ein Erfolgserlebnis sehen, habe ich Ihnen ein komplettes Programmpaket zusammengestellt. Dieses können Sie einfach abändern.

  • Das Programm befindet sich im Verzeichnis /relais-steuern.
  • index.html beinhaltet den Aufruf auf Port 80 und die Auswahlmöglichkeiten über die verschiedenen Ports.
  • relais.py ist das Flask-Programm, das aufgerufen wird.
  • /templates: Hier finden Sie relais.html, das über relais.py eingebunden wird.
  • /static:
    • relais.css: Stylsheet
    • relais1_off.js – relais3_on.js: Javascript für die Tastensteuerung
    • /jquery: jquery.min.js, ggf. durch neuere Version ersetzen und Eintrag in relais.html ändern.

Installieren

Sie können ein eigenes Unterverzeichnis in Ihrem Home-Verzeichnis anlegen.
Wenn Sie es im Verzeichnis des Webservers unter /var/www/html installieren, ist es direkt vom Webserver zu erreichen.


Rechte

  • Der User muss zusätzlich in der Gruppe www-data sein.
  • Setzen Sie die Dateirechte User rw und Gruppe www-data rw, da auch noch Cache in das Verzeichnis geschrieben wird.

Sonstiges

Wenn Sie Gunicorn über Socket einrichten wollen, empfehle ich Ihnen folgende Webseite:
Gunicorn 3 mit systemd + nginx einrichten

Weiter: Spyder IDEUpdate: 24.01.2023