So hosten Sie Django mit Nginx auf Ubuntu 18.04 Bionic Beaver Linux
Objektiv
Installieren und konfigurieren Sie Ubuntu 18.04 zum Hosten des Django-Frameworks.
Ausschüttungen
Ubuntu 18.04
Anforderungen
Eine funktionierende Installation von Ubuntu 18.04 mit Root-Rechten
Schwierigkeit
Mittel
Konventionen
- # – erfordert, dass bestimmte Linux-Befehle mit Root-Rechten ausgeführt werden, entweder direkt als Root-Benutzer oder mit dem Befehl
sudo - $ – erfordert, dass bestimmte Linux-Befehle als normaler, nicht privilegierter Benutzer ausgeführt werden
Einleitung
Wenn Sie Webanwendungen mit Python erstellen und hosten möchten, ist Django die beliebteste Wahl. Da Python so eng in Linux integriert ist, ist es nicht allzu schwer, einen Django-Server unter Ubuntu einzurichten.
Es gibt nicht die eine festgelegte Methode, Django-Projekte zu hosten, aber ein Stack, der aus PostgreSQL, Nginx, Gunicorn und Django besteht, ist so ziemlich der Standard.
Installieren Sie die Pakete
Bevor Sie beginnen, müssen Sie die erforderlichen Pakete installieren. Es gibt nicht so viele, aber stellen Sie sicher, dass Sie Apache oder einen anderen Webserver, der auf Port 80 läuft, deaktivieren, bevor Sie beginnen.
sudo apt install python3 python3-venv nginx postgresqlErstellen Sie die Datenbank
Sie müssen auch eine Datenbank erstellen, um die Informationen aus Ihrer Django-Anwendung zu speichern. PostgreSQL wird diese Rolle ausfüllen. Wenn Sie PostgreSQL noch nie verwendet haben, ist es nicht ganz dasselbe wie MySQL. Die Syntax ist anders, und auch die Handhabung von Benutzeranmeldungen erfolgt anders.
Um sich bei PostgreSQL anzumelden und es zu verwalten, müssen Sie den Postgres-Benutzer auf Ihrem Computer verwenden, der bei der Installation des PostgreSQL-Pakets erstellt wurde. Wechseln Sie mit su zu diesem Benutzer.
sudo su postgresSobald Sie sich auf dem Postgres-Benutzer befinden, greifen Sie mit dem Befehl psql auf Ihre Datenbank zu.
Nachdem Sie sich angemeldet haben, sollten Sie Ihrem Admin-Benutzer ein Passwort hinzufügen, bevor Sie etwas anderes tun.
postgres=# ALTER USER postgres WITH ENCRYPTED PASSWORD 'yourpassword';Erstellen Sie als Nächstes Ihre Datenbank.
postgres=# CREATE DATABASE your_db;Erstellen Sie einen neuen regulären Benutzer, um die Datenbank zu verwalten. Dies ist der Benutzer, mit dem sich Django anmeldet.
postgres=# CREATE ROLE django_user WITH ENCRYPTED PASSWORD 'yourpassword';Erteilen Sie dann diesem Benutzer Berechtigungen zur Verwendung der Datenbank.
postgres=# GRANT ALL PRIVILEGES ON DATABASE your_db TO django_user;Wenn Sie fertig sind, beenden Sie den Vorgang mit \q. Beenden Sie auch den Postgres-Benutzer.
Einrichten Ihres Verzeichnisses
Normalerweise ist es keine gute Idee, Python-Pakete systemweit zu installieren. Es ist viel schwieriger, Paketversionen zu verwalten und alles stabil zu halten.
Python 3 unterstützt virtuelle Umgebungen, die es Ihnen ermöglichen, Ihre Python-Projekte nach Verzeichnissen zu unterteilen. Jede Umgebung verfügt über einen eigenen Satz von Python-Paketen, und Sie können sie als regulärer Benutzer installieren und verwalten.
Wählen Sie den Ort, an dem Sie Ihre Website hosten möchten. /var/www/yoursite ist in der Regel eine gute Wahl. Verwenden Sie den integrierten Befehl, um Ihre virtuelle Umgebung zu erstellen.
sudo python3 -m venv /var/www/yoursiteGehen Sie in Ihr Verzeichnis und aktivieren Sie es.
cd /var/www/yoursite
source bin/activateWenn Sie mit dem Verzeichnis fertig sind, können Sie es einfach deaktivieren.
deactivateInstallieren Sie Django
Wenn Ihre virtuelle Umgebung gestartet ist, können Sie Django selbst zusammen mit einigen anderen Python-Paketen installieren, die Sie benötigen, um alles zu verbinden.
pip install django psycopg2 gunicornEs dauert ein paar Sekunden, aber Pip installiert alles, was Sie zum Einrichten Ihres Django-Projekts benötigen.
Erstellen eines Django-Projekts
Jetzt, da Sie Django haben, können Sie Ihr Projekt erstellen. Stellen Sie sicher, dass Sie sich in Ihrer virtuellen Umgebung befinden und sie aktiviert haben.
django-admin startproject your-projectSobald Sie über Ihr Projekt verfügen, müssen Sie die Konfiguration ändern, um Ihre Datenbank einzurichten. Standardmäßig ist Django so eingerichtet, dass sqlite3 als Datenbank verwendet wird. Das dient eher der Entwicklung. Um PostgreSQL zu verwenden, müssen Sie die Django-Hauptkonfiguration unter your-project/your-project/settings.py bearbeiten. Suchen Sie diese Datei, und öffnen Sie sie. Suchen Sie nach dem Block DATABASES, und bearbeiten Sie ihn so, dass er wie folgt aussieht.
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'your_db',
'USER': 'django_user',
'PASSWORD': 'yourpassword',
'HOST': 'localhost',
'PORT': '',
}
}Speichern und beenden. Jetzt können Sie die ersten Migrationen anwenden und Ihren Admin-Benutzer erstellen. Kehren Sie zum Stammverzeichnis Ihres Projekts zurück, und führen Sie die folgenden Linux-Befehle aus.
python manage.py migrate
python manage.py createsuperuserGunicorn konfigurieren
Die Gunicorn-Konfiguration ist ziemlich einfach, aber es ist immer noch wichtig, sie zu erledigen. Erstellen Sie ein gunicorn-Verzeichnis im Stammverzeichnis Ihrer Website. Sie müssen ihm im Wesentlichen sagen, wo er seinen Socket ausführen soll, wie viele Worker er spawnen und wo er loggen soll. Erstellen Sie eine Python-Datei mit dem Namen gunicorn-config.py, und lassen Sie sie in etwa wie folgt aussehen.
import multiprocessing
bind = 'unix:/tmp/gunicorn.sock'
workers = multiprocessing.cpu_count() * 2 + 1
reload = True
daemon = True
accesslog = './access.log'
errorlog = './error.log'Sobald Sie es so eingestellt haben, wie Sie es möchten, speichern und beenden.
Du kannst Gunicorn aus dem Stammverzeichnis deines Projekts mit einem Befehl starten, der dem folgenden ähnelt:
gunicorn -c gunicorn/gunicorn-config.py your-project.wsgiKonfigurieren von Nginx
Die gesamte Nginx-Konfiguration befindet sich in /etc/nginx. Es gibt eine Menge Dateien in diesem Verzeichnis, aber Sie müssen sich nicht um alle kümmern. Sie benötigen nur /etc/nginx/nginx.conf und die Site-spezifische Datei, die Sie unter /etc/nginx/sites-available/your-site erstellen. Eigentlich ist die Hauptkonfiguration von Nginx nicht allzu notwendig, es sei denn, Sie möchten Ihre Website in der Produktion optimieren. Sie müssen sich nicht wirklich damit herumschlagen, nur um Ihre Website zum Laufen zu bringen.
Erstellen Sie also eine Datei für Ihre Site unter /etc/nginx/sites-available/your-site.
Der erste Teil der Datei, den Sie benötigen, ist der Upstream-Block. Dieser Block teilt Nginx mit, dass der Webanwendungscode an einer anderen Stelle ausgeführt wird (in diesem Fall Gunicorn), und dass es Anfragen mit diesem Socket oder dieser Adresse austauschen sollte.
upstream your-gunicorn {
server unix:/tmp/gunicorn.sock fail_timeout=0;
}Dieser Block erstellt mehr oder weniger eine Variable basierend auf dem Namen, den Sie nach dem Upstream angegeben haben, und weist ihr den Wert des Zielservers zu. Der Server kann entweder ein Unix-Socket oder eine IP-Adresse und Portnummer sein. Da Gunicorn lokal ausgeführt wird, ist die Verwendung eines Unix-Sockets besser. Denken Sie daran, dass Sie dies zuvor in der Gunicorn-Konfiguration eingerichtet haben, also richten Sie Ihre Nginx-Konfiguration darauf.
Als nächstes können Sie zum Hauptblock für Nginx übergehen, dem Serverblock. Fügen Sie das hinzu.
server {
}Die grundlegenden Optionen teilen Nginx mit, auf welchem Port es lauschen soll und auf welche URL es achten soll.
listen 80 default;
client_max_body_size 4G;
server_name your-site.com;
keepalive_timeout 70;Fügen Sie dann Ihre Protokollspeicherorte hinzu.
access_log /var/log/nginx/your-site.access_log main;
error_log /var/log/nginx/your-site.error_log info;Zeigen Sie Nginx auf das Stammverzeichnis Ihrer Website.
root /var/www/virtualenv/your-site;Gunicorn stellt keine statischen Dateien bereit, daher müssen Sie Nginx einrichten, um die statischen Dateien Ihrer Website bereitzustellen. Wo genau sich diese Dateien befinden, wird in Ihrer Django-Einstellungsdatei festgelegt. Normalerweise gibt es zwei Verzeichnisse, eines für die statischen Dateien der Site und eines für hochgeladene Dateien. Die Blöcke haben die gleiche Struktur. Im folgenden Beispiel wird davon ausgegangen, dass Ihre statischen Dateien in einem Verzeichnis namens static im Stammverzeichnis Ihres Projekts vorhanden sind.
location /static/ {
autoindex on;
alias /var/www/virtualenv/your-site/static/;
expires 1M;
access_log off;
add_header Cache-Control "public";
proxy_ignore_headers "Set-Cookie";
}Es gibt einige andere Optionen, die gute Standardeinstellungen für das Caching darstellen.
Der nächste Standortblock, den Sie benötigen, wird die Verbindung mit Gunicorn tatsächlich verarbeiten. Wie Upstream setzt es eine weitere Art Variable und weist sie an, Verbindungen an Ihren Upstream-Block weiterzugeben.
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://your-gunicorn;
}Richten Sie schließlich einen Block ein, der Nginx anweist, nach statischen Dateien zu suchen, die mit eingehenden Anfragen übereinstimmen. Wenn keine gefunden werden, gib sie an Gunicorn weiter.
location / {
try_files $uri @proxy_to_app;
}Das ist alles, was Sie unbedingt brauchen. Sie können viel mehr Leistungsoptimierungen vornehmen, aber es ist nicht unbedingt erforderlich, um Django zum Laufen zu bringen. Speichern und beenden.
Erstellen Sie eine Verknüpfung zwischen der neuen Datei und dem Ordner mit aktivierten Websites. Entfernen Sie die vorhandene Standarddatei dort.
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/your-site /etc/nginx/sites-enabled/Starten Sie Nginx neu.
sudo systemctl restart nginxInzwischen sollten Sie in der Lage sein, Ihren Browser zu öffnen und die Standard-Django-Seite zu sehen.
Abschließende Gedanken
Okay, das war also ein langer Weg. Ob Sie so viele Konfigurationen auf einem Entwicklungsserver durchlaufen möchten oder nicht, liegt ganz bei Ihnen. Für die Produktion bietet es jedoch eine solide Grundlage für das Hosting Ihrer Django-Projekte. Denken Sie jedoch daran, dass Sie sowohl in der Django-Konfiguration als auch in Nginx definitiv noch mehr Optimierungen vornehmen können.