Forum: PC-Programmierung Django mit nginx auf Server productiv


von Sebastian (Gast)


Lesenswert?

Hallo,

ich möchte für unseren Verein zwei Homepages für Vereinsmitglieder 
online stellen. Vorerst geplant für 6 Monate.

Die Homepages sind soweit fertig und könnten produktiv live gehen. 
Allerdings verstehe ich noch so einige Punkte nicht.

Als Software kommt Ubuntu-Desktop zum Einsatz sowie das Django Framework 
in Verbindung mit nginx.

Jetzt habe ich so einiges im Internet gelesen und weiß irgendwie jetzt 
noch weniger wie zuvor.

Meine Vorgehensweise:
1
pip install uwsgi
2
pip install nginx

Zum testen habe ein Testfile innerhalb der ersten Homepage angelegt
1
# test.py
2
def application(env, start_response):
3
    start_response('200 OK', [('Content-Type','text/html')])
4
    return "Hello World"

Anschließend über die Console den folgenden Befehl
1
uwsgi --http :8000 --wsgi-file test.py

Wenn ich nun über den Browser localhost:8000 aufrufe bekomme ich eine 
leere Seite angezeigt und nicht die Hello World Begrüßung

Naja, ich dachte ich starte über Konsole
1
 uwsgi --http :8000 --chdir /home/sebastian/PyCharmProjects/base_1 module project.wsgi virtualenv /home/sebastian/PycharmProjects/base_1/venv

Und die nginx configuration angepasst
1
# nginx.conf
2
upstream django {
3
    # connect to this socket
4
    # server unix:///tmp/uwsgi.sock;    # for a file socket
5
    server 127.0.0.1:8001;      # for a web port socket
6
    }
7
8
server {
9
    # the port your site will be served on
10
    listen      8000;
11
    # the domain name it will serve for
12
    server_name .example.com;   
13
    charset     utf-8;
14
15
    #Max upload size
16
    client_max_body_size 75M;   
17
18
    # Django media
19
    location /media  {
20
                alias /home/sebastian/PycharmProjects/base_1/media;      
21
    }
22
23
        location /static {
24
                alias /home/sebastian/PycharmProjects/base_1/staticfiles;     
25
        }
26
27
    # Finally, send all non-media requests to the Django server.
28
    location / {
29
        uwsgi_pass  django;
30
        include     /etc/nginx/uwsgi_params; installed manually
31
        }
32
    }

zunächst Systemlink hergestellt
1
sudo ln -s /home/sebastian/PycharmProjects/base_1/nginx.conf /etc/nginx/sites-enabled/

Wenn ich nun nginx versuche zu starten
1
systemctl start nginx
, erhalte ich einen Fehler. Gemäß error.log:
1
2019/04/17 22:38:35 [emerg] 915#915: "upstream" directive is not allowed here in /etc/nginx/nginx.conf:2

Was habe ich vergessen, bzw falsch gemacht?

von Mario M. (thelonging)


Lesenswert?

Gehört das Ganze nicht in einen http-Kontext?
1
http {
2
  upstream django {
3
    server 127.0.0.1:8001;
4
  }
5
6
  server {
7
    listen      8000;
8
    ...
9
  }
10
}

von Joachim S. (oyo)


Lesenswert?

Wenn ich Dich richtig verstehe, dann liegt die oben aufgelistete 
Konfigurationsdatei unter
/home/sebastian/PycharmProjects/base_1/nginx.conf
bzw. als Symlink unter
/etc/nginx/sites-enabled/nginx.conf

Die Fehlermeldung hingegen interpretiere ich so, dass der eigentliche 
Fehler gar nicht in dieser Datei liegt - sondern in der zentralen 
Konfigurationsdatei
/etc/nginx/nginx.conf

Mir scheint es daher, dass Du die zentrale Konfigurationsdatei 
/etc/nginx/nginx.conf verändert hast und dabei einen Fehler gemacht 
hast.

von imonbln (Gast)


Lesenswert?

Sebastian schrieb:
> ich möchte für unseren Verein zwei Homepages für Vereinsmitglieder
> online stellen. Vorerst geplant für 6 Monate.

Plan lieber gleich richtig, erfahrungsgemäß ziehen sich solche 6 Monate 
gerne bis ins Unendliche.

Sebastian schrieb:
> Die Homepages sind soweit fertig und könnten produktiv live gehen.
> Allerdings verstehe ich noch so einige Punkte nicht.

Also mit Django und allen sonst, was die Seite braucht.. warum nimmst du 
dann eine Test Seite weiter unten ?

Sebastian schrieb:
> Als Software kommt Ubuntu-Desktop zum Einsatz sowie das Django Framework
> in Verbindung mit nginx.

Sicher das du das willst? Auf einen Desktopsystem sind so um eine 10 
Potenz zu viel unnötiges Zeug installiert (Aus Serversicht), Es reicht 
wenn eines Davon eine Sicherheitslücke hat und dein Server ist teil 
eines Botnetzwerk. Gerade das Grafische Zeug, macht auf einen Server 
mehr Probleme als nutzen. Ich rate dir daher dringend ein Ubuntu Server 
(oder Debian in der Server edition) zu nehmen und kein Desktop Linux. 
Zum Administieren reicht mit etwas Erfahrung ein SSH Zugang.

Sebastian schrieb:
> Meine Vorgehensweise:pip install uwsgi
> pip install nginx

ich hoffe das du den nginx nicht als pip sondern mit deb installiert 
hast.
generell hast du das pip in ein venv gemacht oder mit den "System" 
Python gemischt. ich empfehle dir hier pip und Deb Pakete nicht zu 
mischen und lieber für dein Projekt ein eigenes Verzeichnis anzulegen 
und beim Starten das venv zu sourcen. Zumbeispiel als teil deines 
systemd unit files.

Sebastian schrieb:
> /home/sebastian/PyCharmProjects/base_1

Der Pfad erscheint mir als erfahrender Devops auch ungeeignet für deine 
Homepage er suggeriert, dass das Backend der Homepage im Kontext des 
Benutzer sebastian läuft.
Vermutlich wird der sebastian mit sudo auch root rechte erlangen können, 
was im Umkehrschluss bedeutet, das eine Lücke in deinen Django Projekt 
ausreicht damit ein Hacker den Server sehr leicht übernehmen kann.

Ich würde erwarten das deine Projekte irgendwo unter /var/www liegen und 
dem benutzer www-data gehören, welcher mit minimalen rechten ausstattet 
wurden ist.

Sebastian schrieb:
> Zum testen habe ein Testfile innerhalb der ersten Homepage angelegt#
> test.py
> def application(env, start_response):
>     start_response('200 OK', [('Content-Type','text/html')])
>     return "Hello World"

hier bin ich mir nicht sicher ist es einfach nur das Testfile oder teil 
eines Django Projekt. Generell solange du das mit den uwsgi und den 
Django nicht im griff hast brauchst du dich um den nginx nicht zu 
kümmern.

Wenn es ein Django Projekt ist, zum debuggen bringt django ein eigenen 
wsgi mit sieht du was im Browser wenn du es ohne den uwsgi startest ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.