Ubuntu20.04部署Django时mod_wsgi提示Permission denied无法读取Python home
问题排查与解决步骤
核心错误已经在日志中明确标注:(13)Permission denied: mod_wsgi (pid=12089): Unable to stat Python home /root/django-apps/env。Apache默认运行用户为www-data,而/root目录默认权限为仅root用户可访问,Apache没有权限读取存放在/root下的项目与虚拟环境文件,后续的Python初始化失败、找不到encodings模块都是权限不足导致的衍生问题,可按照以下步骤解决:
1. 迁移项目与虚拟环境到非root目录
不要将Web服务相关文件存放在/root目录下,建议迁移到/opt/或者/var/www/目录下,执行命令如下:
# 先停止Apache服务 systemctl stop apache2 # 创建项目存放目录 mkdir -p /opt/django-apps # 移动项目和虚拟环境到新目录 mv /root/django-apps/* /opt/django-apps/
2. 调整目录权限
给项目和虚拟环境设置正确的权限,确保www-data用户拥有读取、执行权限:
# 递归设置目录所有者为www-data chown -R www-data:www-data /opt/django-apps # 批量设置目录权限为755,文件权限为644 find /opt/django-apps -type d -exec chmod 755 {} \; find /opt/django-apps -type f -exec chmod 644 {} \; # 若项目存在需要写入的目录(比如media、日志存储目录),单独设置775权限 chmod 775 /opt/django-apps/dmsemapping/media
3. 修改Apache配置文件
编辑/etc/apache2/sites-available/000-default.conf,将所有路径中的/root/django-apps替换为新的路径/opt/django-apps,修改后配置如下:
Alias /static /opt/django-apps/dmsemapping/staticfiles <Directory /opt/django-apps/dmsemapping/staticfiles> Require all granted </Directory> <Directory /opt/django-apps/dmsemapping/dmsemapping> <Files wsgi.py> Require all granted </Files> </Directory> WSGIDaemonProcess dmsemapping python-path=/opt/django-apps/dmsemapping python-home=/opt/django-apps/env WSGIProcessGroup dmsemapping WSGIScriptAlias / /opt/django-apps/dmsemapping/dmsemapping/wsgi.py
4. 校验配置并重启Apache
先校验Apache配置是否存在语法错误:
apache2ctl configtest
如果返回Syntax OK,执行重启命令生效配置:
systemctl restart apache2
可选排查项
如果修改后仍存在异常,可检查以下内容:
- 确认mod_wsgi的Python版本与虚拟环境的Python版本一致,Ubuntu 20.04默认Python版本为3.8,若虚拟环境为其他版本需要安装对应版本的mod_wsgi
- 确认Django配置文件settings.py中
ALLOWED_HOSTS已经添加了VPS公网IP或者站点域名 - 确认已经执行过
python manage.py collectstatic命令将静态文件收集到了staticfiles目录
内容的提问来源于stack exchange,提问作者Andrew Toole
相关产品推荐
相关产品推荐

