Django ist ein freies und quelloffenes Webanwendungs-Framework, das in der Programmiersprache Python geschrieben ist. Django ist superschnell, sicher und hochgradig skalierbar. In den Händen eines erfahrenen Entwicklers kann Django schnell eine leistungsstarke Website erstellen. Es lässt sich nahtlos in gängige Webserver (Apache, Nginx), und Datenbanken (MySQL, MariaDB, PostgreSQL, Oracle, und SQLite) usw. integrieren. Django treibt einige der weltweit größten Websites wie Instagram, Mozilla und NASA an. Diese Anleitung zeigt die Einrichtung der Basis einer Web-App mithilfe von Django mit PostgreSQL, Nginx und Gunicorn auf Ubuntu 20.04.
Voraussetzungen
Diese Anleitung setzt voraus, dass Sie einen Ubuntu 20.04-Server ausführen, der mit einer einfachen Firewall und einem Nicht-Root-Benutzer mit sudo-Rechten konfiguriert ist. Weitere Informationen finden Sie in dieser detaillierten Anleitung zur Einrichtung eines Ubuntu-Servers. Folgen Sie diesem Tutorial, um einen Nicht-Root-Benutzer mit sudo-Rechten zu konfigurieren. Sie können auch eine Iptables-Firewall konfigurieren, indem Sie den Schritten dieser Anleitung folgen.
Wir werden Django in einer virtuellen Umgebung installieren. Eine projektspezifische Umgebung ermöglicht eine einfachere Verwaltung mehrerer Projekte auf demselben Server. Sobald die Datenbanken und Apps eingerichtet sind, werden wir den Gunicorn-Anwendungsserver bereitstellen. Gunicorn dient als Anwendungsschnittstelle, die Client-Anfragen von HTTP in Python-Aufrufe übersetzt, die unsere Anwendung nutzen kann. Anschließend werden wir Nginx vor Gunicorn schalten, um von dessen schneller Verbindungsabwicklung und einfach zu implementierenden Sicherheitsfunktionen zu profitieren.
Installieren der erforderlichen Pakete
Beginnen Sie zunächst mit der Installation aller erforderlichen Pakete. Erfreulicherweise sind alle diese Pakete direkt in den offiziellen Ubuntu-Paketquellen verfügbar. Öffnen Sie das Terminal und aktualisieren Sie den APT-Paket-Cache:
|
1 |
sudo apt update |
Die Paketliste hängt davon ab, ob die Webanwendung Python 2 oder Python 3 verwenden soll. Führen Sie den folgenden Befehl aus, um Django mit Python 3 zu installieren:
|
1 |
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl |
Django 1.11 LTS ist die letzte Version von Django, die Python 2 unterstützt. Wenn Sie Django mit Python 2 verwenden möchten, installieren Sie die folgenden Pakete:
|
1 |
sudo apt install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx curl |
PostgreSQL-Datenbank und -Benutzer
Als Datenbanklösung verwenden wir PostgreSQL. Es ist ein leistungsstarkes, quelloffenes objektrelationales Datenbanksystem. PostgreSQL bietet Zuverlässigkeit, Robustheit und Leistung. Detaillierte Schritte zur Einrichtung von PostgreSQL finden Sie in dieser Anleitung zur Einrichtung von PostgreSQL auf dem Ubuntu-Server. Für diese Anleitung werden wir eine dedizierte Datenbank und einen Benutzer für unsere Django-Anwendung einrichten.
Standardmäßig implementiert PostgreSQL die „Peer-Authentifizierung“ als Authentifizierungsschema für lokale Verbindungen. Kurz gesagt authentifiziert die „Peer-Authentifizierung“ die Anmeldung, wenn der Betriebssystem-Benutzername des Benutzers mit einem gültigen PostgreSQL-Benutzernamen übereinstimmt. Während der Installation hat PostgreSQL einen Betriebssystem-Benutzer postgres konfiguriert, der dem administrativen PostgreSQL-Benutzer postgres entspricht. Melden Sie sich mit dem folgenden Befehl als postgres bei der interaktiven PostgreSQL-Shell-Sitzung an:
|
1 |
sudo -u postgres psql |
Sie gelangen zur PostgreSQL-Eingabeaufforderung. Der erste Schritt besteht darin, eine dedizierte Datenbank für das Projekt zu erstellen. Zur Veranschaulichung wird die Datenbank viktor_project:
|
1 |
CREATE DATABASE viktor_project; |
Der nächste Schritt besteht darin, einen dedizierten Benutzer für die Projektdatenbank zu erstellen. Der Benutzer sollte einen starken Benutzernamen haben. Zur Veranschaulichung lautet der Benutzername viktor_project_user:
|
1 |
CREATE USER viktor_project_user WITH PASSWORD 'password123'; |
Nun werden wir einige Parameter ändern:
- Bestimmte Verbindungsparameter. Kurz gesagt, es ist nicht erforderlich, bei jedem Verbindungsaufbau die korrekten Werte abzufragen und einzustellen. Dies verbessert die Datenbankleistung erheblich.
- Standardcodierung auf
UTF-8. Es ist eine universelle Codierung und Django erwartet sie. - Standard-Transaktionsisolationsschema auf „read committed“. Es blockiert das Lesen aus nicht abgeschlossenen Transaktionen.
- Zeitzone auf
UTC.
Alle diese Parameteränderungen werden vom Django-Projekt selbst empfohlen. Um diese Änderungen zu implementieren, führen Sie die folgenden Befehle aus. Vergessen Sie nicht, den Datenbank-Benutzernamen durch den richtigen zu ersetzen:
|
1 2 3 |
ALTER ROLE viktor_project_user SET client_encoding TO 'utf8'; ALTER ROLE viktor_project_user SET default_transaction_isolation TO 'read committed'; ALTER ROLE viktor_project_user SET timezone TO 'UTC'; |
Ändern Sie den Datenbankadministrator auf den dedizierten Datenbankbenutzer:
|
1 |
GRANT ALL PRIVILEGES ON DATABASE viktor_project TO viktor_project_user; |
Unsere Arbeit mit PostgreSQL ist vorerst abgeschlossen. Beenden Sie die interaktive PostgreSQL-Shell:
|
1 |
\q |
Virtuelle Python-Umgebung
Nachdem die Datenbank vorbereitet ist, können wir uns nun auf die Einrichtung der restlichen Projektanforderungen konzentrieren. Zur einfacheren Verwaltung richten wir eine virtuelle Umgebung ein und installieren dort alle Python-Anforderungen. Um eine virtuelle Umgebung zu erstellen, benötigen wir virtualenv. Es kann ganz einfach mit pip installiert werden.
Die folgenden Befehle aktualisieren pip und installieren virtualenv. Führen Sie für Python 3 die folgenden Befehle aus:
|
1 2 |
sudo -H pip3 install --upgrade pip sudo -H pip3 install virtualenv |
Führen Sie stattdessen für Python 2 die folgenden Befehle aus:
|
1 2 |
sudo -H pip install --upgrade pip sudo -H pip install virtualenv |
Sobald virtualenv installiert ist, ist es an der Zeit, eine virtuelle Umgebung zu erstellen. Erstellen Sie als Nächstes ein dediziertes Verzeichnis für die virtuelle Umgebung:
|
1 |
mkdir -v ~/viktor_project |
Wechseln Sie danach in das für die virtuelle Umgebung vorgesehene Verzeichnis:
|
1 |
cd ~/viktor_project |
Führen Sie in diesem Verzeichnis den folgenden Befehl aus. Das virtualenv-Tool erstellt eine virtuelle Umgebung mit dem Projektnamen:
|
1 |
virtualenv viktor_project |
Es wird ein Unterverzeichnis mit dem Projektnamen erstellt. Das Unterverzeichnis enthält eine lokale Version von Python und pip. Dies bietet die Flexibilität, eine isolierte Python-Umgebung für das Projekt zu installieren und zu konfigurieren.
Der folgende Befehl aktiviert die virtuelle Umgebung:
|
1 |
source viktor_project/bin/activate |
Die Eingabeaufforderung des Terminals ändert sich und zeigt an, dass Sie in einer virtuellen Python-Umgebung arbeiten. Da wir uns nun in der virtuellen Umgebung befinden, installieren wir die erforderlichen Python-Anforderungen. Wir benötigen Django, Gunicorn und psycopg2 (PostgreSQL-Adapter). Der folgende Befehl weist das lokale pip an, die Komponenten zu installieren:
|
1 |
pip install django gunicorn psycopg2-binary |
Auch wenn Sie Python 3 verwenden, ist pip der richtige Befehl. Das liegt daran, dass pip3 innerhalb der virtuellen Umgebung in pip umbenannt wird.
Neues Django-Projekt
Sobald die Python-Komponenten vorhanden sind, können wir mit der Arbeit an den eigentlichen Django-Projektdateien beginnen.
-
Erstellen eines Django-Projekts
Das Projektverzeichnis ist bereits eingerichtet. Wir weisen Django an, seine Dateien dort zu installieren. Dieses Verfahren erzeugt ein Verzeichnis der zweiten Ebene, das den eigentlichen Code enthält. Das Verzeichnis enthält auch ein Verwaltungsskript. Der Schlüssel liegt darin, dass wir Django das Zielverzeichnis explizit mitteilen, anstatt es das Verzeichnis relativ zum aktuellen Verzeichnis bestimmen zu lassen:
|
1 |
django-admin.py startproject viktor_project ~/viktor_project |
Django wird das Projekt entsprechend erstellen. Hier sind einige der wichtigen Dateien und Verzeichnisse, auf die wir uns konzentrieren werden. Die Verzeichnis- und Dateinamen werden entsprechend der Demonstration verwendet.
~/viktor_project/manage.py: Das Projektverwaltungsskript von Django.~/viktor_project/viktor_project/: Es ist das Paket, das das Django-Projekt enthält. Es sollte die Dateien __init__.py, settings.py, urls.py, asgi.py und wsgi.py enthalten.
-
Projekteinstellungen anpassen
Nachdem das Projekt erstellt wurde, müssen wir als Erstes seine Konfiguration anpassen. Öffnen Sie settings.py in einem Texteditor:
|
1 |
nano ~/viktor_project/viktor_project/settings.py |
Die erste Direktive, nach der wir suchen, ist ALLOWED_HOSTS. Sie definiert die Server oder Domainnamen, die sich mit der Django-Instanz verbinden können. Wenn eine eingehende Anfrage mit einem Host-Header nicht mit der Liste von ALLOWED_HOSTS übereinstimmt, wird eine Ausnahme ausgelöst. Dies wird von Django empfohlen, um bestimmte Arten von Sicherheitslücken zu vermeiden:
|
1 |
ALLOWED_HOSTS = ['<server_ip_or_domain_name_1>',' server_ip_or_domain_name_2','localhost'] |
Der nächste Abschnitt, auf den wir uns konzentrieren werden, ist DATABASE. Er verwaltet den Datenbankzugriff. Standardmäßig enthält er die Konfiguration für die SQLite-Datenbank-Engine. Wir werden jedoch die PostgreSQL-Datenbank für das Projekt verwenden. Django verwendet den psycopg2-Adapter, um mit PostgreSQL zu kommunizieren:
|
1 2 3 4 5 6 7 8 9 10 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'viktor_project', 'USER': 'viktor_project_user', 'PASSWORD': 'password123', 'HOST': 'localhost', 'PORT': '', } } |
Gehen Sie nun ganz nach unten in der Datei. Fügen Sie die folgenden Zeilen hinzu, um den Speicherort für statische Dateien anzugeben. Dies hilft Nginx, Anfragen für diese Elemente zu verarbeiten:
|
1 2 |
import os STATIC_ROOT = os.path.join(BASE_DIR, 'static/') |
Unsere Arbeit mit settings.py ist vorerst erledigt. Speichern Sie die Datei und schließen Sie den Editor.
-
Abschluss der ersten Projekteinrichtung
Wir können nun das anfängliche Datenbankschema in die dedizierte PostgreSQL-Datenbank migrieren. Führen Sie den folgenden Befehl aus:
|
1 2 |
~/viktor_project/manage.py makemigrations ~/viktor_project/manage.py migrate |
Als Nächstes müssen wir einen Superuser für das Projekt erstellen. Um einen Superuser zu erstellen, führen Sie den folgenden Befehl aus:
|
1 |
~/viktor_project/manage.py createsuperuser |
Sammeln Sie alle statischen Dateien an dem in settings.py angegebenen Ort. Die statischen Dateien werden in einem separaten Verzeichnis namens „static“ unter dem Projektverzeichnis gesammelt:
|
1 |
~/viktor_project/manage.py collectstatic |
Nun müssen wir die Server-Firewall anpassen. Wenn Sie der Anleitung zur Serverkonfiguration gefolgt sind, haben Sie UFW bereits konfiguriert und aktiviert. Wir werden eine Ausnahme für Port 8000 erstellen. Dies ist der Standardport, den Django verwendet. Lesen Sie diese Anleitung, um mehr über die Grundlagen und Verwendung der UFW-Firewall zu erfahren.
|
1 |
sudo ufw allow 8000 |
Überprüfen Sie als Nächstes die Aktion:
|
1 |
sudo ufw status |
Schließlich können wir den Server in Aktion testen. Starten Sie den Django-Entwicklungsserver:
|
1 |
~/viktor_project/manage.py runserver 0.0.0.0:8000 |
Wenn die Konfiguration erfolgreich war, sollte der Django-Entwicklungsserver starten und eingehende Anfragen akzeptieren. Öffnen Sie einen Browser und rufen Sie die IP/Domain Ihres Servers auf Port 8000 auf:
|
1 |
http://<server_or_domain>:8000 |
Sie sollten auf der Standard-Indexseite von Django landen. Um auf das Admin-Panel zuzugreifen, hängen Sie /admin an die URL an. Das Admin-Panel ist nur für den zuvor erstellten Superuser zugänglich:
|
1 |
http://<server_or_domain>:8000/admin |
Nach dem Einloggen landen Sie auf der standardmäßigen Django-Admin-Benutzeroberfläche:
Wir sind mit dem Testen fürs Erste fertig. Um den Server zu stoppen, drücken Sie „Strg + C“ im Terminalfenster.
-
Gunicorn testen
Bevor wir die virtuelle Umgebung verlassen, wollen wir sicherstellen, dass Gunicorn die Anwendungen bereitstellen kann. Wir testen dies, indem wir Gunicorn verwenden, um das WSGI-Modul des Projekts zu laden.
Der Gunicorn-Befehl befindet sich im Projektverzeichnis:
|
1 2 |
cd ~/viktor_project gunicorn --bind 0.0.0.0:8000 viktor_project.wsgi |
Dies startet Gunicorn auf derselben Schnittstelle, auf der Django lief. Wir können die App erneut über einen normalen Webbrowser testen. Beachten Sie, dass die Admin-Benutzeroberfläche kein Styling aufweist, da Gunicorn noch nicht weiß, wie es die statischen CSS-Inhalte finden soll:
|
1 |
http://<server_or_domain>:8000 |
Wenn Sie fertig sind, drücken Sie „Strg + C“ im Terminalfenster, um den Gunicorn-Server zu stoppen.
-
Virtuelle Umgebung verlassen
Die Konfiguration der Django-Anwendung ist abgeschlossen. Führen Sie den folgenden Befehl aus, um die virtuelle Umgebung zu verlassen:
|
1 |
deactivate |
Gunicorn-Socket- und Service-Dateien
Wir haben überprüft, dass Gunicorn mit der Django-Anwendung interagieren kann. Wir benötigen jedoch eine robustere Methode zur Verwaltung des Anwendungsservers. Hier kommt systemd ins Spiel. Systemd ist eines der beliebtesten Init-Systeme für Linux. Hier ist eine ausführliche Anleitung zur Verwaltung von systemd-Diensten und -Units.
Wir können Socket- und Service-Dateien für Gunicorn erstellen, damit systemd es wie einen Dienst verwalten kann. Beim Systemstart wird der Gunicorn-Socket generiert. Der Socket lauscht auf eingehende Verbindungen. Wenn eine Verbindung hergestellt wird, startet systemd Gunicorn-Prozesse, um die Verbindung zu verarbeiten.
-
Gunicorn-Socket
Beginnen wir mit der Erstellung eines Gunicorn-Sockets. Die Datei muss mit sudo-Rechten erstellt werden:
|
1 |
sudo nano /etc/systemd/system/gunicorn.socket |
Geben Sie den folgenden Code in die Datei ein:
|
1 2 3 4 5 6 7 |
[Unit] Description=gunicorn socket [Socket] ListenStream=/run/gunicorn.sock [Install] WantedBy=sockets.target |
Wie Sie sehen können, besteht der Code aus drei Abschnitten.
[Unit]:Dieser Abschnitt beschreibt den Socket.[Socket]:Er definiert den Speicherort des Sockets.[Install]:Dieser Teil stellt sicher, dass systemd den Socket zum richtigen Zeitpunkt erstellt.
Speichern Sie die Datei und schließen Sie den Editor.
-
Gunicorn-Dienst
Als Nächstes erstellen wir eine Service-Datei für Gunicorn. Ähnlich wie die Socket-Datei muss auch diese mit sudo-Rechten erstellt werden:
|
1 |
sudo nano /etc/systemd/system/gunicorn.service |
Geben Sie den folgenden Code ein:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[Unit] Description=gunicorn daemon Requires=gunicorn.socket After=network.target [Service] User=cloudsigma Group=www-data WorkingDirectory=/home/cloudsigma/viktor_project ExecStart=/home/cloudsigma/viktor_project/viktor_project/bin/gunicorn \ --access-logfile - \ --workers 3 \ --bind unix:/run/gunicorn.sock \ viktor_project.wsgi:application [Install] WantedBy=multi-user.target |
Der Code enthält mehrere Abschnitte:
[Unit]:Dieser Abschnitt gibt Metadaten und Abhängigkeiten an. Er beschreibt auch, dass der Start erst nach Erreichen des Netzwerk-Targets erfolgen soll.[Service]:Dieser Abschnitt gibt den Benutzer und die Gruppe an, unter denen der Prozess ausgeführt wird. Der Besitz der Gruppe ist auf „www-data“ festgelegt, damit Nginx mit Gunicorn kommunizieren kann. Er legt auch die Arbeitsverzeichnisse fest und gibt die Startbefehle an.[Install]:Dieser Abschnitt teilt systemd mit, womit dieser Dienst verknüpft werden soll, wenn er beim Booten aktiviert ist. Er sollte starten, nachdem das reguläre Multi-User-System läuft.
Speichern Sie als Nächstes die Datei und schließen Sie den Editor.
-
Gunicorn-Socket aktivieren
Der Gunicorn-Socket ist einsatzbereit. Daher können Sie die folgenden Befehle ausführen. Dadurch wird der Socket gestartet und aktiviert. Die Socket-Datei wird beim Booten unter /run/gunicorn.sock erstellt. Wenn eine Verbindung zum Socket hergestellt wird, startet systemd den Gunicorn-Dienst, um diese zu verarbeiten:
|
1 2 |
sudo systemctl start gunicorn.socket sudo systemctl enable gunicorn.socket |
Überprüfen Sie den Status des Gunicorn-Sockets:
|
1 |
sudo systemctl status gunicorn.socket |
Überprüfen Sie nun, ob die Socket-Datei existiert:
|
1 |
file /run/gunicorn.sock |
Wenn der Status von systemctl einen Fehler anzeigt oder die Datei gunicorn.sock nicht gefunden wurde, deutet dies darauf hin, dass der Socket nicht korrekt erstellt wurde. Suchen Sie im detaillierten Protokoll nach Hinweisen:
|
1 |
sudo journalctl -u gunicorn.socket |
Vergessen Sie nicht, sich die gunicorn.socket-Datei noch einmal anzusehen, um potenzielle Fehler zu finden.
-
Socket-Aktivierung
Wir haben bisher gunicorn.socket gestartet. Ohne eine Verbindungsanfrage wird gunicorn.service jedoch nicht aktiviert. Überprüfen Sie als Nächstes den Status von Gunicorn:
|
1 |
sudo systemctl status gunicorn |
Wir können den Socket-Aktivierungsmechanismus testen, indem wir eine Verbindungsanfrage mit curl senden:
|
1 |
curl --unix-socket /run/gunicorn.sock localhost |
Sie sollten eine HTML-Ausgabe der Anwendung erhalten. Dies zeigt an, dass Gunicorn erfolgreich gestartet wurde und die Django-Anwendung bereitstellen konnte. Überprüfen Sie den aktuellen Status des Gunicorn-Dienstes:
|
1 |
sudo systemctl status gunicorn |
Wenn es ein unerwartetes Verhalten oder eine unerwartete Ausgabe gibt (was auf einen Fehler hindeutet), suchen Sie in den detaillierten Protokollen nach Hinweisen:
|
1 |
sudo journalctl -u gunicorn |
Wenn Änderungen an der Datei gunicorn.service vorgenommen wurden, müssen Sie den Daemon neu laden, um die Dienstdefinition neu einzulesen. Dies erfordert auch einen Neustart des Gunicorn-Dienstes:
|
1 2 |
sudo systemctl daemon-reload sudo systemctl restart gunicorn |
Nginx konfigurieren
Nun konfigurieren wir Nginx so, dass der eingehende Datenverkehr an den Prozess weitergeleitet wird. Erstellen Sie zuerst einen neuen Server-Block in Nginx:
|
1 |
sudo nano /etc/nginx/sites-available/viktor_project |
Geben Sie dann den folgenden Code ein:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
server { listen 80; server_name 31.171.250.71; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/cloudsigma/viktor_project; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } } |
Hier are mehrere Blöcke in der Konfiguration:
service:Dieser Block definiert, dass der Server normal auf Port 80 lauschen und auf den Domänennamen oder die IP-Adresse des Servers antworten soll.location:Dies ist der erste Location-Eintrag. Er definiert, wo die statischen Assets zu finden sind.location:Dies ist der zweite Location-Eintrag. Dieser Block definiert Standard-Proxy-Parameter und wie der Datenverkehr an den Gunicorn-Socket weitergeleitet wird.
Speichern Sie die Datei und schließen Sie den Editor. Verknüpfen Sie die Datei mit dem Verzeichnis „sites-enabled“, um sie zu aktivieren:
|
1 |
sudo ln -s /etc/nginx/sites-available/viktor_project /etc/nginx/sites-enabled |
Testen Sie danach, ob in der Nginx-Konfiguration ein Syntaxfehler vorliegt:
|
1 |
sudo nginx -t |
Wenn Sie keinen Fehler gefunden haben, starten Sie Nginx neu, um die Änderung zu übernehmen:
|
1 |
sudo systemctl restart nginx |
Wir müssen die UFW-Regeln erneut ändern. Wir benötigen keinen Zugriff mehr auf den Entwicklungsserver, daher können wir die Ausnahme für Port 8000 entfernen. Darüber hinaus möchten wir Port 80 für normalen Datenverkehr öffnen:
|
1 2 |
sudo ufw delete allow 8000 sudo ufw allow 'Nginx Full' |
Überprüfen Sie diese Änderungen der Firewall-Regeln:
|
1 |
sudo ufw status |
Der Server sollte nun über einen normalen Webbrowser erreichbar sein.
Fehlerbehebungsverfahren
Wenn alle Schritte ordnungsgemäß befolgt wurden, sollte die Django-Anwendung über das Internet erreichbar sein. Wenn dies nicht der Fall ist, deutet dies darauf hin, dass die Installation nicht wie geplant verlaufen ist. Wir müssen eine Fehlerbehebung durchführen, um die Ursache des Problems zu finden.
-
Nginx zeigt die Standardseite an
Wenn Nginx die Standardseite anstelle des Anwendungsproxys anzeigt, bedeutet dies normalerweise, dass server_name im Server-Block falsch konfiguriert war.
In diesem Beispiel ist der Server-Block am folgenden Ort gespeichert:
|
1 |
/etc/nginx/sites-available/viktor_project |
Der server_name-Eintrag bestimmt, welchen Server-Block Nginx zur Beantwortung von Anfragen verwendet. Wenn die Standardseite angezeigt wird, konnte Nginx die Anfrage wahrscheinlich keinem expliziten Server-Block zuordnen, sodass stattdessen auf den Standard-Block zurückgegriffen wird:
|
1 |
/etc/nginx/sites-available/default |
Überprüfen Sie, ob der Server-Block Ihres Django-Projekts einen korrekten server_name.
-
502 Bad Gateway
Fehler 502 weist darauf hin, dass Nginx die Anfrage nicht erfolgreich weiterleiten konnte. Es gibt eine Vielzahl möglicher Konfigurationsprobleme, die zu Fehler 502 führen können, daher benötigen wir Hinweise, um eine ordnungsgemäße Fehlerbehebung durchzuführen.
Die primäre Quelle für Hinweise sind die Nginx-Fehlerprotokolle. Im Allgemeinen weisen sie auf die Bedingungen hin, die die Probleme während des Proxys verursacht haben. Überprüfen Sie das Nginx-Fehlerprotokoll mit dem folgenden Befehl:
|
1 |
sudo tail -F /var/log/nginx/error.log |
Sobald das Protokoll geöffnet ist, versuchen Sie erneut, auf den Server zuzugreifen. Es sollte eine neue Fehlermeldung im Protokoll generiert werden. Dies kann helfen, das Problem einzugrenzen. Hier sind einige mögliche Meldungen:
- connect() to unix:/run/gunicorn.sock failed (2: No such file or directory)
Dies weist darauf hin, dass Nginx gunicorn.sock an dem in der Konfiguration definierten Ort nicht finden konnte. Der Ort wird durch die Direktive proxy_pass im Site-Block beschrieben. Überprüfen Sie, ob proxy_pass den korrekten Ort von gunicorn.sock angibt, die von der systemd-Einheit gunicorn.socket generiert wurde:
|
1 |
/etc/nginx/sites-available/viktor_project |
Wenn gunicorn.sock nicht im Verzeichnis /run gefunden wurde, bedeutet dies, dass systemd sie nicht generieren konnte. Sie sollten die Konfigurationsschritte für die Gunicorn-Socket-Datei erneut überprüfen.
- connect() to unix:/run/gunicorn.sock failed (13: Permission denied)
Dies weist darauf hin, dass Nginx aufgrund von Berechtigungsproblemen keine Verbindung zum Gunicorn-Socket herstellen konnte. Dies kann passieren, wenn der Prozess als Root-Benutzer anstelle eines sudo-Benutzers ausgeführt wurde. Obwohl systemd gunicorn.sock erfolgreich generiert hat, kann Nginx sie nicht verwenden.
Ein möglicher Verursacher könnten eingeschränkte Berechtigungen zwischen dem Root-Verzeichnis (/) und der Datei gunicorn.sock sein. Überprüfen Sie die Berechtigungen und den Besitzer der Socket-Datei und jedes ihrer übergeordneten Verzeichnisse:
|
1 |
namei -l /run/gunicorn.sock |
Die erste Spalte beschreibt die Dateiberechtigungen. Die zweite Spalte beschreibt den Besitzer (Benutzer) und die dritte Spalte den Besitzer (Gruppe). Wenn eines der Verzeichnisse, die zu gunicorn.sock führen, nicht über die richtigen Lese- und Ausführungsberechtigungen verfügt, schlägt der Zugriff von Nginx auf den Socket fehl.
-
Django zeigt „could not connect to the server: Connection refused“ an
Dies weist darauf hin, dass Django keine Verbindung zum PostgreSQL-Server herstellen konnte. Stellen Sie sicher, dass der PostgreSQL-Server läuft:
|
1 |
sudo systemctl status postgresql |
Wenn es nicht läuft, führen Sie die folgenden Befehle aus, um es zu starten und zu aktivieren:
|
1 2 |
sudo systemctl start postgresql sudo systemctl enable postgresql |
Wenn dieser Fehler weiterhin auftritt, stellen Sie sicher, dass die Datenbank-Anmeldedaten korrekt definiert sind unter settings.py:
|
1 |
~/viktor_project/viktor_project/settings.py |
Weitere Fehlerbehebung
Für eine zusätzliche Fehlerbehebung sind verschiedene Protokolle eingerichtet. Diese Protokolle können helfen, die Ursachen der Probleme einzugrenzen.
Hier ist eine Liste von Protokollen, die helfen können:
- Nginx-Protokolle
|
1 |
sudo journalctl -u nginx |
- Zugriffsprotokolle-Nginx
|
1 |
sudo less /var/log/nginx/access.log |
- Fehlerprotokolle-Nginx
|
1 |
sudo less /var/log/nginx/error.log |
- Anwendungsprotokolle-Gunicorn
|
1 |
sudo journalctl -u gunicorn |
- Socket-Protokolle-Gunicorn
|
1 |
sudo journalctl -u gunicorn.socket |
|
1 |
sudo systemctl restart gunicorn |
|
1 2 |
sudo systemctl daemon-reload sudo systemctl restart gunicorn.socket gunicorn.service |
|
1 2 |
sudo nginx -t sudo systemctl restart nginx |
Schlussgedanken
Diese Anleitung zeigt erfolgreich, wie Sie das Fundament für Django legen. Django stellt viele der gängigen Komponenten einer Webanwendung bereit, sodass Sie sich auf die einzigartigen Elemente konzentrieren können. Das Django-Projekt wird innerhalb der virtuellen Umgebung ausgeführt. Gunicorn verwaltet die Kommunikation zwischen Client-Anfragen und Django. Schließlich fungiert Nginx als Reverse-Proxy für die Verarbeitung von Client-Verbindungen.
Viel Spaß beim Programmieren!










Kommentare
Noch keine Kommentare. Schreiben Sie den ersten.