部署Django网站遇权限拒绝错误,求解决方案
解决Django部署到Apache时的权限与虚拟环境初始化错误
从错误日志和目录权限信息来看,核心问题是Apache运行用户(www-data)没有权限访问你的用户主目录/home/m_user,导致mod_wsgi无法读取虚拟环境文件,进而触发Python编码模块加载失败的错误。以下是具体解决步骤:
1. 调整用户主目录的访问权限
你的/home/m_user目录权限为drwxr-x---,仅允许m_user用户及同组用户访问,www-data用户无法遍历进入该目录。执行以下命令开放目录的执行权限给其他用户:
chmod o+x /home/m_user
执行后目录权限会变为drwxr-x--x,允许www-data用户进入后续的django_site和venv路径。
2. 修复虚拟环境目录的权限
确保虚拟环境及其子文件对www-data有读取权限:
sudo chmod -R 755 /home/m_user/django_site/venv sudo chown -R m_user:www-data /home/m_user/django_site/venv
这会递归设置虚拟环境的权限,让www-data能够读取其中的Python模块文件。
3. 修正mod_wsgi模块的加载配置
你当前将LoadModule指令放在了<VirtualHost>块内部,这是错误的;同时路径中的pythonX.X和pyXY是占位符,需要替换为实际的Python版本:
- 先查找虚拟环境中mod_wsgi的实际路径:
find /home/m_user/django_site/venv -name "mod_wsgi-py*.so"
示例输出:/home/m_user/django_site/venv/lib/python3.10/site-packages/mod_wsgi/server/mod_wsgi-py310.so
- 将
LoadModule指令移至Apache全局配置文件(如/etc/apache2/apache2.conf)或mods-available目录下的配置文件中,而非VirtualHost内部:
LoadModule wsgi_module "/home/m_user/django_site/venv/lib/python3.10/site-packages/mod_wsgi/server/mod_wsgi-py310.so"
- 删除VirtualHost块中的
LoadModule行,然后重启Apache:
sudo systemctl restart apache2
4. 验证WSGI守护进程配置
确认WSGIDaemonProcess中的路径无误:
WSGIDaemonProcess django_app python-path=/home/m_user/django_site python-home=/home/m_user/django_site/venv
确保python-home指向的虚拟环境目录真实存在,且路径拼写正确。
5. 检查SELinux(若服务器启用)
如果服务器开启了SELinux,可能会阻止Apache访问用户主目录下的文件:
- 临时关闭SELinux测试:
sudo setenforce 0
- 若问题解决,添加SELinux规则允许Apache访问该目录:
sudo semanage fcontext -a -t httpd_sys_content_t "/home/m_user/django_site(/.*)?" sudo restorecon -Rv /home/m_user/django_site
内容的提问来源于stack exchange,提问作者mdev
相关产品推荐
相关产品推荐

