Ubuntu Server上Django5+mod_wsgi部署遇ModuleNotFoundError求助
Ubuntu Server下Django+mod_wsgi部署的ModuleNotFoundError解决方法
问题根源
你的Apache配置中同时加载了针对Python3.8和Python3.12编译的两个mod_wsgi模块,而Apache进程只能加载一个mod_wsgi实例——后加载的模块会被前一个覆盖,导致新项目的mod_wsgi配置失效,实际使用的是现有项目绑定的Python3.8环境。这一点从WSGI日志可以明确验证:虽然指定了新项目虚拟环境的Python路径,但实际运行的是系统默认的Python3.8,且sys.path中完全没有包含虚拟环境的site-packages目录,自然找不到仅安装在Python3.12虚拟环境里的Django。
解决步骤
1. 清理冲突的mod_wsgi加载指令
删除两个项目Apache配置文件中的LoadModule wsgi_module ...行——同一个Apache实例无法同时兼容两个不同Python版本的mod_wsgi模块。
2. 创建独立Apache实例(推荐生产环境)
Ubuntu下可以通过多实例配置实现不同Python版本的隔离:
- 复制默认Apache配置文件,为每个Python版本创建独立配置:
sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2-py38.conf sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2-py312.conf - 编辑
apache2-py38.conf,添加Python3.8对应的mod_wsgi加载指令:LoadModule wsgi_module "/var/www/existing-project/venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi.cpython-38-x86_64-linux-gnu.so" - 编辑
apache2-py312.conf,添加Python3.12对应的mod_wsgi加载指令:LoadModule wsgi_module "/var/www/new-project/venv/lib/python3.12/site-packages/mod_wsgi/server/mod_wsgi-py312.cpython-312-x86_64-linux-gnu.so" - 创建独立的站点配置目录:
sudo mkdir -p /etc/apache2/sites-available-py38 /etc/apache2/sites-enabled-py38 sudo mkdir -p /etc/apache2/sites-available-py312 /etc/apache2/sites-enabled-py312 - 迁移并启用对应项目的虚拟主机配置:
# 处理现有项目(Python3.8) sudo mv /etc/apache2/sites-available/existing-project.conf /etc/apache2/sites-available-py38/ sudo ln -s /etc/apache2/sites-available-py38/existing-project.conf /etc/apache2/sites-enabled-py38/ # 处理新项目(Python3.12) sudo mv /etc/apache2/sites-available/new-project.conf /etc/apache2/sites-available-py312/ sudo ln -s /etc/apache2/sites-available-py312/new-project.conf /etc/apache2/sites-enabled-py312/ - 修改虚拟主机端口避免冲突:比如将新项目的
<VirtualHost *:80>改为<VirtualHost *:8080>,或为两个实例分配不同IP。 - 启动/重启对应实例:
# 启动Python3.8实例 sudo apache2ctl -f /etc/apache2/apache2-py38.conf restart # 启动Python3.12实例 sudo apache2ctl -f /etc/apache2/apache2-py312.conf restart
3. 验证新项目的WSGI配置
确保新项目的WSGIDaemonProcess配置正确指向虚拟环境:
WSGIDaemonProcess new-project python-home=/var/www/new-project/venv python-path=/var/www/new-project/project WSGIProcessGroup new-project WSGIScriptAlias / /var/www/new-project/project/project/wsgi.py
4. 临时测试方案(mod_wsgi-express)
如果需要快速验证项目本身是否正常,可以用mod_wsgi-express直接启动:
cd /var/www/new-project/project source venv/bin/activate mod_wsgi-express start-server project/wsgi.py --port 8080
访问http://new-project.com:8080即可确认Django是否能正常加载。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

