Apache部署两个Django虚拟环境无法同时运行问题
问题根因
单Apache进程加载的mod_wsgi仅能绑定一个Python解释器环境,WSGIPythonHome是全局生效配置,不支持在单实例下为不同虚拟主机单独指定,因此当前单Apache实例的配置方式无法同时运行两个分属不同虚拟环境的Django项目。另外Windows平台的mod_wsgi不支持Linux下常用的守护进程模式(WSGIDaemonProcess),无法在单Apache实例内实现Python环境隔离。
额外提一句:你现有配置里ServerName和ServerAlias字段不需要加http://前缀,直接填写IP或域名即可。
可行方案
方案1:统一依赖环境,单实例运行(仅适合无依赖冲突场景)
如果两个项目可以统一Django版本(比如都适配Django 3.2.11,或都适配Django 2.1.15),且其他第三方依赖版本不存在冲突,可以将所有依赖安装到同一个Python虚拟环境中:
- 仅保留一个
WSGIPythonHome配置,指向这个统一的虚拟环境路径 - 删除两个项目
wsgi_windows.py里的site.addsitedir配置,避免路径冲突 - 重启Apache即可同时运行两个项目。
由于Django 2和Django 3无法在同一个Python环境中共存,如果你没法统一两个项目的Django版本,直接跳过这个方案。
方案2:部署两个独立Apache实例(生产环境首选,最稳定)
这是Windows平台下运行多套独立Python环境Web项目的标准方案,两个项目完全隔离,不存在依赖冲突,一个项目故障不会影响另一个:
- 复制现有Apache安装目录为第二份,例如原目录为
C:/Apache24,复制为C:/Apache24_proj2 - 修改第一份Apache(跑项目1)的
httpd.conf:- 仅保留
Listen *:1111配置,删除Listen *:2222 - 保留原有项目1的
mod_wsgi加载、WSGIPythonHome、虚拟主机配置不变
- 仅保留
- 修改第二份Apache(跑项目2)的
httpd.conf:- 把监听端口改为
Listen *:2222 - 调整
ServerRoot、日志存放路径、DocumentRoot等配置,指向第二份Apache自身的目录,避免和第一份Apache的运行文件、日志冲突 - 配置
mod_wsgi加载路径、WSGIPythonHome指向项目2的虚拟环境d:/django_project2/env2/,引入你之前写的项目2对应的虚拟主机配置
- 把监听端口改为
- 将两个Apache分别注册为Windows服务,实现开机自启:
进入第一份Apache的bin目录执行:
进入第二份Apache的httpd.exe -k install -n "Apache_Project1"bin目录执行:httpd.exe -k install -n "Apache_Project2" - 分别启动两个服务,两个项目即可正常访问。
方案3:反向代理转发(适合不想多部署Apache实例的场景)
保留现有运行项目1的Apache实例不变,项目2用纯Python WSGI服务器启动,通过Apache反向代理转发请求:
- 在项目2的虚拟环境中安装waitress(轻量生产级WSGI服务器,适合Windows部署):
执行启动命令让项目2监听本地回环地址的闲置端口(比如8000):pip install waitress
可以将该启动命令注册为Windows服务实现开机自启。waitress-serve --listen=127.0.0.1:8000 web_project.wsgi:application - 修改原有Apache配置,启用代理模块:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so - 将原2222端口的虚拟主机配置改为反向代理规则,静态文件仍交给Apache处理,动态请求转发给本地waitress服务:
<VirtualHost *:2222> ServerName 10.198.170.91 ProxyPass /static ! ProxyPass / http://127.0.0.1:8000/ ProxyPassReverse / http://127.0.0.1:8000/ Alias /static D:/django_project2/web_project/apps/static <Directory D:/django_project2/web_project/apps/static> AllowOverride None Options None Require all granted </Directory> ErrorLog "logs/django_project2-error.log" CustomLog "logs/django_project2-access.log" common </VirtualHost> - 重启Apache即可同时访问两个项目。
避坑提醒
不要尝试在单Apache实例下加载两个不同路径的mod_wsgi模块,会触发内存冲突直接导致Apache崩溃,无法启动。
内容的提问来源于stack exchange,提问作者spongebob
相关产品推荐
相关产品推荐

