Windows Server下Apache 2.4 mod_wsgi多Django项目部署故障排查
多Django项目Apache mod_wsgi部署问题排查
问题描述
在Windows Server环境使用Apache 2.4 + mod_wsgi部署三个Django项目时,前两个项目(端口8001、8002)正常运行,第三个项目(端口8003的HealthCenter)触发500内部服务器错误。单独运行第三个项目无异常,同时部署时失败。
相关配置
httpd.conf 核心配置
ServerName 172.31.4.38 Listen 8001 Listen 8002 Listen 8003 LoadFile "C:/Users/Administrator/AppData/Local/Programs/Python/Python311/python311.dll" LoadModule wsgi_module "C:/Users/Administrator/AppData/Local/Programs/Python/Python311/Lib/site-packages/mod_wsgi/server/mod_wsgi.cp311-win_amd64.pyd" WSGIPythonHome "C:/Users/Administrator/AppData/Local/Programs/Python/Python311" WSGIPythonPath "D:/adhocvenv/Lib/site-packages"
虚拟主机配置
<VirtualHost *:8001> ServerName 172.31.4.38 WSGIScriptAlias / "D:\adhocvenv\adhocpayroll\adhocpayroll\wsgi.py" application-group=site1 <Directory "D:\adhocvenv\adhocpayroll"> Require all granted </Directory> </VirtualHost> <VirtualHost *:8002> ServerName 172.31.4.38 #DocumentRoot "D:/StoreManagementSystem" WSGIScriptAlias / "D:/StoreManagementSystem/StoreManagementSystem/wsgi.py" application-group=site2 <Directory "D:/StoreManagementSystem"> Require all granted </Directory> </VirtualHost> <VirtualHost *:8003> ServerName 172.31.4.38 DocumentRoot "D:/HealthCenter" WSGIScriptAlias / "D:/HealthCenter/HealthCenter/wsgi.py" application-group=site3 <Directory "D:/HealthCenter"> Require all granted </Directory> </VirtualHost>
错误日志关键信息
[Thu Nov 23 17:09:13.786184 2023] [wsgi:error] [pid 38164:tid 2216] [client 172.31.4.38:57355] ModuleNotFoundError: No module named 'StoreManagementSystem'
问题根源
- Python路径未隔离:全局配置的
WSGIPythonPath仅包含D:/adhocvenv/Lib/site-packages,三个项目共享同一Python解释器进程。前两个项目启动后会修改Python路径添加自身根目录,第三个项目启动时,解释器残留了前一个项目的路径信息,导致Django误加载其他项目的配置模块。 - 项目根目录未显式加入Python路径:第三个项目的wsgi.py未主动将自身项目根目录添加到Python搜索路径,无法让Django正确定位自身配置文件。
解决方案
方案1:给每个虚拟主机单独配置Python路径
修改虚拟主机配置,为每个项目添加包含自身根目录和虚拟环境依赖的独立WSGIPythonPath:
<VirtualHost *:8001> ServerName 172.31.4.38 WSGIPythonPath "D:/adhocvenv/adhocpayroll;D:/adhocvenv/Lib/site-packages" WSGIScriptAlias / "D:\adhocvenv\adhocpayroll\adhocpayroll\wsgi.py" application-group=site1 <Directory "D:\adhocvenv\adhocpayroll"> Require all granted </Directory> </VirtualHost> <VirtualHost *:8002> ServerName 172.31.4.38 WSGIPythonPath "D:/StoreManagementSystem;D:/adhocvenv/Lib/site-packages" WSGIScriptAlias / "D:/StoreManagementSystem/StoreManagementSystem/wsgi.py" application-group=site2 <Directory "D:/StoreManagementSystem"> Require all granted </Directory> </VirtualHost> <VirtualHost *:8003> ServerName 172.31.4.38 WSGIPythonPath "D:/HealthCenter;D:/adhocvenv/Lib/site-packages" DocumentRoot "D:/HealthCenter" WSGIScriptAlias / "D:/HealthCenter/HealthCenter/wsgi.py" application-group=site3 <Directory "D:/HealthCenter"> Require all granted </Directory> </VirtualHost>
方案2:修改wsgi.py添加项目路径
在每个项目的wsgi.py开头添加代码,强制将项目根目录加入Python搜索路径:
import os import sys # 添加项目根目录到Python搜索路径 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'HealthCenter.settings') from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
方案3:启用独立进程组(彻底隔离环境)
如果路径冲突问题仍存在,可为每个项目配置独立的守护进程组,彻底隔离Python运行环境:
<VirtualHost *:8003> ServerName 172.31.4.38 WSGIDaemonProcess site3 python-home="C:/Users/Administrator/AppData/Local/Programs/Python/Python311" python-path="D:/HealthCenter;D:/adhocvenv/Lib/site-packages" WSGIProcessGroup site3 WSGIScriptAlias / "D:/HealthCenter/HealthCenter/wsgi.py" <Directory "D:/HealthCenter"> Require all granted </Directory> </VirtualHost>
验证步骤
- 重启Apache服务
- 访问
http://172.31.4.38:8003确认项目正常加载 - 检查Apache错误日志,确认无
ModuleNotFoundError类报错
内容的提问来源于stack exchange,提问作者krishna prasad
相关产品推荐
相关产品推荐

