Website-Suche

Wie man Django mit mod_wsgi und Apache in einer virtualenv Python-Umgebung auf einem Debian VPS ausführt


Einführung

Die Arbeit mit Django-Anwendungen und Python-Anwendungen im Allgemeinen ist ein komplexes Thema mit vielen verwendeten Werkzeugen. Es gibt verschiedene Möglichkeiten, dasselbe Ziel zu erreichen, und oft gibt es keinen einzigen Weg, um Dinge zu tun.

Eine der beliebtesten Möglichkeiten, Django-Anwendungen auf einem dedizierten Server im Internet bereitzustellen, ist die Verwendung von Nginx in Kombination mit Gunicorn. Eine großartige Möglichkeit, dies zu tun, wurde bereits ausführlich in diesem Artikel beschrieben. Es ist jedoch ein recht beliebtes Szenario, Django-Anwendungen zusammen mit bestehenden Websites, die mit Apache bereitgestellt werden, zu hosten. Wir werden versuchen, den schnellen Weg zu diesem speziellen Ziel zu beschreiben. Bitte beachten Sie jedoch, dass dies kein endgültiger Leitfaden für die Kombination von Django und Apache ist und es Konfigurationsaspekte gibt, die hier nicht behandelt werden.

Dieser Text wird mehrere Annahmen treffen:

  • Sie haben bereits Ihren Droplet mit Debian 7.0 oder später eingerichtet. Es gibt viele Unterschiede zwischen verschiedenen Linux-Distributionen; daher werden wir zur Klarheit einen Debian-Server in den Fokus nehmen.

  • Sie sind mindestens ein wenig mit gängigen Python-Tools wie pip Paketmanager und virtualenv zum Erstellen von virtuellen Umgebungen vertraut. Diese Tools werden in diesem Artikel wunderbar erklärt.

  • Sie sind zumindest ein wenig mit der Django-Projektstruktur vertraut, da dieser Artikel nicht dazu gedacht ist, die Verwendung und Konfiguration von Django selbst zu durchlaufen.

  • Sie sind mit der grundlegenden Apache-Administration vertraut, da dieses Tutorial nur die einfache Installation des Servers selbst und die notwendigen Konfigurationsänderungen zur Paarung von Django mit Apache behandelt.

Voraussetzungen

Bevor Sie neue Pakete installieren, ist es immer eine gute Praxis, Ihre Systempakete und Paketindizes zu aktualisieren. Dazu führen Sie aus:

apt-get update
apt-get upgrade

Apache installieren

Da dieser Text sich darauf konzentriert, Apache zu verwenden, um die Anwendung bereitzustellen, ist der Server selbst notwendig. Um die erforderlichen Pakete zu installieren, führen Sie aus:

apt-get install apache2

Unmittelbar nach der Installation wird Apache bereits ausgeführt. Sie können überprüfen, ob der Apache-Webserver richtig eingerichtet wurde, indem Sie Ihren Webbrowser öffnen und die IP-Adresse des Servers aufrufen. Sie sollten eine einfache Es funktioniert! Seite auf dem Bildschirm sehen.

Pip und virtualenv installieren

Um mit Python und Django auf einem Webserver zu arbeiten, müssen zuerst pip und virtualenv installiert werden. Pip ist ein Python-Paketmanager, der die Installation von Python-Softwarepaketen wie Django selbst erleichtert, während virtualenv es ermöglicht, separate virtuelle Umgebungen für Python-Anwendungen zu erstellen, um die für verschiedene Anwendungen benötigten Bibliotheken zu trennen und Versionskonflikte zwischen ihnen zu vermeiden.

Um das zu tun, führen Sie aus:

apt-get install python-pip python-virtualenv

Dieser Befehl installiert pip und virtualenv aus dem Debian-Paket-Repository. Sie können überprüfen, ob beide Werkzeuge ordnungsgemäß installiert wurden, indem Sie sie mit dem --version Schalter ausführen.

root@django:~# virtualenv --version
1.7.1.2
root@django:~# pip --version
pip 1.1 from /usr/lib/python2.7/dist-packages (python 2.7)
root@django:~#

Erstellen einer virtuellen Umgebung mit virtualenv

Bei der Apache-Installation wird automatisch ein /var/www-Verzeichnis erstellt, in dem das Standard-Webserver-Stammverzeichnis eingerichtet ist. Wir werden dort unsere neue Django-Anwendung mit all ihren Abhängigkeiten ablegen.

Lass uns ein neues Verzeichnis namens sampleapp in diesem Verzeichnis erstellen und in das neue Verzeichnis eintreten:

cd /var/www
mkdir sampleapp
cd sampleapp

Lass uns dann eine neue virtuelle Umgebung mit virtualenv erstellen. Eine Python-virtuelle Umgebung ist im Grunde ein Verzeichnis, in dem der Python-Interpreter und eine lokale Instanz von pip untergebracht sind. Die lokale Instanz von pip installiert alle Pakete innerhalb der virtuellen Umgebung. So wird verhindert, dass installierte Pakete die globale Python-Installation verschmutzen, und es gibt auch keine Möglichkeit eines Versionskonflikts von Paketen in einem hypothetischen Szenario, in dem zwei Anwendungen zwei verschiedene Versionen von Django oder einer anderen Bibliothek ausführen.

Um eine neue virtuelle Umgebung zu erstellen, geben Sie ein:

virtualenv env

wobei env der Name der virtuellen Umgebung ist - es könnte auch ein anderes Wort sein. Die Ausgabe dieses Befehls sollte folgendermaßen aussehen:

root@django:/var/www/sampleapp# virtualenv env
New python executable in env/bin/python
Installing distribute.............................................................................................................................................................................................done.
Installing pip...............done.
root@django:/var/www/sampleapp#

Die virtuelle Umgebung ist jetzt bereit und kann auf zwei verschiedene Arten genutzt werden.

Eine Möglichkeit besteht darin, Befehle direkt mit dem Interpreter der virtuellen Umgebung auszuführen. Bei dieser Methode ist es notwendig, sich immer daran zu erinnern, den richtigen Interpreter oder pip-Instanz auszuführen, da die Möglichkeit besteht, eine systemweite Instanz auszuführen.

root@django:/var/www/sampleapp# env/bin/pip --version
pip 1.1 from /var/www/sampleapp/env/lib/python2.7/site-packages/pip-1.1-py2.7.egg (python 2.7)
root@django:/var/www/sampleapp# env/bin/python --version
Python 2.7.3
root@django:/var/www/sampleapp#

Der andere Weg ist, die Umgebung zuerst zu aktivieren, indem man

source env/bin/activate

Der Name der Umgebung wird dann wie folgt an die Kommandozeile angefügt.

root@django:/var/www/sampleapp# source env/bin/activate
(env)root@django:/var/www/sampleapp#

und alle ausgeführten Befehle werden unter Verwendung lokaler virtueller Umgebungs-Versionen erfolgen

(env)root@django:/var/www/sampleapp# pip --version
pip 1.1 from /var/www/sampleapp/env/lib/python2.7/site-packages/pip-1.1-py2.7.egg (python 2.7)
(env)root@django:/var/www/sampleapp# python --version
Python 2.7.3
(env)root@django:/var/www/sampleapp#

Es ist einfacher, auf diese Weise zu arbeiten; jedoch ist es notwendig, die Umgebung nach Beendigung der Arbeit mit dem folgenden Befehl zu deaktivieren.

deactivate

Es wird die Shell wieder in den Normalzustand versetzen.

(env)root@django:/var/www/sampleapp# deactivate
root@django:/var/www/sampleapp#

Die frisch erstellte Umgebung wird verwendet, um alle notwendigen Abhängigkeiten zu speichern, einschließlich Django und verwandten Bibliotheken. Sie wird auch später von Apache und mod_wsgi verwendet, um die Anwendung mit den richtigen Abhängigkeiten bereitzustellen.

Django in einer virtuellen Umgebung installieren

Der nächste notwendige Schritt ist die Installation von Django innerhalb der virtuellen Umgebung. Lassen Sie uns das tun, ohne die Umgebung vorher zu aktivieren, indem wir:

env/bin/pip install django

Die letzten Nachrichten, die nach der Ausführung dieses Befehls angezeigt werden, sollten so aussehen:

Successfully installed django
Cleaning up...

Django ist jetzt innerhalb der virtuellen Umgebung installiert und nicht in der systemweiten Python-Installation verfügbar. Sie können dieses Verhalten überprüfen, indem Sie das django-Modul mit beiden Interpretern importieren.

root@django:/var/www/sampleapp# python
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named django
>>> exit()

Der Import mit dem systemweiten Interpreter ist fehlgeschlagen, während

root@django:/var/www/sampleapp# env/bin/python
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>>

Derjenige, der in der virtuellen Umgebung ausgeführt wurde, war erfolgreich.

Erstellen des ersten Django-Projekts

Um ein einfaches, grundlegendes Beispielprojekt zu erstellen, können wir das Skript django-admin.py wie folgt verwenden.

 env/bin/django-admin.py startproject sampleapp .

Bitte beachten Sie das nachgestellte . im Befehl - ohne diesen wird das Projekt in einem zusätzlichen Unterverzeichnis erstellt. Nach dem Ausführen dieses Befehls wird ein neues Verzeichnis sampleapp sowie das Skript manage.py im Verzeichnis /var/www/sampleapp erstellt. Das Skript manage.py wird verwendet, um Django-Befehle für dieses spezielle Projekt auszuführen. Eine der möglichen Verwendungen von manage.py besteht darin, eine Testserverinstanz auszuführen, um zu überprüfen, ob alles wie gewünscht funktioniert.

Bitte ausführen:

env/bin/python manage.py runserver 0.0.0.0:8000

Dies wird einen Testserver starten, der an alle Schnittstellen auf Port 8000 gebunden ist. Die Ausgabe sollte folgendermaßen aussehen:

Validating models...

0 errors found
April 08, 2014 - 12:29:31
Django version 1.6.2, using settings 'sampleapp.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

Wenn Sie Ihre Server-IP-Adresse mit Port 8000 in Ihrem Browser öffnen (die Adresse sollte wie http://<ip-Adresse>:8000/ aussehen), sollten Sie die Es hat funktioniert! Beispiel Django Seite sehen. Dies ist das Ergebnis, auf das wir hinarbeiten werden, indem wir den Apache-Webserver anstelle des integrierten Django Entwicklungsservers verwenden.

Da die Django-Anwendung ordnungsgemäß funktioniert, können wir fortfahren, die Anwendung mit Apache zu verbinden.

Mod_wsgi für Apache installieren

Die einfachste und auch empfohlene Methode, um Python-Anwendungen mit Apache bereitzustellen, besteht darin, das Modul mod_wsgi zu verwenden. Es ist weder mit Python noch mit Apache standardmäßig installiert, daher müssen wir ein zusätzliches Paket installieren.

apt-get install libapache2-mod-wsgi

Der nächste Schritt wird sein, den standardmäßigen Apache virtuellen Host zu konfigurieren, der zu Beginn des Artikels die Seite Es funktioniert! angezeigt hat, um unsere Django Anwendung bereitzustellen.

Konfigurieren von mod_wsgi in einem Standard-virtuellen Host

Die Idee hinter der Konfiguration von mod_wsgi für jeden anderen virtuellen Host in Apache ist dieselbe wie die hier vorgestellte. Zur Vereinfachung verwenden wir den Standard-Host, da er der ist, der bereits von einer sauberen Apache-Installation bereitgestellt wird.

Öffnen Sie die Standard-Serverkonfigurationsdatei im nano Editor

nano /etc/apache2/sites-enabled/000-default 

und füge drei folgende Zeilen direkt unter <VirtualHost *:80> hinzu

WSGIDaemonProcess sampleapp python-path=/var/www/sampleapp:/var/www/sampleapp/env/lib/python2.7/site-packages
WSGIProcessGroup sampleapp
WSGIScriptAlias / /var/www/sampleapp/sampleapp/wsgi.py

Die erste Zeile erzeugt einen WSGI-Daemon-Prozess namens sampleapp, der für das Bereitstellen unserer Django-Anwendung verantwortlich ist. Der Daemon-Name kann grundsätzlich alles sein, aber es ist eine gute Praxis, hier beschreibende Namen wie Anwendungsnamen zu verwenden.

Wenn wir die globale Python-Installation und die globale Django-Instanz verwenden würden, wäre die python-path-Richtlinie nicht notwendig. Bei der Verwendung eines virtuellen Umgebungen ist es jedoch erforderlich, den alternativen Python-Pfad anzugeben, damit mod_wsgi weiß, wo es nach Python-Paketen suchen soll.

Der Pfad muss zwei Verzeichnisse enthalten: das Verzeichnis des Django-Projekts selbst - /var/www/sampleapp - und das Verzeichnis der Python-Pakete innerhalb unserer virtuellen Umgebung für dieses Projekt - /var/www/sampleapp/env/lib/python2.7/site-packages. Verzeichnisse in der Pfaddefinition werden durch einen Doppelpunkt getrennt.

Die zweite Zeile weist den spezifischen virtuellen Host an, den zuvor erstellten WSGI-Daemon zu verwenden, und daher muss der Daemon-Name zwischen diesen beiden übereinstimmen. Wir haben in beiden Zeilen sampleapp verwendet.

Die dritte Zeile ist die wichtigste, da sie Apache und mod_wsgi sagt, wo die WSGI-Konfiguration zu finden ist. Die von Django bereitgestellte wsgi.py enthält die grundlegende Standardkonfiguration für WSGI zum Bereitstellen von Django Anwendungen, die einwandfrei funktioniert, und Änderungen an der Konfiguration in dieser Datei liegen außerhalb des Rahmens dieses Artikels.

Nach diesen Änderungen ist es notwendig, Apache neu zu starten.

service apache2 restart

Nachdem Sie dies getan haben, sollten Sie beim Öffnen des Webbrowsers mit der IP-Adresse Ihres Servers, ohne weitere Ports, dieselbe Django-Seite wie zuvor sehen, anstelle der ursprünglichen Es funktioniert!-Seite, die wir zuvor gesehen haben.

Das macht unsere Konfiguration vollständig.

Bitte beachten Sie: Die Verwendung des standardmäßigen virtuellen Hosts ohne zusätzliche Sorgfalt wird nicht empfohlen, um einen Produktionsserver zu konfigurieren. Es wird zu Demonstrationszwecken verwendet.

Weiterführende Literatur

Das Thema der Konfiguration von mod_wsgi und Django selbst ist umfassend. Viele Konfigurationsaspekte sind anwendungsspezifisch und schwer zu erklären oder zu demonstrieren, ohne mit einer realen Django-Anwendung zu arbeiten. Diese Anleitung ist kein vollständiges Handbuch zur Bereitstellung von Django-Anwendungen mit Apache, sondern ein Schnellstartleitfaden, wie man beginnt.

Eine der besten Ressourcen ist die offizielle Django-Dokumentation. Es gibt auch großartige Artikel auf DigitalOcean, die gefunden werden können, indem man Django als Suchbegriff verwendet.

Artikel eingereicht von: Mateusz Papiernik