Ich habe fast jedes django + nginx-Tutorial im Internet ausprobiert und kann keine Bilddatei auf dem Bildschirm anzeigen. Es ist immer die alte Geschichte - 404 SEITE NICHT GEFUNDEN . Die Webseite wird geladen, aber django.png in meinem / static / Ordner nicht. Nicht sicher, ob es ein Problem in settings.py oder mit nginx ist.
Ich bin so frustriert, dass ich mich weigere, mir ein anderes "How to get nginx / django Tutorial" anzuschauen. Wenn ich in naher Zukunft eine Website bereitstellen werde, wird Gunicorn ausreichen, um eine Django-Site zu betreiben und statische Dateien gleichzeitig zu bedienen, ohne Apache oder nginx zu benutzen? Gibt es einen großen Vorteil für einen Reverse-Proxy überhaupt?
Ja. Gunicorn kann auch deinem Statik dienen.
Wenn alles andere fehlschlägt, lassen Sie django das für Sie tun (tun Sie dies jedoch als letzten Ausweg vor Frustration.) Dazu müssen Sie nur ein weiteres URL-Muster hinzufügen, wie folgt:
%Vor%Während django serving static besser ist als gar nicht, es lohnt sich, das auf die Server zu übertragen, die für dasselbe wie nginx optimiert sind.
Ich würde empfehlen, nginx an einem anderen Port zu starten und die django STATIC_URL-Einstellung so zu ändern, dass sie den Port enthält (nachdem Sie bestätigt haben, dass der Port die Statik bedient). - Dies ist so einfach wie ein Simlink zum MEDIA_ROOT aus dem Nginx-Ordner.
Und wenn du sowieso nginx verwendest, ist es auch gut, alle Anfragen, die es benutzen, zu übernehmen und die Django-Anfrage nur an das Gunicorn zu übergeben. All dies erfordert das Hinzufügen einer conf
-Datei, die nginx entsprechend informiert.
Ich kann sehen, wie es für diejenigen, die beginnen und versuchen, alles zu tun (Proxy-Anfragen, statisch zu dienen, nginx zu konfigurieren), auf einmal verwirrend sein kann. Probieren Sie es nacheinander aus. Hol die Medien aus dem Gunicorn; Dann serviere es von Nginx und dann schließlich auch den Nginx-Proxy. Aber machen Sie das alles, bevor Sie Ihre App in Produktion haben. Dieser Ansatz, den ich gesehen habe, erhöht das Verständnis und verringert die Frustration.
Die Dokumentation von Gunicorn weist darauf hin, dass der Standard-Worker ohne Proxy-Pufferung langsamer Clients anfällig für einen Denial-of-Service-Angriff ist: Ссылка
Obwohl viele HTTP-Proxies verfügbar sind, empfehlen wir dringend dass du Nginx benutzt. Wenn Sie einen anderen Proxy-Server wählen, müssen Sie Stellen Sie sicher, dass es langsame Clients puffert, wenn Sie Standard-Gunicorn verwenden Arbeitskräfte. Ohne diese Pufferung wird Gunicorn leicht anfällig für Denial-of-Service-Angriffe. Sie können Slowloris verwenden, um zu überprüfen, ob Sie Proxy verhält sich richtig.
Dies ist möglicherweise nicht der Fall, wenn Sie einen der asynchronen Worker wie gevent oder tornado verwenden.
Wenn Sie bereits Amazon Web Services verwenden, können Sie s3 Buckets verwenden, um Ihren statischen Inhalt zu hosten und Ihre App mithilfe von gunicorn (oder was auch immer Sie wollen) an ec2 zu verteilen. Auf diese Weise müssen Sie sich keine Gedanken darüber machen, Ihren eigenen statischen Dateiserver einzurichten.
Ich empfehle die Verwendung von Nginx aus verschiedenen Gründen:
Aktualisieren :
Siehe auch eine gut geschriebene Antwort eines Gunicorn-Entwicklers:
Ich habe mit einer Werkzeug Middleware gemacht. Ist nicht schön, noch performant wie die Verwendung eines Nginx-Servers, aber macht den Job:
Setzen Sie STATIC_ROOT auf settings.py
%Vor%Dann sagen Sie Werkzeug, Dateien aus diesem Ordner zu liefern
%Vor%Wenn DEBUG = True ist, dienen Django die Dateien. Wenn DEBUG = False, liefert Werkzeug Dateien aus dem statisch gesammelten Ordner. Sie müssen Collectstatic auf dem Server ausführen, der DEBUG = False verwendet, damit das funktioniert.
Obs: Aus irgendeinem Grund gibt Werkzeug 500 für nicht gefundene Dateien, nicht 404. Es ist seltsam, aber funktioniert immer noch. Wenn Sie wissen warum, kommentieren Sie bitte.
Tags und Links python django nginx amazon-ec2 gunicorn