Welches "Setup" hat am besten funktioniert? Ich habe virtualenv verwendet und mein Django-Projekt in diese Umgebung verschoben. Ich habe jedoch andere Setups gesehen, in denen sich ein Ordner für virtuelle Umgebungen und andere für Projekte befindet.
virtualenv ist eine Möglichkeit, Python-Umgebungen zu isolieren. Als solches spielt es bei der Bereitstellung keine große Rolle - während der Entwicklung und des Testens ist es jedoch eine Anforderung, wenn es nicht dringend empfohlen wird.
Der Wert, den Sie von virtualenv erhalten würden, besteht darin, dass Sie sicherstellen können, dass die richtigen Versionen von Bibliotheken für die Anwendung installiert sind. Es spielt also keine Rolle, wo Sie die virtuelle Umgebung selbst anbringen. Stellen Sie nur sicher, dass Sie es nicht in das Versionsverwaltungssystem des Quellcodes aufnehmen.
Das Dateisystemlayout ist nicht kritisch. Sie werden viele Artikel sehen, die die Vorzüge von Verzeichnislayouts und sogar Skelettprojekten preisen, die Sie als Ausgangspunkt klonen können. Ich denke, dies ist eher eine persönliche Präferenz als eine harte Anforderung. Sicher ist es schön zu haben; Wenn Sie jedoch nicht wissen, warum , wird Ihr Bereitstellungsprozess keinen Mehrwert erhalten. Tun Sie dies also nicht, da einige Blogs dies empfehlen, es sei denn, dies ist für Ihr Szenario sinnvoll. Beispiel: setup.py
Sie müssen keine Datei erstellen , wenn Sie keinen privaten PyPi-Server haben, der Teil Ihres Bereitstellungsworkflows ist.
Wie kann ich Dinge so einrichten, dass mehrere Sites auf einem einzigen Server gehostet werden können?
Es gibt zwei Dinge, die Sie für mehrere Site-Setups benötigen:
- Ein Server, der die öffentliche IP an Port 80 und / oder Port 443 überwacht, wenn Sie über SSL verfügen.
- Eine Reihe von "Prozessen", auf denen der eigentliche Django-Quellcode ausgeführt wird.
Die Leute verwenden Nginx für # 1, weil es ein sehr schneller Proxy ist und nicht mit dem Overhead eines umfassenden Servers wie Apache verbunden ist. Sie können Apache verwenden, wenn Sie damit vertraut sind. Es gibt keine Anforderung, dass "für mehrere Websites Nginx verwendet wird"; Sie benötigen lediglich einen Dienst, der diesen Port überwacht und weiß, wie Sie zu Ihren Prozessen umleiten (Proxy), auf denen der eigentliche Django-Code ausgeführt wird.
Für # 2 gibt es einige Möglichkeiten, diese Prozesse zu starten. gevent / uwsgi sind die beliebtesten. Das einzige, woran Sie sich erinnern sollten, ist , keinen Runserver in der Produktion zu verwenden .
Das sind die absoluten Mindestanforderungen. Normalerweise fügen Leute eine Art Prozessmanager hinzu, um alle laufenden "Django-Server" (# 2) zu steuern. Hier sehen upstart
und supervisor
erwähnt. Ich bevorzuge Supervisor, da er nicht das gesamte System übernehmen muss (im Gegensatz zu Upstart). Dies ist jedoch wiederum keine schwierige Anforderung . Sie könnten eine Reihe von screen
Sitzungen perfekt ausführen und sie erneut abrufen. Der Nachteil ist, dass Sie bei einem Neustart Ihres Servers die Bildschirmsitzungen neu starten müssen.
Persönlich würde ich empfehlen:
- Nginx für # 1
- Treffen Sie Ihre Wahl zwischen Uwsgi und Gunicorn - ich benutze Uwsgi.
- Supervisor für die Verwaltung der Backend-Prozesse.
- Individuelle Systemkonten (Benutzer) für jede Anwendung, die Sie hosten.
Der Grund, warum ich # 4 empfehle, besteht darin, Berechtigungen zu isolieren. wieder keine Voraussetzung.
Warum schlagen einige Leute vor, gunicorn_django -b 0.0.0.0:8000 zu verwenden, und andere schlagen gunicorn_django -b 127.0.0.1:8000 vor? Ich habe Letzteres in einer Amazon EC2-Instanz getestet, aber es hat nicht funktioniert, während Ersteres ohne Probleme funktioniert hat.
0.0.0.0
bedeutet "alle IP-Adressen" - es ist eine Meta-Adresse (dh eine Platzhalter-Adresse). 127.0.0.1
ist eine reservierte Adresse, die immer auf den lokalen Computer verweist. Deshalb heißt es "localhost". Es ist nur für Prozesse erreichbar, die auf demselben System ausgeführt werden.
In der Regel überwacht der Front-End-Server (Nr. 1 in der obigen Liste) die öffentliche IP-Adresse. Sie sollten den Server explizit an eine IP-Adresse binden .
Wenn Sie jedoch aus irgendeinem Grund DHCP verwenden oder die IP-Adresse nicht kennen (z. B. ein neu bereitgestelltes System), können Sie nginx / apache / jedem anderen Prozess mitteilen, an den gebunden werden soll 0.0.0.0
. Dies sollte eine vorübergehende Stop-Gap-Maßnahme sein .
Für Produktionsserver haben Sie eine statische IP. Wenn Sie eine dynamische IP (DHCP) haben, können Sie in verlassen 0.0.0.0
. Es ist jedoch sehr selten, dass Sie DHCP für Ihre Produktionsmaschinen haben.
Das Binden von Gunicorn / Uwsgi an diese Adresse wird in der Produktion nicht empfohlen . Wenn Sie Ihren Backend-Prozess (gunicorn / uwsgi) an binden 0.0.0.0
, kann er "direkt" unter Umgehung Ihres Front-End-Proxys (nginx / apache / etc) zugänglich werden. Jemand könnte http://your.public.ip.address:9000/
Ihre Anwendung einfach direkt anfordern und darauf zugreifen, insbesondere wenn Ihr Front-End-Server (nginx) und Ihr Back-End-Prozess (django / uwsgi / gevent) auf demselben Computer ausgeführt werden .
Sie können dies tun, wenn Sie nicht die Mühe haben möchten, einen Front-End-Proxyserver auszuführen.
Welche Logik steckt hinter der Konfigurationsdatei von nginx? Es gibt so viele Tutorials mit drastisch unterschiedlichen Konfigurationsdateien, dass ich mir nicht sicher bin, welche besser ist. Einige Benutzer verwenden beispielsweise "alias / path / to / static / folder" und andere "root / path / to / static / folder". Möglicherweise können Sie Ihre bevorzugte Konfigurationsdatei freigeben.
Das erste, was Sie über Nginx wissen sollten, ist, dass es sich nicht um einen Webserver wie Apache oder IIS handelt. Es ist ein Proxy. Es werden also verschiedene Begriffe wie "Upstream" / "Downstream" und mehrere "Server" definiert. Nehmen Sie sich etwas Zeit und lesen Sie zuerst das Nginx-Handbuch durch.
Es gibt viele verschiedene Möglichkeiten, Nginx einzurichten. aber hier ist eine Antwort auf Ihre Frage auf alias
vs. root
. root
ist eine explizite Anweisung, die das Dokumentstammverzeichnis (das "Home-Verzeichnis") von nginx bindet. Dies ist das Verzeichnis, in dem angezeigt wird, wenn Sie eine Anfrage ohne Pfad wie gebenhttp://www.example.com/
alias
bedeutet "einem Verzeichnis einen Namen zuordnen". Alias-Verzeichnisse sind möglicherweise kein Unterverzeichnis des Dokumentstamms.
Warum erstellen wir in / etc / nginx einen Symlink zwischen Site-verfügbar und Site-aktiviert?
Dies ist etwas Einzigartiges für Debian (und Debian-ähnliche Systeme wie Ubuntu). sites-available
listet Konfigurationsdateien für alle virtuellen Hosts / Sites auf dem System auf. Ein Symlink von sites-enabled
zu sites-available
"aktiviert" diese Site oder diesen virtuellen Host. Auf diese Weise können Sie Konfigurationsdateien trennen und Hosts einfach aktivieren / deaktivieren.