mod_wsgi加载失败主因是python、apache、vc++运行库的位数与版本三重不匹配;xampp官方版多为32位,需确保python和mod_wsgi轮子位数一致,并手动配置loadfile/loadmodule路径,避免使用mod_wsgi-express自动生成配置。

mod_wsgi 加载失败:90% 是架构/版本三重不匹配
直接报 Cannot load mod_wsgi.so 或 Apache 启动即退出,根本原因几乎总是 Python、Apache、VC++ 运行库的位数(x86/x64)和主版本号没对齐。XAMPP 自带的 Apache 是 32 位还是 64 位?你装的 Python 是哪个?mod_wsgi 轮子名里写的 cp310-cp310-win_amd64 就要求 Python 3.10 + 64 位系统 + 64 位 Apache —— 但 XAMPP 官方 Windows 版至今仍是 32 位为主(尤其老版本如 1.7.7、5.6)。查法:httpd.exe -V | findstr "ARCH" 看输出含 Win32 还是 Win64;python -c "import platform; print(platform.architecture())" 看 Python 位数。
- XAMPP 32 位 + Python 64 位 → 必炸,换 Python 32 位(如 Python 3.10 x86)
- Apache 2.4 +
mod_wsgi编译自 Apache 2.2 →Invalid argument错误日志,毫无提示 - VC++ 运行库缺失:装完 Python 后必须手动装对应版本的
Microsoft Visual C++ Redistributable(比如 VC14.0 对应 Python 3.6–3.9,VC17.0 对应 Python 3.11+)
别碰 mod_wsgi-express module-config 自动生成配置
这个命令在 XAMPP 下基本不可用:它默认写 LoadFile 和 LoadModule 路径带空格或反斜杠,Apache 解析会挂;更关键的是它硬编码路径到 Python 安装根目录(如 C:/Python310/python310.dll),而 XAMPP 的 Apache 不认这种绝对路径加载方式,常导致启动失败。你应该手动写:
LoadFile "C:/Python310/python310.dll" LoadModule wsgi_module "C:/Python310/Lib/site-packages/mod_wsgi/server/mod_wsgi.cp310-win_amd64.pyd" WSGIPythonHome "C:/Python310" WSGIPythonPath "D:/myproject"
-
LoadFile行不能省,否则 DLL 初始化失败 -
mod_wsgi的 .pyd 文件名必须和你 pip install 的 wheel 名完全一致(看后缀cp310、win_amd64) -
WSGIPythonPath指向 Django 项目根目录(含manage.py),不是settings.py所在目录
Django 静态文件 404:Alias 和 STATIC_URL 必须严格对齐
哪怕 mod_wsgi 跑起来了,/static/xxx.css 404 也是高频问题。XAMPP 的 Apache 默认不代理静态路径,Django 开发模式下的 runserver 静态服务逻辑在生产中失效。你必须显式用 Alias 告诉 Apache:“这个 URL 前缀,直接去磁盘读文件”。假设你在 settings.py 中设了:
STATIC_URL = '/assets/' STATIC_ROOT = 'D:/myproject/staticfiles/'
那么 httpd-vhosts.conf 里就得配:
Alias /assets/ "D:/myproject/staticfiles/"
<directory>
Require all granted
</directory>
-
Alias路径末尾的/不能漏,否则匹配失败 -
STATIC_ROOT必须先用python manage.py collectstatic生成,不能是空目录 - 如果用
STATIC_URL = '/static/',Alias就得写/static/,大小写、斜杠全要一致
比 mod_wsgi 更稳的路:用 Apache 反向代理到 Django 自带服务器
如果你只是本地开发或小流量验证,硬啃 mod_wsgi 架构匹配太耗时。改用 mod_proxy + mod_proxy_http,让 Apache 当个透明转发层,Django 用 gunicorn 或原生 runserver --noreload 跑在后台端口(如 8001),Apache 只负责把 localhost/ 请求转过去。启用模块只需两行:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
再加虚拟主机:
<virtualhost>
ServerName localhost
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8001/
ProxyPassReverse / http://127.0.0.1:8001/
</virtualhost>
- 完全避开
mod_wsgi的编译/匹配/VC 运行库问题 - Django 日志、调试、热重载照常工作(只要不用
--reload) - 真实生产环境仍需
mod_wsgi或gunicorn+nginx,但本地验证足够快
真正卡住人的从来不是配置项怎么写,而是错误日志里只写 Invalid argument 却不告诉你哪一环错了——Python 架构、Apache 版本、VC 运行库,三个变量任意一个错,整个链就断,且无明确报错指向。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











