You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache http.conf配置多Django应用出现Assertion Error问题求助

解决Apache同时运行两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:17:41