请帮助。我正在尝试遵循以下教程https://wsvincent.com/django-image-uploads/ 尝试在该部分中发布djangopony.png图像后,我立即收到权限拒绝错误。我正在使用Ubuntu 19和Django 2.1.5。
我的虚拟环境和项目位于目录中 / home / sgoodman / insta
├── db.sqlite3
├── insta_project
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── media
│ └── images
├── Pipfile
├── Pipfile.lock
└── posts
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│ ├── 0001_initial.py
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
权限:
drwxrwxrwx 5 sgoodman sgoodman 4096 Apr 30 13:53 ./
drwxr-xr-x 9 sgoodman sgoodman 4096 Apr 30 13:50 ../
-rw-r--r-- 1 sgoodman sgoodman 135168 Apr 30 13:53 db.sqlite3
drwxrwxr-x 2 sgoodman sgoodman 4096 Apr 30 13:50 insta_project/
-rwxrwxr-x 1 sgoodman sgoodman 545 Apr 30 12:57 manage.py*
drwxrwxrwx 3 sgoodman sgoodman 4096 Apr 30 13:46 media/
-rw-rw-r-- 1 sgoodman sgoodman 176 Apr 30 12:56 Pipfile
-rw-r--r-- 1 sgoodman sgoodman 3914 Apr 30 12:56 Pipfile.lock
drwxrwxr-x 3 sgoodman sgoodman 4096 Apr 30 13:46 posts/
settings.py中的MEDIA_ROOT和MEDIA_URL设置:
STATIC_URL = '/static/'
MEDIA_ROOT = '/media/'
MEDIA_URL = os.path.join(BASE_DIR, '/media/')
谢谢。
答案 0 :(得分:0)
最后我自己解决了这个问题。
在开发计算机上运行时,实际上我正在使用当前用户的特权运行。但是,在部署服务器上运行时,实际上我正在运行wsgi
,这意味着它正在使用www-data
的特权运行。
www-data
既不是所有者,也不在拥有/var/www
的用户组中。这意味着www-data
被视为other
并已将权限设置为其他权限。
对此的不良解决方案是:
sudo chmod -R 777 /var/www/
这将使所有人都可以完全访问/var/www/
,which is a very bad idea中的所有内容。
另一种不良解决方案是:
sudo chown -R www-data /var/www/
这会将所有者更改为www-data
,which opens security vulnerabilities。
良好的解决方案是:
sudo groupadd varwwwusers
sudo adduser www-data varwwwusers
sudo chgrp -R varwwwusers /var/www/
sudo chmod -R 760 /var/www/
这会将www-data
添加到varwwwusers
组,然后将其设置为/var/www/
及其所有子文件夹的组。 chmod
将向所有者授予读取,写入和执行权限,但是,例如,如果Web服务器被黑客入侵,则该组将无法执行可能在其中上载的任何脚本。
您可以将其设置为740
,以使其更安全,但是您将无法使用Django's
collectstatic
功能,因此请坚持使用760
,除非您对您的工作非常有信心。