[PYTHON] Veröffentlichen Sie Ihre Django-App unter Amazon Linux + Apache + mod_wsgi

Über diesen Artikel

In diesem Artikel werde ich den Ablauf der tatsächlichen Bereitstellung (= Veröffentlichung auf einem Webserver) einer mit Django erstellten Webanwendung in einer Produktionsumgebung vorstellen.

Umgebung / zu verwendende Version

Voraussetzungen

Voraussetzungen für die Leser erforderlich

Bereitstellungsprozess der Django-App

Von hier aus erklären wir, wie die erstellte Webanwendung tatsächlich in die Produktionsumgebung gestellt und veröffentlicht wird.

0. Verzeichnis- / Dateistruktur auf dem Server

Dieses Mal möchten wir die Verzeichnisdateien wie folgt ablegen. (Hinweis: Einige irrelevante Teile werden diesmal weggelassen.)

/
├─var
│  └─www
│     └─html  #Apache-Dokumentstamm
├─etc
│  └─httpd
│     ├─conf
│   │  └─httpd.conf  #Apache-Konfigurationsdatei
│     └─conf.d
│        └─django.conf #Zusätzliche Konfigurationsdatei zum Ausführen von Django
└─home
   └─ec2-user  #Hier ist das erste Verzeichnis, in dem ssh eine Verbindung zur Instanz herstellt
      └─Django
         ├─env  #Virtuelle Umgebung zum Ausführen von Django-Apps
         └─project  #Django-Projekt
            │ manage.py
            ├─static
            ├─project
            │  │  settings.py
            │  │  local_settings.py
            │  └─ wsgi.py
            └─app
               ├─templates
               └─static

1. Laden Sie die lokale Django-App auf Github hoch

Erstellen eines lokalen / Remote-Repositorys für Git

Dieses Mal werde ich die Django-App über das Remote-Repository von Github auf den Server bringen. Erstellen Sie zunächst ein Remote-Repository auf der Github-Website. Verwenden Sie danach den folgenden Befehl direkt unter dem Django-Projekt, um ein lokales Repository zu erstellen, das mit dem erstellten Remote-Repository verknüpft ist.

$ git init
$ git remote add origin [Remote-Repository-Adresse]

Erstellen einer Einstellungsdatei (local_settings.py), die von der Git-Verwaltung ausgeschlossen werden soll

Folgendes müssen Sie tun, bevor Sie den Inhalt Ihres lokalen Repositorys remote übertragen können.

Die Django-App verfügt über Einstellungen, die zwischen der lokalen Umgebung und der Remote-Umgebung geändert werden müssen. In project / settings.py gibt es beispielsweise eine Variable namens DEBUG.

(local)project/settings.py


# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

Wenn dies der Fall ist, wird im Falle eines http-Fehlers die detaillierte Fehlerposition im Browser angezeigt. Wenn dies jedoch in der Produktionsumgebung aktiviert ist, werden detaillierte Informationen auf dem Server an Dritte weitergegeben, sodass dies nicht gut ist. Daher wird empfohlen, in der Produktionsumgebung False beizubehalten.

Außerdem gibt es in project / settings.py eine Variable namens SECRET_KEY.

(local)project/settings.py


# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'pej^q2ql$$#bzg#crh6k_9(p=%p)&6x(kwh@nos&=!$ej&60fh' #example

Dies gibt den privaten Schlüssel an, der für die Verschlüsselung und das Hashing verwendet wird, sodass er nicht außerhalb des Projekts verfügbar gemacht werden sollte. Mit anderen Worten, übertragen Sie die Konfigurationsdatei mit diesem Wert nicht in ein Remote-Repository auf Github.

Deshalb,

Fügen Sie die Informationen in eine andere Datei als die normale Datei project / settings.py ein und schließen Sie sie von der Git-Verwaltung aus.

Erstellen Sie in der Projektdatei eine neue Datei mit dem Namen local_settings.py und geben Sie die Einstellungen ein, die Sie nicht mit git verwalten möchten.

(local)project/local_settings.py


# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'pej^q2ql$$#bzg#crh6k_9(p=%p)&6x(kwh@nos&=!$ej&60fh' #example

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

Löschen Sie anschließend die in local_settings.py beschriebenen Informationen aus der Datei project / settings.py. Fügen Sie dann oben die folgende Zeile hinzu, um die Informationen in local_settings.py zu lesen.

from .local_settings import *

Die Konfigurationsdatei ist jetzt perfekt. Lassen Sie uns dann das erstellte git local_settings.py verwalten.

(local)project/settings.py


$ vi .gitignore
 #Schreib das Folgende
 local_settings.py

Zum Remote-Repository verschieben

Jetzt, da Sie bereit sind zu pushen, laden wir den Quellcode in ein Remote-Repository hoch.

$ git push origin master

2. Erstellen Sie eine Python-Umgebung in einer EC2-Instanz

Installation von 3er Python

Python, das standardmäßig in Amazon Linux enthalten ist, besteht aus 2 Serien, daher müssen Sie 3 Serien manuell installieren. Installieren Sie dieses Mal Python 3.6 und das entsprechende Entwicklungstool mit dem Befehl yum.

$ sudo yum install python36 python36-devel

Auf diese Weise wird Python der 3er-Serie auf den Server gestellt. Beachten Sie, dass das Standardsystem 2 verwendet wird, wenn Sie nur den Befehl python drücken. Der Befehl zur Verwendung der gerade installierten 3er-Serie ist der Befehl python3.

$ python -V
Python 2.7.16
$ python3 -V
Python 3.6.8

Erstellen einer virtuellen Umgebung

Dieses Mal werde ich die Django-App im Ordner / home / ec2-user / Django / ablegen. Erstellen Sie daher in diesem Django-Ordner eine dritte virtuelle Python-Umgebung mit dem Namen env.

$ cd /home/ec2-user/Django/
$ python3 -m venv env

Sie haben jetzt eine virtuelle Umgebung erstellt. Gehen Sie in diese Umgebung und verwenden Sie pip, um Django und mod_wsgi zu installieren.

$ source env/bin/activate
$ pip install django mod_wsgi

Wenn Sie andere Framework-Bibliotheken in Ihrer Django-App verwenden (z. B. Django Rest Fremework), müssen Sie diese ebenfalls installieren. Im Folgenden wird davon ausgegangen, dass Sie in dieser virtuellen Umgebung arbeiten.

3. Platzieren Sie die Django-App auf dem Server

Bringen Sie die Django-App aus dem in 1 vorbereiteten Github-Remote-Repository. Klonen Sie das Remote-Repository im Ordner / home / ec2-user / Django /.

$ git clone [Remote-Repository-Adresse]

Sie haben die App nun erfolgreich auf Ihren Server gebracht. Da jedoch eine Einstellung in local_settings.py früher gespeichert ist, werde ich local_settings.py manuell auf dem Server erstellen.

$ vi /project/project/local_settings.py
#Schreib das Folgende
SECRET_KEY = 'pej^q2ql$$#bzg#crh6k_9(p=%p)&6x(kwh@nos&=!$ej&60fh' #Machen Sie den gleichen Wert wie local
DEBUG = False #Da es sich um eine Produktionsumgebung handelt, setzen Sie sie auf False.

4. Upgrade von sqlite3

Überprüfen wir nun mit "python manage.py runserver", ob Django in der Umgebung des Servers ordnungsgemäß funktioniert. Wenn Sie zu diesem Zeitpunkt problemlos starten können, überspringen Sie 4 und fahren Sie mit 5 fort. Zu diesem Zeitpunkt wird möglicherweise ein SQLite3-Versionsfehler angezeigt.

$ python manage.py runserver
(Kürzung)
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).

In diesem Fall müssen Sie sqlite3 mit 3.8.3 oder höher installieren. Es gab Informationen, dass es mit "yum" nicht funktionieren würde, also entschied ich mich, stetig mit "wget" zu arbeiten. (Quelle: [django] SQLite-Versionsfehler)

#Holen Sie sich die neue Version von sqlite3 source
$ wget https://www.sqlite.org/2019/sqlite-autoconf-3300100.tar.gz
$ tar xzf ./sqlite-autoconf-3300100.tar.gz 
$ rm -f ./sqlite-autoconf-3300100.tar.gz

#Erstellen und installieren
$ cd ./sqlite-autoconf-3300100/
$ ./configure --prefix=/usr/local
$ make
$ sudo make install

Referenz: Was tun, wenn beim Starten des Entwicklungsservers in Django 2.2 ein SQLite3-Fehler auftritt

Überprüfen Sie, ob die Installation erfolgreich war.

#Bestätigung des Installationsziels
$ sudo find /usr/ -name sqlite3
/usr/lib64/python2.6/sqlite3
/usr/lib64/python3.6/sqlite3
/usr/lib64/python2.7/sqlite3
/usr/bin/sqlite3
/usr/local/bin/sqlite3

#Versionsbestätigung
$ /usr/bin/sqlite3 --version
3.30.0 2019-10-10 20:19:45 18db032d058f1436ce3dea84081f4ee5a0f2259ad97301d43c426bc7f3df1b0b

Ich habe erfolgreich sqlite3 mit 3.8.3 oder höher erhalten. Benennen Sie das alte SQLite um → Erstellen Sie einen symbolischen Link für das neue SQLite, sodass der Befehl sqlite3 die neue Version verwendet.

$ sudo mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
$ sudo ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3

Übergeben Sie außerdem den Pfad, um die neu installierte Version von sqlite3 zur gemeinsam genutzten Bibliothek hinzuzufügen.

$ vi /etc/ld.so.conf.d/sqlite3-x86_64.conf
#Schreib das Folgende
/usr/local/lib

Es gibt auch eine Möglichkeit, die Umgebungsvariable LD_LIBRARY_PATH zu aktualisieren, um den Pfad an die gemeinsam genutzte Bibliothek zu übergeben. Selbst wenn die Einstellung LD_LIBRARY_PATH an einer fehlerhaften Stelle definiert ist, wird sie nicht wiedergegeben. Also habe ich leise den Pfad in ld.so.conf.d definiert. Referenz: Es wird möglicherweise nicht wiedergegeben, auch wenn LD_LIBRARY_PATH festgelegt ist

(Artikel, auf die oben verwiesen wurde hat die Einstellung LD_LIBRARY_PATH in ~ / .bashrc geschrieben, dies hat jedoch nicht funktioniert.)

5. Verknüpfungseinstellungen zwischen Apache und mod_wsgi

Sobald Sie überprüft haben, dass Django erfolgreich auf Ihrem Server gestartet werden kann, ist es Zeit, sich darauf vorzubereiten, es auf Apache zu veröffentlichen.

Verwenden Sie zuerst den Befehl find, um den Pfad zu überprüfen, in dem sich das zuvor eingegebene mod_wsgi befindet.

$ find -name 'mod_*.so'
./env/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

Diese mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so ist der Hauptteil von mod_wsgi. Notieren Sie sich den Pfad, den Sie gerade für die spätere Verwendung überprüft haben.

Fügen Sie als Nächstes die Einstellungen zu Apache hinzu. Erstellen Sie mit dem folgenden Befehl eine neue Konfigurationsdatei, die mod_wsgi beschreibt.

$ sudo vi /etc/httpd/conf.d/django.conf

Dadurch wird vi gestartet und Sie können die Datei bearbeiten. Geben Sie hier die folgenden Einstellungen ein.

/etc/httpd/conf.d/django.conf


LoadModule wsgi_module /home/ec2-user/Django/env/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

WSGIScriptAlias / /home/ec2-user/Django/project/project/wsgi.py
WSGIPythonPath /home/ec2-user/Django/env/lib/python3.6/site-packages
WSGIPythonHome /home/ec2-user/Django/env

<Directory /home/ec2-user/Django/project/project>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

Die Einstellung hat folgende Bedeutung.

--LoadModule: Der Speicherort der mod_wsgi-Body-Datei. --WSGIScriptAlias: Einstellung für die Übertragung zum zweiten wsgi-Skript, wenn auf die erste URL zugegriffen wird. Hier wird die Anfrage, die an das Stammverzeichnis von Apache gesendet wurde, im Django-Projekt auf wsgi.py übersprungen. --WSGIPythonPath: Der Pfad, der während der Ausführung an Python übergeben werden soll. --WSGIPythonHome: Python-Ausgangsverzeichnis für Apache. --Directory ~ Below: Gewährt Apache-Berechtigungen für das angegebene Verzeichnis.

Referenz: Offizielles Dokument Verwendung von Django mit Apache und mod_wsgi

Starten Sie Apache nach dem Ausfüllen neu.

$ sudo service httpd restart

Wenn Sie über Ihren Browser auf Ihre Website zugreifen und das mit Django erstellte Projekt erfolgreich angezeigt wird, sind Sie erfolgreich!

6. Veröffentlichen statischer Dateien (CSS, JS, IMG)

Ich denke jedoch, dass sich mein derzeit im Browser angezeigtes Projekt in einem Zustand befindet, in dem CSS und JS nicht funktionieren / Bilder nicht angezeigt werden. Dies ist auf die unterschiedliche Behandlung statischer Dateien zwischen der Entwicklungsumgebung und der Produktionsumgebung zurückzuführen.

Mechanismus der Veröffentlichung statischer Dateien

Im Allgemeinen sollten statische Dateien bei der Entwicklung einer App mit Django häufig in statischen Ordnern in jeder Anwendung gespeichert werden.

project
 │ manage.py
 ├─project
 │  │  settings.py
 │  │  local_settings.py
 │  └─ wsgi.py
 ├─app1
 │  ├─templates
 │  └─static #Statische Datei, die von App1 verwendet wird
 └─app2
    ├─templates
    └─static #Statische Datei, die von App2 verwendet wird

In der Produktionsumgebung (= DEBUG ist in der Einstellung False) werden jedoch alle statischen Dateien an einem Ort (im Allgemeinen direkt unter dem Projekt) gesammelt und vom Webserver (Apache) verwendet. Daher wird nicht erkannt, wann statisch für jede Anwendung wie zum Zeitpunkt der Entwicklung verteilt wird. Referenz: Offizielles Dokument Statische Dateien bereitstellen Umgang mit statischen Dateien in Django

Hinzufügen von settings.py

Django verfügt über einen Mechanismus, mit dem Sie dies mit einem einzigen Befehl tun können, ohne manuell ein statisches Dateiverzeichnis für Ihre Produktionsumgebung erstellen zu müssen. Von hier aus können Sie damit Einstellungen zum Sammeln statischer Dateien direkt unter dem Projekt hinzufügen.

Stellen Sie sicher, dass Sie die folgenden Einstellungen in project / settings.py haben:

project/settings.py


# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'

Diese Einstellung sollte standardmäßig vorhanden sein. Die Bedeutung von jedem ist wie folgt.

--BASE_DIR: Pfad des Projektdokumentstamms (= oberstes Projektverzeichnis). --STATIC_URL: URL für die Verteilung statischer Dateien.

Sobald dies bestätigt ist, fügen Sie die folgenden Einstellungen zu settings.py hinzu.

project/settings.py


STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATIC_ROOT ist eine Einstellung, in der statische Dateien für die Produktionsumgebung erfasst werden. Hier lautet die Einstellung "Erstellen Sie einen Ordner namens static direkt unter dem Projekt".

Statische Dateien sammeln

Wenn Sie dies tun können, sind Sie bereit zu gehen. Verwenden Sie Befehle, um die statischen Dateien zu sammeln, die für jede Anwendung am Speicherort von STATIC_ROOT verteilt sind. Gehen Sie direkt unter das Projekt (wo manage.py ausgeführt werden kann) und führen Sie den folgenden Befehl aus.

$ python manage.py collectstatic

Durch Ausführen dieses Befehls wird automatisch eine statische Datei direkt unter dem Projekt generiert und alle von der Anwendung verwendeten statischen Dateien werden darin gespeichert.

project
 │ manage.py
 ├─static #Neues Verzeichnis
 ├─project
 │  │  settings.py
 │  │  local_settings.py
 │  └─ wsgi.py
 ├─app1
 │  ├─templates
 │  └─static
 └─app2
    ├─templates
    └─static

Einstellungen auf der Apache-Seite hinzugefügt

Lassen Sie Apache als Nächstes das Verzeichnis der statischen Dateien erkennen, die an einem Ort gesammelt wurden. Fügen Sie der Datei /etc/httpd/conf.d/django.conf die folgenden Einstellungen hinzu.

/etc/httpd/conf.d/django.conf


Alias /static/ /home/ec2-user/Django/project/static/

<Directory /home/ec2-user/Django/project/static>
Require all granted
</Directory>

Die Bedeutung von jedem ist wie folgt.

--Alias: Wenn auf die erste URL zugegriffen wird, wird sie in das zweite Verzeichnis übertragen. Wenn auf (Domänenname) / static (STATIC_ROOT in settings.py festgelegt) zugegriffen wird, wird hier die statische Datei für die zuvor mit dem Befehl collect static erstellte Produktionsumgebung übersprungen. --Verzeichnis und darunter: Gewähren Sie statischen Dateien für Produktionsumgebungen Apache-Berechtigungen.

Apache Neustart

Starten Sie Apache neu, sobald Sie bereit sind.

$ sudo service httpd restart

Wenn Sie über Ihren Browser auf Ihre Domain zugreifen und Ihre Website mit statischen Dateien anzeigen können, ist dies ein großer Erfolg!

Recommended Posts

Veröffentlichen Sie Ihre Django-App unter Amazon Linux + Apache + mod_wsgi
[Hinweis] Führen Sie Django unter Amazon Linux 2 aus
Django + Apache mit mod_wsgi unter Windows Server 2016
Installieren Sie Python3 und Django unter Amazon Linux (EC2) und führen Sie den Webserver aus
Führen Sie eine Django-Anwendung unter Windows + Apache + mod_wsgi + aus.
Initialisieren Sie die Django-App
Installieren Sie Linux auf Chromebox
Setzen Sie jenv in Amazon Linux ein
Installieren Sie Django auf dem Mac
Installieren Sie tomcat 5.5 unter Amazon Linux.
Django - Bereitstellung des virtuellen Hosts Apache mod_wsgi
Installieren von Homebrew unter Amazon Linux 2
Installieren Sie Python Pillow unter Amazon Linux
Installieren Sie Oracle Java8 unter Amazon Linux2
Versuchen Sie, OpenAM unter Amazon Linux zu installieren
Stellen Sie die Django-Anwendung auf Heroku bereit
Implementieren Sie die Django-App auf Hy
DJango-Seite veröffentlicht auf Heroku: Practice
[Hinweis] Installieren Sie Imagick unter Amzon Linux2
Führen Sie die Python 3.5.2-Umgebung unter Amazon Linux ein
Führen Sie cron unter Amazon Linux aus (unter Linux eingestellt).
Erstellen Sie eine Django-App auf Docker und stellen Sie sie in AWS Fargate bereit
So zeigen Sie statische Django-Dateien in der Amazon Linux2 + Apache-Umgebung korrekt an
Die Geschichte des Ausführens der asp.net Core 3.1-App auf der arm64-Version von Amazon Linux 2
Bis die Django-Anwendung (+ MySQL) auf AWS EC2 veröffentlicht wird (+ RDS (+ S3))
Ich werde Ruby auf EC2 (Amazon Linux2) 2020 installieren
Verwenden Sie Numpy, Scipy, Scikit-Learn unter Amazon Linux
Django / Apache / mod_wsgi: Kein Modul namens importlib
Stellen Sie die Django-App in Heroku bereit [Teil 2]
Reagieren Sie → Ajax → Django auf Linux-Implementierungshinweise
Stellen Sie die Django-App in Heroku bereit [Teil 1]
So aktualisieren Sie PHP unter Amazon Linux 2
Lernen Sie sshd_config und autorisierte_Tasten (für Amazon Linux 2)
CentOS8 + Apache2.4 + pyenv + mod_wsgi + Django-Projektbereitstellung
CentOS 6.4, Python 2.7.3, Apache, mod_wsgi, Django
5 Gründe, Linux auf Ihrem Laptop zu installieren.
Docker-Datei: Installieren Sie Docker auf einem Linux-Server
Erstellen der ersten App mit Django Startprojekt
Veröffentlichen Sie Ihre Website mit Responder + Gunicorn + Apache
Installieren Sie Python 3.8, Pip 3.8 auf EC2 (Amazon Linux 2)
Veröffentlichtes Django-Projekt, entwickelt in Cloud9 auf Heroku
Lassen Sie uns Django und Apache (httpd) auf dem Mac integrieren! !!
Installieren Sie PHP der 7er-Serie unter Amazon Linux 2 mit Amazon Linux Extras