GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Django [Errno 13] Berechtigung verweigert:„/var/www/media/animals/user_uploads“

Die Lösung für dieses Problem beim Umgang mit dem Produktionsserver wäre, wie bereits erwähnt, Collectstatic zu verwenden, das es verwendet und gelöst hat, oder den Ordnern Berechtigungen zu erteilen. Wenn sich Ihre Lösung jedoch in einer lokalen Umgebung befindet, kann die Lösung erworben werden, indem Sie den lokalen MEDIA konfigurieren Verzeichnis im settings.py Datei, die auf dem lokalen Server agiert.

Also würden diese beiden Zeilen in der lokalen Konfigurationsdatei hinzugefügt, wie @Nic Scozzaro erwähnt:

MEDIA_ROOT = os.path.join (BASE_DIR, 'media')
STATIC_ROOT = os.path.join (BASE_DIR, 'static')

Starten Sie nach der Konfiguration die Dienste neu, um die Korrekturen anzuwenden.


Erstellen Sie ein ‚MEDIA‘-Verzeichnis im Stammverzeichnis Ihres Projekts. Legen Sie dann Folgendes fest:

MEDIA_ROOT = os.path.join(BASE_DIR,'MEDIA')

Um zu wissen, bei welchem ​​Benutzer Sie angemeldet sind:

$ whoami
ubuntu

Wenn Sie eine AWS-Instanz verwenden, sollten Sie Ihrer Lösung hinzufügen, dass Sie Ihren Benutzer der Gruppe hinzufügen, um auf diesen Ordner zugreifen zu können:

Erstellen einer Gruppe für Benutzer von Webservices (varwwwusers)

$ sudo groupadd varwwwusers

Ändern Sie den www-Ordner und machen Sie ihn zu varwwwusers gehören

$ sudo chgrp -R varwwwusers /var/www/

www-data ist der Server, der Django-Anfragen stellt, fügen Sie das der Gruppe hinzu

$ sudo adduser www-data varwwwusers

Ordnerrichtlinie ändern

$ sudo chmod -R 770 /var/www/

Ubuntu zur Gruppe der varwwwusers hinzufügen

$ usermod -a -G varwwwusers ubuntu

Hoffe, das hilft!


Ich habe das am Ende selbst gelöst.

Wenn ich auf den Entwicklungsmaschinen laufe, laufe ich tatsächlich mit den Privilegien meines aktuellen Benutzers. Wenn ich jedoch auf dem Bereitstellungsserver laufe, laufe ich tatsächlich durch wsgi , was bedeutet, dass es mit www-data ausgeführt wird Privilegien von .

www-data ist weder der Eigentümer noch gehört er zu der Gruppe von Benutzern, die /var/www besitzen . Das bedeutet, dass www-data wird als other behandelt und hat die Berechtigungen auf andere gesetzt.

Das SCHLECHTE Lösung dafür wäre zu tun:

sudo chmod -R 777 /var/www/

Dies würde jedem vollen Zugriff auf alles in /var/www/ geben , was eine sehr schlechte Idee ist.

Noch ein BAD Lösung wäre zu tun:

sudo chown -R www-data /var/www/

Dies würde den Eigentümer auf www-data ändern , wodurch Sicherheitslücken geöffnet werden.

Das GUTE Lösung wäre:

sudo groupadd varwwwusers
sudo adduser www-data varwwwusers
sudo chgrp -R varwwwusers /var/www/
sudo chmod -R 760 /var/www/

Dadurch wird www-data hinzugefügt zum varwwwusers Gruppe, die dann als Gruppe für /var/www/ festgelegt wird und alle seine Unterordner. chmod wird dem Eigentümer Lese-, Schreib- und Ausführungsberechtigungen erteilen, aber die Gruppe kann möglicherweise dort hochgeladene Skripte nicht ausführen, wenn beispielsweise der Webserver gehackt wurde.

Sie könnten ihn auf 740 setzen um es sicherer zu machen, aber dann können Sie Django's nicht verwenden collectstatic Funktionalität, halten Sie sich also an 760 es sei denn, Sie sind sehr zuversichtlich, was Sie tun.


Linux
  1. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  2. Wie kann ich allen Benutzern unter Linux Schreibzugriff auf einen Ordner gewähren?

  3. Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

  4. Wie verwalte ich /var/www?

  5. unix:///var/run/supervisor.sock keine solche Datei

Berechtigung für Composer in /usr/local/bin/ verweigert

Verwenden Sie ein Git-Repository auf /var/www/html/

Django static_root in /var/www/... - keine Berechtigungen für collectstatic

Ubuntu create-react-app schlägt mit verweigerter Berechtigung fehl

Schreibberechtigung über Filezilla sftp nach /var/www/html verweigert

Sollten Websites gemäß der empfohlenen Verwendung in /var/ oder /usr/ leben?