Apache http.conf配置多Django应用出现Assertion Error问题求助
我之前也碰到过一模一样的情况!单独跑每个Django应用都正常,一同时配置就炸Assertion Error,核心原因基本都是两个应用共享了WSGI进程空间,导致Django的全局状态(比如settings模块、数据库连接配置)互相干扰,或者是配置里的路径/别名冲突。下面是亲测有效的解决方法:
1. 给每个应用分配独立的WSGI守护进程
Apache的mod_wsgi默认会把多个WSGI应用塞进同一个进程,这会让Django的全局变量乱套。我们要给每个应用单独开一个守护进程,彻底隔离它们的运行环境:
情况1:用不同端口/域名分开两个应用
修改你的http.conf,给每个VirtualHost加上WSGIDaemonProcess和WSGIProcessGroup:
# 第一个应用(YYY)的配置 <VirtualHost 200.1.2.11:8080> ServerName app-yyy.example.com # 或者直接用端口区分 # 定义独立守护进程,指定应用的Python路径 WSGIDaemonProcess app-yyy python-path=E:/Applications/var/www/YYY WSGIProcessGroup app-yyy WSGIScriptAlias / "E:/Applications/var/www/YYY/YYY/wsgi.py" Alias /static/ "E:/Applications/var/www/YYY/static/" # 目录权限配置,确保Apache能访问wsgi.py和静态文件 <Directory "E:/Applications/var/www/YYY/YYY"> <Files wsgi.py> Require all granted </Files> </Directory> <Directory "E:/Applications/var/www/YYY/static"> Require all granted </Directory> </VirtualHost> # 第二个应用(XXX)的配置 <VirtualHost 200.1.2.11:8081> ServerName app-xxx.example.com WSGIDaemonProcess app-xxx python-path=E:/Applications/var/www/XXX WSGIProcessGroup app-xxx WSGIScriptAlias / "E:/Applications/var/www/XXX/XXX/wsgi.py" Alias /static/ "E:/Applications/var/www/XXX/static/" <Directory "E:/Applications/var/www/XXX/XXX"> <Files wsgi.py> Require all granted </Files> </Directory> <Directory "E:/Applications/var/www/XXX/static"> Require all granted </Directory> </VirtualHost>
情况2:在同一个端口下用路径前缀区分(比如/app1和/app2)
如果不想用不同端口,就给每个应用的WSGI别名和静态文件加上路径前缀:
<VirtualHost 200.1.2.11:8080> ServerName 200.1.2.11:8080 # 第一个应用(YYY) WSGIDaemonProcess app-yyy python-path=E:/Applications/var/www/YYY WSGIProcessGroup app-yyy WSGIScriptAlias /yyy "E:/Applications/var/www/YYY/YYY/wsgi.py" Alias /yyy/static/ "E:/Applications/var/www/YYY/static/" # 第二个应用(XXX) WSGIDaemonProcess app-xxx python-path=E:/Applications/var/www/XXX WSGIProcessGroup app-xxx WSGIScriptAlias /xxx "E:/Applications/var/www/XXX/XXX/wsgi.py" Alias /xxx/static/ "E:/Applications/var/www/XXX/static/" # 权限配置 <Directory "E:/Applications/var/www/YYY/YYY"> <Files wsgi.py> Require all granted </Files> </Directory> <Directory "E:/Applications/var/www/YYY/static"> Require all granted </Directory> <Directory "E:/Applications/var/www/XXX/XXX"> <Files wsgi.py> Require all granted </Files> </Directory> <Directory "E:/Applications/var/www/XXX/static"> Require all granted </Directory> </VirtualHost>
2. 检查每个应用的WSGI文件配置
确保每个应用的wsgi.py没有硬编码错误,并且正确设置了DJANGO_SETTINGS_MODULE,比如YYY的wsgi.py:
import os import sys # 把应用根目录加入Python路径,避免导入错误 sys.path.append('E:/Applications/var/www/YYY') # 明确指定当前应用的settings模块 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'YYY.settings') from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
XXX的wsgi.py同理,别把settings模块名搞混了。
3. 删掉不必要的模板别名配置
注意到你配置了Alias /templates/,其实Django的模板文件不需要通过Apache直接暴露,这既不安全也容易引发冲突——直接删掉这个Alias就行,模板由Django内部加载处理。
4. 重启Apache并排查日志
修改完配置后,一定要完全重启Apache(不是重新加载配置),然后去看Apache的错误日志(一般在logs/error.log)。如果还有Assertion Error,日志里的堆栈信息会告诉你具体是哪一行代码触发的,比如是数据库时区配置冲突,还是第三方库的全局状态问题,能帮你精准定位。
内容的提问来源于stack exchange,提问作者Girard clément

