So installierst du das Django Python Framework auf Ubuntu 22.04

Django ist ein Python-Framework, das für die Entwicklung dynamischer Websites und Anwendungen verwendet wird. Es folgt der MVC-Architektur (Model-View-Controller). Die Verwendung von Django beschleunigt den Entwicklungsprozess, da es die meisten der zugrundeliegenden Aufgaben selbst übernimmt.

In diesem Lernprogramm lernst du, wie du das Django-Framework auf einem Ubuntu 22.04 Server installierst. Außerdem wirst du ein Demoprojekt erstellen und es testen.

Voraussetzungen

  • Ein Server mit Ubuntu 22.04.
  • Ein sudo-Benutzer ohne Root-Rechte.
  • Stelle sicher, dass alles auf dem neuesten Stand ist.
    $ sudo apt update 
    $ sudo apt upgrade
    

Django installieren

Es gibt mehrere Methoden, mit denen du Django installieren kannst. Welche Methode für dich am besten geeignet ist, hängt davon ab, wie du deine Entwicklungsumgebung konfigurieren willst und welche Bedürfnisse du hast. Jede Methode hat ihre eigenen Vor- und Nachteile. Lass uns all diese Methoden durchgehen.

Installation aus den Ubuntu-Repositories

Die einfachste Methode, Django zu installieren, ist die Verwendung der Ubuntu Repositories. Ubuntu 22.04 wird mit Python 3.10 ausgeliefert. Du kannst es mit folgendem Befehl überprüfen.

$ python3 -V
Python 3.10.4

Installiere Django mit dem folgenden Befehl.

$ sudo apt install python3-django

Führe den folgenden Befehl aus, um die erfolgreiche Installation zu überprüfen.

$ django-admin --version
3.2.12

Die Django-Version, die mit Ubuntu ausgeliefert wird, ist die aktuelle LTS-Version, die bis 2024 unterstützt wird. Sie ist jedoch nicht die aktuelle Version. Wenn du eine aktuelle Version installieren möchtest, ist diese Methode nicht geeignet.

Mit pip installieren

Dies ist die gängigste Methode, um Django zu installieren. Es wird empfohlen, eine virtuelle Python-Umgebung zu erstellen. So kannst du Python-Pakete installieren, ohne dass das System beeinträchtigt wird.

Installiere die Module pip und venv. venv wird verwendet, um virtuelle Python-Umgebungen zu erstellen, und pip installiert Python-Pakete.

$ sudo apt install python3-pip python3-venv

Lass uns ein Verzeichnis für das Demoprojekt erstellen.

$ mkdir ~/sampleproject
$ cd ~/sampleproject

Erstelle eine virtuelle Umgebung mit dem folgenden Befehl. Ersetze sample_env durch den Namen, den du für deine virtuelle Umgebung verwenden möchtest.

$ python3 -m venv sample_env

Dadurch wird eine portable Version von Python, pip, in deinem Projektverzeichnis installiert. Um Pakete in das Projekt zu installieren, musst du die Umgebung mit dem folgenden Befehl aktivieren.

$ source sample_env/bin/activate

Deine Shell-Eingabeaufforderung wird sich ändern und die virtuelle Umgebung anzeigen.

(sample_env) navjot@django:~/sampleproject$

Jetzt, wo die virtuelle Umgebung aktiviert ist, kannst du Django mit pip installieren. Führe den folgenden Befehl aus, um Django zu installieren.

(sample_env) $ pip install django

Überprüfe die Installation.

(sample_env) $ django-admin --version
4.0.5

Je nach den Anforderungen deines Projekts kannst du auf folgende Weise eine andere Version von Django installieren.

(sample_env) $ pip install django==3.2.1

Überprüfe die Installation.

(sample_env) $ django-admin --version
3.2.1

Wie du siehst, wird bei dieser Methode eine neuere Version von Django installiert als die Version aus dem Ubuntu-Repository.

Um die virtuelle Umgebung zu verlassen, führe den folgenden Befehl aus.

(sample_env) $ deactivate

Installiere die Entwicklungsversion

Du kannst auch pip verwenden, um die Entwicklungsversion von Django zu installieren. Dazu holen wir uns die Entwicklungsversion aus dem Github-Repository von Django.

Klone das Repository mit folgendem Befehl in das Verzeichnis ~/django-dev.

$ git clone https://github.com/django/django ~/django-dev

Wechsle in das neu erstellte Verzeichnis.

$ cd ~/django-dev

Erstelle die virtuelle Umgebung.

$ python3 -m venv dev_django_env

Aktiviere die Umgebung.

$ source dev_django_env/bin/activate

Installiere Django mit pip. Das -e Flag installiert es in einem bearbeitbaren Modus, der erforderlich ist, wenn du von der Versionskontrolle aus installierst.

(dev_django_dev) $ pip install -e ~/django-dev

Überprüfe die Installation.

(dev_django_dev) $ django-admin --version
4.2.dev20220628195651

Wie du siehst, ist die Version hier die neueste Entwicklungsversion. Die Entwicklungsversion von Django ist für Produktionsumgebungen nicht geeignet.

Ein Beispielprojekt erstellen

Lass uns ein Django-Beispielprojekt erstellen. Erstelle ein Verzeichnis für das Beispielprojekt.

$ mkdir ~/dj-sample
$ cd ~/dj-sample

Erstelle eine virtuelle Python-Umgebung.

$ python3 -m venv sample_proj

Aktiviere die Umgebung.

$ source sample_proj/bin/activate

Installiere Django.

(sample_proj) $ pip install django

Um das Projekt zu erstellen, müssen wir den Befehl startproject verwenden. Dieser Befehl erstellt ein weiteres Verzeichnis, das Folgendes enthält:

  • Ein Verwaltungsskript, manage.py, , das zur Verwaltung von Django-spezifischen Aufgaben verwendet wird.
  • Ein Verzeichnis mit dem gleichen Namen wie das Projekt, das den Projektcode enthält.

Wir werden das Projektverzeichnis in unserem aktuellen Arbeitsverzeichnis erstellen. Verwende dazu das Zeichen Punkt(.) am Ende des folgenden Befehls.

(sample_proj) $ django-admin startproject demoproject .

Als Nächstes müssen wir die Datenbank mit dem Befehl migrate migrieren. Migrationen in Django übertragen die Änderungen, die du an deinen Modellen vornimmst, in dein Datenbankschema. Python verwendet standardmäßig die SQLite-Datenbank.

(sample_proj) $ python manage.py migrate

Du wirst die folgende Ausgabe erhalten.

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

Als Nächstes legst du einen administrativen Benutzer an, um auf die Verwaltungsoberfläche von Django zuzugreifen.

(sample_proj) $ python manage.py createsuperuser

Du wirst nach einem Benutzernamen, einer E-Mail-Adresse und einem Passwort gefragt.

Username (leave blank to use 'navjot'):
Email address: name@example.com
Password:
Password (again):
Superuser created successfully.

Teste den Entwicklungsserver

Jetzt ist es an der Zeit, die Anwendung zu testen. Dazu musst du die Direktive ALLOWED_HOSTS in den Django-Einstellungen ändern. Diese Direktive legt die Liste der IP-Adressen und Domainnamen fest, die Zugriff auf die Django-Anwendung erhalten.

Öffne die Einstellungsdatei mit dem folgenden Befehl.

(sample_proj) $ nano demoproject/settings.py

Suche den folgenden Eintrag.

ALLOWED_HOSTS = []

Gib die IP-Adresse deines Servers in die eckigen Klammern ein. Jeder Eintrag sollte in Anführungszeichen gesetzt werden und mehrere Einträge müssen durch Kommas getrennt werden. Die Eingabe von www.example.com wird genau abgeglichen. .example.com passt jedoch zu example.com und www.example.com sowie zu jeder anderen Subdomain von example.com. Es wird daher empfohlen, das Punktzeichen einem Domainnamen voranzustellen, um ihn und seine Subdomains abzugleichen.

ALLOWED_HOSTS = ['<yourserver_ip_address>']

Wir haben die IP-Adresse verwendet, um unseren Server zu finden. Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.

Bevor du den Entwicklungsserver testest, musst du die Firewall so konfigurieren, dass Django funktionieren kann. Django verwendet standardmäßig den Port 8000. Öffne den Port mit der Uncomplicated Firewall(UFW).

(sample_proj) $ sudo ufw allow 8000

Starte den Entwicklungsserver.

(sample_proj) $ python manage.py runserver 0.0.0.0:8000

Rufe die URL http://<yourserver_ip_address>:8000 in deinem Browser auf und du erhältst den folgenden Bildschirm.

Django Homepage

Du kannst auf die Verwaltungsoberfläche zugreifen, indem du der URL http://<yourserver_ip_address>:8000/admin/ folgst und den folgenden Anmeldebildschirm aufrufst.

Django Login Seite

Gib die zuvor erstellten Anmeldedaten ein, um dich in das unten abgebildete Admin-Panel einzuloggen.

Django Admin Panel

Sobald du dein Demoprojekt fertiggestellt hast, kannst du den Server mit der Tastenkombination Strg + C in deinem Terminal schließen.

Gunicorn installieren und testen

Persistenten Django-Server mit nohup starten

Bislang ist der Django-Dienst nicht persistent. Um den Dienst persistent zu machen, gibt es zwei Methoden. Bei der ersten Methode wird das Dienstprogramm nohup verwendet. nohup ist ein POSIX-Befehl, der “ no hang up“ bedeutet. Er wird verwendet, um Befehle so auszuführen, dass sie nicht aufhören, auch wenn sich ein Benutzer abmeldet.

Vergewissere dich, dass du den Server im Terminal mit der Tastenkombination Strg + C verlassen hast.

Führe den folgenden Befehl aus, um den Entwicklungsserver von Django zu starten.

(sample_proj) $ nohup python manage.py runserver 0.0.0.0:8000 &

Jetzt läuft dein Django-Server so lange, bis du ihn manuell beendest. Der Befehl gibt dir die Prozess-ID und einen weiteren Befehl aus.

[1] 42595
(sample_proj) $ nohup: ignoring input and appending output to 'nohup.out'
^C

Drücke Strg + C zum Beenden. Der ursprüngliche Django-Server wird weiterlaufen. Du kannst das überprüfen, indem du die URL in deinem Browser öffnest.

Wenn du fertig bist, musst du den Prozess beenden. Der Befehl nohup gibt dir eine Prozess-ID. In Wirklichkeit werden aber zwei Prozesse ausgeführt. Um die IDs beider Prozesse zu ermitteln, führe den folgenden Befehl aus.

(sample_proj) $ ps aux | grep manage.py
navjot     42650  3.6  1.8  47792 38168 pts/0    S    02:28   0:00 python manage.py runserver 0.0.0.0.:8000
navjot     42651  7.9  2.0 344904 41708 pts/0    Sl   02:28   0:00 /home/navjot/dj-sample/sample_proj/bin/python manage.py runserver 0.0.0.0:8000
navjot     42657  0.0  0.1   6612  2172 pts/0    S+   02:28   0:00 grep --color=auto manage.py

Wie du siehst, werden zwei Prozesse ausgeführt, einer mit der ID 42650 und der andere mit der ID 42651.

Führe den folgenden Befehl aus, um den Server unter Verwendung der oben ermittelten Prozess-IDs zu schließen.

(sample_proj) $ sudo kill -9 42650 42651

Gunicorn installieren

Für die zweite Methode, einen persistenten Django-Server zu betreiben, musst du Gunicorn und Nginx Webserver installieren. Gunicorn ist ein Python WSGI HTTP Server. Er verbindet sich mit der Django-Anwendung und Nginx fungiert als Reverse Proxy für Gunicorn. Diese Methode hat den zusätzlichen Vorteil, dass du die Sicherheit und Leistung von Nginx nutzen kannst.

Installiere Gunicorn.

(sample_proj) $ pip install gunicorn

Bevor wir fortfahren, müssen wir testen, ob Gunicorn in der Lage ist, das Projekt zu bedienen. Führe den folgenden Befehl aus, um Gunicorn zu starten.

(sample_proj) $ gunicorn --bind 0.0.0.0:8000 demoproject.wsgi

Dadurch wird Gunicorn auf der gleichen Schnittstelle gestartet, auf der auch Django läuft. Um das zu überprüfen, öffne die URL http://<yourserver_ip_address>:8000 in deinem Browser und du wirst die gleiche Django-Homepage erhalten. Das bedeutet, dass Gunicorn einwandfrei läuft.

Wenn du mit dem Testen fertig bist, drücke Strg + C auf dem Terminal, um Gunicorn zu beenden.

Deaktiviere die virtuelle Umgebung, um zu deiner normalen Shell zurückzukehren.

(sample_proj) $ deactivate

Socket und Service-Datei für Gunicorn erstellen

Der erste Schritt besteht darin, eine Socket-Datei für Gunicorn zu erstellen. Der Gunicorn-Socket wird beim Booten erstellt und wartet auf Verbindungen. Wenn eine Verbindung hergestellt wird, startet systems automatisch den Gunicorn-Prozess, um sie zu verarbeiten.

Erstelle und öffne die Gunicorn-Socket-Datei zum Bearbeiten.

$ sudo nano /etc/systemd/system/gunicorn.socket

Füge den folgenden Code in die Datei ein.

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.

Als Nächstes erstellst du die Gunicorn-Service-Datei und öffnest sie zum Bearbeiten.

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

Füge den folgenden Code in die Datei ein.

[Unit]
Description=django gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=navjot
Group=nginx
WorkingDirectory=/home/navjot/dj-sample
ExecStart=/home/navjot/dj-sample/sample_proj/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          demoproject.wsgi:application

[Install]
WantedBy=multi-user.target

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst. Ersetze navjot durch deinen Systembenutzernamen. Die Gruppe nginx ermöglicht es dem Nginx-Server, mit Django zu kommunizieren.

Starte den Systemdaemon neu, um die systemd-Dateien zu aktualisieren.

$ sudo systemctl daemon-reload

Aktiviere und starte die Socket-Datei von Gunicorn.

$ sudo systemctl start gunicorn.socket
$ sudo systemctl enable gunicorn.socket

Überprüfe den Status des Gunicorn-Sockets.

$ sudo systemctl status gunicorn.socket

Du wirst eine ähnliche Ausgabe erhalten.

? gunicorn.socket - gunicorn socket
     Loaded: loaded (/etc/systemd/system/gunicorn.socket; disabled; vendor preset: enabled)
     Active: active (listening) since Thu 2022-06-30 01:43:24 UTC; 20s ago
   Triggers: ? gunicorn.service
     Listen: /run/gunicorn.sock (Stream)
     CGroup: /system.slice/gunicorn.socket

Jun 30 01:43:24 django systemd[1]: Listening on gunicorn socket.

Der Gunicorn-Dienst läuft immer noch nicht, wie du überprüfen kannst.

$ sudo systemctl status gunicorn.service
? gunicorn.service - django gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
TriggeredBy: ? gunicorn.socket

Um den Socket-Aktivierungsmechanismus zu testen, führe den folgenden Befehl aus.

$ curl --unix-socket /run/gunicorn.sock localhost

Du erhältst die HTML-Ausgabe der Django-Homepage in deinem Terminal. Dadurch wird auch Gunicorn gestartet, um die Anwendung zu bedienen. Überprüfe den Status des Dienstes erneut und du wirst sehen, dass er jetzt läuft.

$ sudo systemctl status gunicorn.service
? gunicorn.service - django gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-06-30 01:45:09 UTC; 12s ago
TriggeredBy: ? gunicorn.socket
   Main PID: 42365 (gunicorn)
      Tasks: 4 (limit: 2241)
     Memory: 91.7M
        CPU: 1.128s
     CGroup: /system.slice/gunicorn.service
             ??42365 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application
             ??42366 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application
             ??42367 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application
             ??42368 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application

Jun 30 01:45:09 django systemd[1]: Started django gunicorn daemon.
Jun 30 01:45:09 django gunicorn[42365]: [2022-06-30 01:45:09 +0000] [42365] [INFO] Starting gunicorn 20.1.0
Jun 30 01:45:09 django gunicorn[42365]: [2022-06-30 01:45:09 +0000] [42365] [INFO] Listening at: unix:/run/gunicorn.sock (42365)
Jun 30 01:45:09 django gunicorn[42365]: [2022-06-30 01:45:09 +0000] [42365] [INFO] Using worker: sync
Jun 30 01:45:09 django gunicorn[42366]: [2022-06-30 01:45:09 +0000] [42366] [INFO] Booting worker with pid: 42366
.......

Nginx installieren

Der letzte Schritt besteht darin, Nginx zu installieren und zu konfigurieren. Ubuntu 22.04 wird mit einer älteren Version von Nginx ausgeliefert. Um die neueste Version zu installieren, musst du das offizielle Nginx-Repository herunterladen.

Importiere den Signierschlüssel von Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Füge das Repository für die stabile Version von Nginx hinzu.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

Aktualisiere die System-Repositories.

$ sudo apt update

Installiere Nginx.

$ sudo apt install nginx

Überprüfe die Installation.

$ nginx -v
nginx version: nginx/1.22.0

Nginx konfigurieren

Erstelle und öffne die Datei /etc/nginx/conf.d/django-gunicorn.conf zum Bearbeiten.

$ sudo nano /etc/nginx/conf.d/django-gunicorn.conf

Füge den folgenden Code in die Datei ein.

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/navjot/dj-sample;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

Ersetze das Stammverzeichnis in der obigen Datei durch das Verzeichnis auf deinem Server.

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.

Öffne die Datei /etc/nginx/nginx.conf zur Bearbeitung.

$ sudo nano /etc/nginx/nginx.conf

Füge die folgende Zeile vor der Zeile include /etc/nginx/conf.d/*.conf; ein.

server_names_hash_bucket_size  64;

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.

Überprüfe deine Nginx-Konfiguration.

$ sudo nginx -t

Wenn du keine Fehler siehst, bist du startklar.

Du musst auch den Domänennamen zu deiner ALLOWED_HOSTS Direktive hinzufügen. Öffne die Datei settings.py.

$ nano ~/dj-sample/demoproject/settings.py

Ändere den Wert für die Variable ALLOWED_HOSTS.

ALLOWED_HOSTS = ['<yourserver_ip_address>','django.example.com']

Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.

Starte Gunicorn Socket und Service neu.

$ sudo systemctl restart gunicorn.socket
$ sudo systemctl restart gunicorn.service

Starte den Nginx-Server.

$ sudo systemctl start nginx

Öffne den HTTP-Port. Du kannst den Port 8000 auch löschen, wenn du ihn nicht mehr verwenden willst.

$ sudo ufw delete allow 8000
$ sudo ufw allow http

Überprüfe das, indem du die URL http://django.example.com öffnest und die Django-Homepage lädt.

SSL installieren

Bis jetzt wurde deine Django-Anwendung über eine Klartext-HTTP-Verbindung übertragen. Es wird dringend empfohlen, dass du sie mit einem SSL-Zertifikat schützt. Verwende dazu das Tool Certbot mit dem Tool Snapd. Auf einem Ubuntu 22.04-System ist es bereits installiert.

Installiere das zentrale Snapd-Repository.

$ sudo snap install core

Installiere Certbot.

$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Erstelle das Zertifikat. Mit dem folgenden Befehl wird auch Nginx automatisch konfiguriert.

$ sudo certbot --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m name@example.com -d django.example.com

Öffne zunächst den HTTPS-Port.

$ sudo ufw allow https

Rufe die URL https://django.example.com in deinem Browser auf, um sie zu bestätigen.

Fazit

Damit ist unser Tutorial abgeschlossen. Du hast gelernt, wie du Django und Gunicorn sowie Nginx auf einem Ubuntu 22.04 Server installierst. Außerdem hast du ein SSL-Zertifikat installiert, um die Sicherheit deines Django-Projekts zu erhöhen. Wenn du Fragen hast, schreibe sie unten in die Kommentare.

Das könnte dich auch interessieren …