Ubuntu服务器Django+Apache2图片上传权限拒绝问题求助
解决Django上传图片报错Permission denied: '/photos'的问题
1. 优先检查Django的上传路径配置
错误提示的路径是根目录下的/photos,但你的实际照片目录在/var/www/html/api/photos,大概率是Django代码里的路径配置写错了:
- 打开
apiMain/settings.py,找到MEDIA_ROOT或自定义的上传目录配置,确保使用正确的绝对路径:import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 正确指向项目内的photos目录 MEDIA_ROOT = os.path.join(BASE_DIR, 'photos') MEDIA_URL = '/photos/' - 如果是视图/序列化器里硬编码了上传路径(比如
open('/photos/xxx.jpg', 'wb')),必须改成基于项目根目录的路径:upload_path = os.path.join(BASE_DIR, 'photos', filename) with open(upload_path, 'wb') as f: f.write(...)
2. 确保目录权限正确配置
重新执行以下命令,确保目录权限和所有者设置生效:
# 将目录所有者改为Apache运行用户www-data sudo chown -R www-data:www-data /var/www/html/api/photos # 设置目录权限为755(允许用户读写执行,组和其他读执行) sudo chmod -R 755 /var/www/html/api/photos
3. 完善Apache的mod_wsgi配置
你的WSGIDaemonProcess未明确指定运行用户,添加用户组配置确保进程以www-data身份运行:
修改/etc/apache2/apache2.conf中的对应行:
WSGIDaemonProcess x_api python-home=/var/www/html/api/venv python-path=/var/www/html/api user=www-data group=www-data
然后重启Apache:
sudo systemctl restart apache2
4. 排查SELinux(如果启用)
Ubuntu默认禁用SELinux,但如果你的系统手动开启了,需要给照片目录添加正确的上下文:
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/api/photos(/.*)?" sudo restorecon -Rv /var/www/html/api/photos
可通过sestatus命令查看SELinux是否启用。
内容的提问来源于stack exchange,提问作者RandomBeginner
相关产品推荐
相关产品推荐

