GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Richten Sie Django mit Postgres, Nginx und Gunicorn auf Ubuntu 18.04 ein

Django ist ein vielseitiges, leistungsstarkes, effizientes und sich ständig weiterentwickelndes Python-basiertes Webanwendungs-Framework, mit dem Sie Ihre Webanwendung zum Laufen bringen können. Es ist ein beliebtes Web-Framework und wird normalerweise mit einem Entwicklungsserver geliefert, der zum lokalen Testen Ihres Codes verwendet wird. Wenn Sie beabsichtigen, Ihre Anwendungen in die Produktion zu bringen, ist ein robusterer und sicherer Webserver erforderlich.

In diesem Leitfaden führen wir Sie durch die Kunst der professionellen Bereitstellung und Konfiguration von Django auf effizientere und widerstandsfähigere Weise. Wir installieren und konfigurieren die PostgreSQL-Datenbank anstelle der SQLite-Datenbank und integrieren den Gunicorn-Anwendungsserver, der eine Schnittstelle zu den Anwendungen bildet. Später werden wir mit der Einrichtung des NGINX-Webservers fortfahren, der einen Reverse-Proxy-Kanal zum Gunicorn-Server bereitstellt und uns so die erforderlichen Leistungs- und Sicherheitskomponenten für unsere Anwendungen bereitstellt.

Voraussetzungen

Bevor wir beginnen, führen wir einen kurzen Flugtest durch und stellen sicher, dass wir Folgendes haben

  • Eine frische Ubuntu 18.04-Serverinstanz
  • Ein Nicht-Root-Benutzer mit sudo-Berechtigungen. In dieser Anleitung verwenden wir james
  • SSH-Zugriff auf den Server

Ziele

Hier ist ein kurzer Überblick darüber, was wir erreichen wollen. Wir werden Django in einer virtuellen Umgebung installieren. Dadurch können Projekte getrennt von der Hostumgebung bearbeitet werden. Anschließend beginnen wir mit der Installation und Konfiguration des Gunicorn-Anwendungsservers, der die Anwendung verbindet und Anfragen im HTTP-Protokoll in Python-Aufrufe übersetzt, die unsere Anwendung verarbeiten kann. Schließlich werden wir Nginx einrichten, einen Hochleistungs-Webserver mit unzähligen Sicherheitskomponenten, die die Sicherheit unserer Anwendungen erhöhen werden.

Erste Schritte

Zu Beginn beginnen wir mit der Aktualisierung unserer Ubuntu-Repositories

$ sudo apt-get update

Als nächstes werden wir die erforderlichen Softwarepakete für alle Anwendungen, die wir konfigurieren werden, herunterladen und installieren. Dazu gehören der Pip-Paketmanager, PostgreSQL und Nginx.
Wenn Sie Django mit Python3 ausführen, lautet die Syntax

$ sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx

Wenn auf Ihrem System Python2 ausgeführt wird, lautet der Befehl:

$ sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx

Beispielausgabe

Der Befehl installiert den Pip-Paketmanager, alle notwendigen Python-Entwicklungsdateien, die zum Erstellen von Gunicorn, des Nginx-Webservers, der Postgres-Datenbank und der wichtigen Bibliotheken erforderlich sind, die für die Interaktion mit der Datenbank-Engine erforderlich sind.

Nach erfolgreicher Installation aller erforderlichen Softwarepakete ist es nun an der Zeit, eine Datenbank und einen Benutzer für die Django-Webanwendung anzulegen

PostgreSQL-Datenbank und Datenbankbenutzer erstellen

Lassen Sie uns jetzt gleich loslegen und eine Datenbank und einen Benutzer für die Django-Anwendung erstellen
Melden Sie sich bei Postgres an und führen Sie den Befehl aus

$ sudo -u postgres psql

Sie gelangen zur Postgres-Eingabeaufforderung, wie in der Ausgabe zu sehen ist

Erstellen Sie eine Datenbank für Ihr Projekt. In diesem Fall lautet der Datenbankname „Projekt“.

postgres=# CREATE DATABASE project;

Beispielausgabe

HINWEIS! Alle Befehle in PostgreSQL müssen mit einem Semikolon abgeschlossen werden.

Legen Sie nach erfolgreicher Erstellung der Datenbank einen Benutzer für das Django-Projekt an und vergeben Sie unbedingt ein sicheres Passwort. In diesem Fall ist der Benutzer projectuser

Ersetzen Sie das Attribut „Passwort“ durch Ihr eigenes starkes Passwort.

postgres=# CREATE USER projectuser WITH PASSWORD 'password';

Beispielausgabe

Um die Einrichtungsparameter von Django für die Datenbankverbindung zu bestätigen, gehen wir wie folgt vor:

  1. Standardkodierung auf UTF-8 setzen
  2. Setzen Sie das Isolationsschema auf den Wert „Read Committed“
  3. Zeitzone auf UTC einstellen

Führen Sie die folgenden Befehle aus, um die Setup-Anforderungen zu erfüllen


postgres=# ALTER ROLE projectuser SET client_encoding TO 'utf8';
postgres=# ALTER ROLE projectuser SET default_transaction_isolation TO 'read committed';
postgres=# ALTER ROLE projectuser SET timezone TO 'UTC';

Lassen Sie uns nun unserem neu erstellten Benutzer Datenbankzugriff gewähren

postgres=# GRANT ALL PRIVILEGES ON DATABASE project TO projectuser;

Beispielausgabe

Jetzt können Sie die Postgres-Umgebung verlassen.

postgres=# \q

Erstellen einer virtuellen Python-Umgebung für Ihr Django-Projekt

Zur einfacheren Verwaltung unserer Anwendung werden wir die erforderlichen Python-Voraussetzungen in einer virtuellen Umgebung installieren.
Aber zuerst installieren wir die virtuelle Umgebung
Wenn auf Ihrem System Python3 ausgeführt wird, aktualisieren Sie pip, indem Sie es ausführen

$ sudo -H pip3  install --upgrade pip

Für ein System, das auf Python2 läuft, run

$ sudo -H pip install --upgrade pip

Beispielausgabe

Installieren Sie danach die virtuelle Umgebung mit pip

$ sudo -H pip install virtualenv

Beispielausgabe

Nachdem unsere virtuelle Umgebung vorhanden ist, werden wir sie jetzt erstellen und uns darin bewegen


$ mkdir ~/project
$ cd ~/project

Erstellen Sie jetzt eine virtuelle Python-Umgebung

virtualenv projectenv

Beispielausgabe

Dadurch wird ein Verzeichnis namens projectenv erstellt innerhalb des Projektverzeichnisses.

Aktivieren Sie vor der Installation der Python-Anforderungen die virtuelle Umgebung

$ source projectenv/bin/activate

Beispielausgabe

Beachten Sie, wie sich die Eingabeaufforderung in (projectenv)james@ubuntu: ~/project$ ändert

Lassen Sie uns bei aktiver virtueller Umgebung Gunicorn, Django und den Psycopg2 Postgres-Adapter mit pip installieren.

$ pip install django gunicorn psycopg2-binary

Beispielausgabe

Erstellen und Konfigurieren eines neuen Django-Projekts

An dieser Stelle weisen wir Django an, Projektdateien in dem bereits erstellten Projektverzeichnis zu installieren. Neben einem Verwaltungsskript wird ein Verzeichnis der zweiten Ebene erstellt.
Um dies zu erreichen, führen Sie den folgenden Befehl aus.

$ django-admin.py startproject project ~/project 

Unser Projektverzeichnis, in diesem Fall ~/project sollte folgenden Inhalt haben


manage.py      -  Django’s Python management script
project             - directory containing Django’s project package
projectenv      - Virtual environment directory that was earlier created

 

Beispielausgabe

Konfiguration der Projektdateien anpassen

Wir werden die Einstellungsdatei öffnen

vim ~/project/settings.py

Scrollen Sie nach unten und halten Sie Ausschau nach dem Attribut „ALLOWED HOSTS“. Geben Sie innerhalb der eckigen Klammern die IP-Adresse des Servers an und hängen Sie das Attribut „localhost“ an.

Beispielausgabe

Suchen Sie als Nächstes den Abschnitt „DATENBANKEN“. Passen Sie die Einstellungen an die PostgreSQL-Datenbankinformationen an. Dazu gehören der Datenbankname, der Benutzer und das Passwort des Benutzers.

Beispielausgabe

Scrollen Sie als Nächstes nach unten und geben Sie den Speicherort der statischen Dateien an. Dies ist wichtig, damit Nginx Anforderungen für diese Elemente nahtlos bearbeiten kann. Aus dem Snippet unten werden statische Dateien in einem Verzeichnis namens „static“ abgelegt

Speichern und beenden.

Erste Projekteinrichtung abschließen

Lassen Sie uns nun das Datenbankschema in unsere PostgreSQL-Datenbank migrieren


~/project/manage.py makemigrations

Beispielausgabe


~/project/manage.py migrate
 

Beispielausgabe


Als Nächstes erstellen wir einen Superuser für das Django-Projekt, indem wir den folgenden Befehl ausführen

~/project/manage.py createsuperuser 

Sie werden wie unten gezeigt zur Eingabe eines Benutzernamens, einer E-Mail-Adresse und eines Passworts aufgefordert

Beispielausgabe

Nach erfolgreicher Erstellung des Superusers können wir nun statische Inhalte im Verzeichnis speichern

~/project/manage.py collectstatic

Beispielausgabe

Diese statischen Dateien werden im ‘static’ platziert Verzeichnis im Projektordner.

Um den Entwicklungsserver zu testen, werden wir einen Port zulassen, in diesem Fall Port 8000, der für den Zugriff auf die Anwendung über einen Webbrowser verwendet wird.

Um den Port zu öffnen, führen wir

aus
sudo ufw allow 8000

Starten Sie abschließend den Django-Entwicklungsserver in der virtuellen Umgebung, indem Sie

ausführen
~/project/manage.py runserver 0.0.0.0:8000

Öffnen Sie Ihren Webbrowser und besuchen Sie die Adresse Ihres Servers

In diesem Fall lautet die Adresse unseres Servers

https://38.76.11.180/

Sie sollten die folgende Indexseite von Django sehen können

Beispielausgabe

Lassen Sie uns jetzt /admin an das Ende der URL anhängen, um zur Anmeldeseite zu gelangen

https://38.76.11.180/admin

Beispielausgabe

Geben Sie die Anmeldeinformationen ein, die Sie beim Erstellen des Superuser-Kontos angegeben haben, und klicken Sie auf „Anmelden“

Dies bringt uns zum Admin-Panel von Django

Beispielausgabe

Groß! Nachdem wir nun bestätigt haben, dass Django betriebsbereit ist, drücken wir CTRL + C auf dem Terminal, um die Anwendung zu beenden

Bestätigung der Fähigkeit von Gunicorn, das Projekt zu testen

Bevor wir die virtuelle Umgebung verlassen, überprüfen wir, ob unser Gunicorn-Anwendungsserver Django bedienen kann.
Während wir uns noch im Projektverzeichnis befinden, laden wir das WSGI-Modul

gunicorn --bind 0.0.0.0:8000 project.wsgi

Dadurch wird Gunicorn auf derselben Schnittstelle und demselben Port gestartet, auf dem der Django-Server ausgeführt wurde. Sie können zurückgehen und überprüfen, ob die Django-Anwendung im Webbrowser ausgeführt wird.

Wenn Sie damit fertig sind, drücken Sie STRG + C, um die Anwendung zu stoppen, und führen Sie den Deaktivierungsbefehl aus, um die virtuelle Umgebung zu verlassen.

Nachdem wir getestet haben, dass der Gunicorn-Anwendungsserver unsere Django-Anwendung bedienen kann, ist es an der Zeit, einen robusteren Weg zum Starten und Stoppen des Anwendungsservers zu implementieren.
Wir werden eine systemd-Dienstdatei mit Gunicorn erstellen, indem wir den folgenden Befehl verwenden

 $ sudo vim /etc/systemd/system/gunicorn.service

Beginnen Sie mit dem Abschnitt [Unit] und fügen Sie den folgenden Inhalt ein


[Unit]
Description=gunicorn daemon
After=network.target

Dieser Abschnitt spezifiziert Abhängigkeiten und Metadaten

Erstellen Sie als Nächstes den [service] Abschnitt.

In diesem Abschnitt geben wir den Benutzer und die Gruppe an, unter denen der Prozess ausgeführt werden soll. In diesem Fall ist der Benutzer root und die Gruppe www-data. Die Gruppe wird als www-data angegeben, damit Nginx nahtlos mit Gunicorn kommunizieren kann.

Der vollständige Pfad zur ausführbaren Gunicorn-Datei wird dann angezeigt. Da Nginx auf demselben Server installiert ist, binden wir es an einen Unix-Socket.

Fügen Sie den folgenden Inhalt ein


[Service]
User=james
Group=www-data
WorkingDirectory=/home/james/project
ExecStart=/home/james/project/projectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/james/project/project.sock project.wsgi:application

Erstellen Sie abschließend den Abschnitt [Install] und hängen Sie die folgenden Zeilen an


[Install]
WantedBy=multi-user.target

Groß! Jetzt ist unsere systemd-Dienstdatei vollständig.

Speichern und schließen Sie den Texteditor. Starten Sie den Gunicorn-Dienst neu und lassen Sie ihn beim Booten starten


$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn

Um den Status von Gunicorn Run zu überprüfen

$ systemctl status gunicorn

Beispielausgabe

Prüfen Sie, ob die Gunicorn Socket-Datei vorhanden ist

Nachdem wir überprüft haben, dass Nginx betriebsbereit ist, überprüfen wir die Existenz der Datei project.sock in unserem Projektverzeichnis

$ ls -l /home/james/project

Beispielausgabe

HINWEIS:

Wenn die Datei project.sock fehlt, ist dies ein Indikator dafür, dass Gunicorn nicht korrekt gestartet werden konnte.
Außerdem können Sie die Gunicorn-Protokolle überprüfen, indem Sie den folgenden Befehl ausführen

$ sudo journalctl -u gunicorn

Es gibt eine Reihe von Gründen, warum Nginx die Datei project.sock nicht hätte erstellen können. Einige beinhalten

  1. Projektdateien gehören dem Root-Benutzer statt dem sudo-Benutzer
  2. Das Arbeitsverzeichnis innerhalb von /etc/systemd/system/gunicorn.service zeigt nicht auf das Projektverzeichnis.
  3. Falsche Konfigurationen in der ExecStart-Direktive

Wenn alle Konfigurationen in Ordnung sind, sollten Sie nach dem Ausführen keine Fehler erhalten

$ sudo journalctl -u gunicorn

Sobald Sie Änderungen an /etc/systemd/system/gunicorn.service vorgenommen haben stellen Sie sicher, dass Sie den Daemon-Dienst neu laden, damit die Änderungen wirksam werden


$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn

Nginx so konfigurieren, dass der Datenverkehr an Gunicorn geleitet wird

Die letzte Phase in diesem Leitfaden ist die Konfiguration des Nginx-Webservers, um den Webdatenverkehr an den Gunicorn-Dienst zu leiten

Wir erstellen und öffnen einen neuen Serverblock in sites-available Verzeichnis

$ sudo vim /etc/nginx/sites-available/project

Beginnen Sie mit der Angabe, dass dieser Block auf Port 80 lauschen und auf die IP-Adresse des Servers antworten soll.


server {
    listen 80;
    server_name server_domain_or_IP;
}

 

Als Nächstes weisen wir Nginx an, alle Probleme beim Auffinden des Favicons zu ignorieren. Außerdem teilen wir ihm mit, wo statische Assets zu finden sind, die in ~/project/static gesammelt wurden Verzeichnis


location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/james/project;
    }

Zuletzt erstellen wir einen Blockstandort / { } die mit den restlichen Anfragen übereinstimmt.
Innerhalb dieses Speicherorts werden wir die Datei proxy_params definieren und später den Datenverkehr an den vom Gunicorn-Prozess erstellten Socket leiten


location / {
        include proxy_params;
        proxy_pass https://unix:/home/james/project/project.sock;
    }
 

Die endgültige Konfigurationsdatei sollte in etwa so aussehen

Speichern und beenden Sie die Konfigurationsdatei

Aktivieren wir die Datei, indem wir sie mit dem Verzeichnis „sites-enabled“ verknüpfen

$ sudo ln -s /etc/nginx/sites-available/project /etc/nginx/sites-enabled

Lassen Sie uns als Nächstes unsere Konfiguration auf Fehler testen

$ sudo nginx -t

Wenn alles gut gegangen ist, sollte die Ausgabe wie unten gezeigt aussehen

Nach dem Testen der Nginx-Konfiguration

$ sudo systemctl restart nginx

Jetzt, da wir keinen Zugriff mehr auf den Entwicklungsserver auf Port 8000 benötigen, entfernen wir die Regel auf der Firewall.

$ sudo ufw delete allow 8000

Lassen Sie uns auch Port 80 zulassen

$ sudo ufw allow 'Nginx Full'

Sie sollten jetzt zur Domain oder IP-Adresse Ihres Servers gehen können, um Ihre Anwendung anzuzeigen, ohne Port 8000 anzugeben

Tipps mit Problemen

1.Server zeigt Nginx-Standardseite an

Wenn Nginx die Standardseite anzeigt, anstatt an die Django-Anwendung weiterzuleiten, müssen Sie /etc/nginx/sites-available/project überprüfen Datei und stellen Sie sicher, dass die IP oder der Domänenname Ihres Servers korrekt angegeben ist. Die Standardseite impliziert, dass Nginx Ihre Anfrage nicht erfüllen konnte und stattdessen auf /etc/nginx/sites-available/default zurückgegriffen hat

2. 502 Bad Gateway-Fehler anstelle der Django-Anwendung

Ein 502-Fehler ist ein Hinweis darauf, dass der Nginx-Webserver die Anfrage nicht erfolgreich weiterleiten konnte. Um das Problem genau zu beheben, überprüfen Sie die Protokolle in der Fehlerprotokolldatei wie gezeigt, und dies könnte Ihnen einen Hinweis darauf geben, was falsch sein könnte.

$  sudo tail -F /var/log/nginx/error.log

3. „Verbindung zum Server konnte nicht hergestellt werden“ Verbindung abgelehnt

Ein Fehler, auf den Sie möglicherweise stoßen, wenn Sie versuchen, auf bestimmte Komponenten in Ihrem Webbrowser zuzugreifen, ist

OperationalError at /admin/login/
could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?

Dies zeigt, dass die Django-Anwendung keine Verbindung zur Postgres-Datenbank herstellen kann
Stellen Sie durch Ausführen sicher, dass Postgres ausgeführt wird

$ sudo systemctl status postgresql

Wenn es nicht läuft, starten Sie es und aktivieren Sie es, um es beim Booten zu starten


$ sudo systemctl start postgresql
$ sudo systemctl enable postgresql

Wenn Sie weiterhin Probleme haben, stellen Sie sicher, dass die Datenbankeinstellungen in
~/myproject/myproject/settings.py sind richtig.

Untersuchen Sie zur weiteren Fehlerbehebung die folgenden Protokolle


Nginx process logs                 sudo journalctl -u nginx

Nginx access logs                    sudo tail -f  /var/log/nginx/access.log

Nginx error logs	          sudo less /var/log/nginx/error.log


Gunicorn Application logs     sudo journalctl -u gunicorn

Wenn Sie Änderungen an den Konfigurationsdateien vornehmen, stellen Sie sicher, dass Sie sie neu starten, damit die Änderungen wirksam werden.

Wenn Sie sich entscheiden, Änderungen an der gunicorn systemd-Dienstdatei vorzunehmen, stellen Sie sicher, dass Sie den Daemon neu laden und gunicorn neu starten


$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn

Wenn Sie Änderungen an der Konfiguration des Nginx-Serverblocks vornehmen, testen Sie die Konfiguration

$ sudo nginx -t && sudo systemctl restart nginx

Schlussfolgerung

Vielen Dank, dass Sie sich die Zeit für diesen Artikel genommen haben. In diesem Artikel richten wir ein Django-Projekt in einer virtuellen Umgebung ein und richten Gunicorn ein, um Client-Anfragen und Nginx zu übersetzen, um Datenverkehr an unsere Django-Anwendung weiterzuleiten.


Linux
  1. Nginx mit libmodsecurity und OWASP ModSecurity Core Rule Set auf Ubuntu 16.04

  2. Installieren Sie Django CMS auf Ubuntu 12.04 mit MariaDB, Gunicorn und Nginx

  3. So stellen Sie die Flask-Anwendung mit Nginx und Gunicorn unter Ubuntu 20.04 bereit

  4. So richten Sie Django mit Postgres, Nginx und Gunicorn unter Ubuntu 20.04 ein

  5. So richten Sie Apache mit MPM Event und PHP-FPM unter Ubuntu 20.04 ein

So richten Sie Nginx mit HTTP/2-Unterstützung unter Ubuntu 18.04 ein

Richten Sie Django mit Postgres, Nginx und Gunicorn auf Ubuntu 18.04 ein

So richten Sie einen Seafile-Server mit Nginx unter Ubuntu 18.04 ein

So richten Sie Tomcat mit Nginx als Reverse Proxy unter Ubuntu 18.04 ein

Installieren und konfigurieren Sie Varnish Cache mit Nginx Web Server unter Ubuntu 18.04

So richten Sie ein VPN mit OpenVPN unter Ubuntu 18.04 ein und konfigurieren es