Apache部署Django项目访问/admin时服务器崩溃问题
Django Admin在Apache mod_wsgi Daemon模式下崩溃超时问题排查与解决
问题描述
本地Ubuntu服务器上部署Apache2,通过django-admin startproject site创建Django项目,配置虚拟主机使用WSGI Daemon进程运行。站点可通过IP192.168.1.3正常访问,但访问/admin模块时:
- 能正常登录并加载初始后台页面
- 点击后台内的链接或刷新页面,会触发长达5分钟的加载,最终返回500错误
- 故障发生后,非/admin的首页也无法访问,需执行
systemctl restart apache2重启Apache,或等待10-15分钟才能恢复服务 - 恢复后再次访问/admin,故障会重复出现
Apache错误日志显示WSGI daemon超时、响应头异常。
环境信息
- Django 4.1.5
- mod-wsgi 4.9.4
- Ubuntu服务器 + Apache2
- 部署模式:Apache虚拟主机配置WSGI Daemon进程
已排查操作
- 使用
python manage.py runserver或python manage.py runmodwsgi直接运行项目时,192.168.1.3:8000上的/admin模块完全正常,无超时或崩溃问题 - 删除并重建Django项目,重新配置Apache虚拟主机.conf文件,故障依旧
- 已排除Django 3.0版本存在的历史/admin加载问题
解决方案建议
1. 调整WSGI Daemon进程配置
检查Apache虚拟主机中的WSGIDaemonProcess配置,优化进程超时与回收参数,避免进程卡死:
WSGIDaemonProcess site \ processes=2 threads=15 \ timeout=60 \ max-requests=500 \ request-timeout=30 WSGIProcessGroup site
timeout:设置Daemon进程的超时时间,避免等待超时的进程无法被及时回收max-requests:设置进程处理指定请求数后自动重启,避免内存泄漏累积request-timeout:单个请求的超时阈值,快速终止阻塞的请求
2. 验证静态文件配置
Admin模块的静态文件加载异常可能导致请求阻塞:
- 执行
python manage.py collectstatic收集Admin静态文件到项目指定目录 - 在Apache虚拟主机配置中确保静态文件Alias与权限设置正确:
Alias /static/ /path/to/your/site/static/ <Directory /path/to/your/site/static/> Require all granted </Directory>
- 替换
/path/to/your/site/static/为实际的静态文件目录路径
3. 排查数据库锁或连接问题
若使用SQLite作为数据库,Daemon多进程模式下可能触发文件锁阻塞:
- 在Django项目的
settings.py中调整SQLite连接参数,增加超时设置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', 'OPTIONS': { 'timeout': 30, # 设置数据库连接超时时间(秒) }, } }
- 测试切换到MySQL/PostgreSQL等客户端-服务端型数据库,验证是否为SQLite锁导致的问题
4. 开启Django详细日志排查
通过Django日志捕获/admin请求时的具体异常:
- 在
settings.py中添加日志配置:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': '/var/log/django/debug.log', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'DEBUG', 'propagate': True, }, 'django.request': { 'handlers': ['file'], 'level': 'ERROR', 'propagate': False, }, }, }
- 创建日志目录并设置权限:
sudo mkdir -p /var/log/django sudo chown www-data:www-data /var/log/django
- 触发/admin故障后,查看
/var/log/django/debug.log,定位具体的异常栈信息
5. 检查mod_wsgi与Python版本兼容性
确认mod_wsgi编译使用的Python版本与Django虚拟环境的Python版本完全一致:
- 查看mod_wsgi编译的Python版本:
mod_wsgi-express module-config
- 对比虚拟环境的Python版本:
source /path/to/your/venv/bin/activate python --version
若版本不一致,需重新编译mod_wsgi匹配虚拟环境的Python版本,或调整Apache使用对应版本的mod_wsgi模块
内容的提问来源于stack exchange,提问作者Adam Isaacs
相关产品推荐
相关产品推荐

