Kann Django allein auf Gunicorn laufen (kein Apache oder Nginx)?

8

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?

    
Sahat Yalkabov 02.06.2012, 12:16
quelle

5 Antworten

6

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.

    
Lakshman Prasad 02.06.2012, 19:25
quelle
7

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.

    
Mark Lavin 02.06.2012 13:53
quelle
5

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.

    
Andbdrew 02.06.2012 13:46
quelle
2

Ich empfehle die Verwendung von Nginx aus verschiedenen Gründen:

  • Wartung oder interne Serverfehlerseite kann leicht implementiert werden, wenn Gunicorn nicht verfügbar ist. Das bedeutet, dass Sie immer etwas zu antworten haben, wenn Ihr Anwendungsserver nicht läuft.
  • Wie Gunicorn doc vorschlägt, werden HTTP-Angriffe wie DOS nicht erkannt.
  • Möglicherweise möchten Sie später eine eigene Lastenausgleichsstrategie implementieren. Dies wird für das Release-Engineering wichtiger, wenn Ihr Projekt skaliert wird. Persönlich habe ich AWS ELB ein wenig unzuverlässig gefunden und ich denke darüber nach.

Aktualisieren :

Siehe auch eine gut geschriebene Antwort eines Gunicorn-Entwicklers:

Warum brauche ich Nginx und etwas wie Gunicorn?

    
hurturk 20.07.2013 17:01
quelle
1

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.

    
alanjds 11.06.2013 20:14
quelle