树莓派上Apache部署Django应用出现内部服务器错误,提示找不到django模块
看起来核心问题很明确——Apache的WSGI进程没正确加载你虚拟环境里的Django,所以才会抛出ModuleNotFoundError: No module named 'django'。我来给你一步步排查和解决:
第一步:确认虚拟环境和Django安装状态
先别急着改配置,先确认你的虚拟环境里真的装了Django,路径也没问题:
- 激活你的虚拟环境:
source /home/pi/greenhouse/greenhouseenv/bin/activate
- 查看已安装的包,确认Django存在:
pip list | grep Django
如果没看到Django,就重新安装:
pip install django
另外,检查虚拟环境的根目录是否正确——你的WSGIDaemonProcess里写的python-home=/home/pi/greenhouse/greenhouseenv,这个路径下应该有bin、lib这些子目录,比如/home/pi/greenhouse/greenhouseenv/bin/python必须存在,不然路径就错了。
第二步:修正Apache配置的权限问题
Apache默认用www-data用户运行,很可能它没有访问你虚拟环境和项目文件的权限,导致无法读取Django模块:
- 给虚拟环境目录设置正确的权限:
sudo chown -R www-data:www-data /home/pi/greenhouse/greenhouseenv sudo chmod -R 755 /home/pi/greenhouse/greenhouseenv
- 确保项目文件和wsgi.py也能被www-data读取:
sudo chmod -R 755 /home/pi/greenhouse sudo chmod 644 /home/pi/greenhouse/greenhouse/wsgi.py
第三步:检查mod_wsgi和Python版本是否匹配
树莓派上可能默认安装的是Python2版本的mod_wsgi,但你的虚拟环境用的是Python3,这就会导致版本不匹配,找不到Python3虚拟环境里的包:
- 先检查当前mod_wsgi对应的Python版本:
mod_wsgi-express module-config
看输出里的Python路径,如果是指向Python2的,就卸载旧的mod_wsgi,安装Python3版本的:
sudo apt-get remove libapache2-mod-wsgi sudo apt-get install libapache2-mod-wsgi-py3
- 启用wsgi模块(如果没启用的话):
sudo a2enmod wsgi
第四步:验证Apache配置并重启
确认你的000-default.conf里的WSGIDaemonProcess配置没问题:
WSGIDaemonProcess greenhouse python-path=/home/pi/greenhouse python-home=/home/pi/greenhouse/greenhouseenv WSGIProcessGroup greenhouse WSGIScriptAlias / /home/pi/greenhouse/greenhouse/wsgi.py
这里的python-path是你的Django项目根目录(包含manage.py的那个目录),python-home是虚拟环境根目录,路径都没问题的话,重启Apache生效:
sudo systemctl restart apache2
额外的调试技巧
如果还是不行,可以临时修改wsgi.py,手动添加虚拟环境的site-packages路径,强制让Python找到Django:
""" WSGI config for greenhouse project. It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ """ import os import sys # 替换成你虚拟环境的site-packages路径,比如python3.9/site-packages sys.path.append('/home/pi/greenhouse/greenhouseenv/lib/python3.9/site-packages') from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'greenhouse.settings') application = get_wsgi_application()
修改后重启Apache,再看日志是否还有错误。
备注:内容来源于stack exchange,提问作者907VigiL

