Ubuntu22.04+Apache2.4部署Django4后初始可访问随后失效求助
问题描述
群晖NAS虚拟机Ubuntu22.04环境下部署Django4项目,核心配置:
- Python3.10 + SQLite3数据库 + mod_wsgi模块 + Apache
- 硬件:Intel Celeron处理器,物理机10GB内存,虚拟机分配2核6GB(曾尝试4GB配置)
核心异常表现:
- 项目初始化后可正常访问任意页面
- 后续浏览器持续处于加载状态,无法跳转至应用内其他URL,仅重启Apache后可加载下一页
- 曾分两步完成Admin界面登录,验证数据库可正常访问
- Apache日志设为
trace1后发现:进程每5分钟被系统杀死并重启 - 已确认:环境变量加载正常,
www-data用户拥有数据库完全权限
排查方向与解决方案
1. 检查mod_wsgi进程配置与资源限制
- 查看Apache的mod_wsgi配置段,确认
WSGIDaemonProcess的关键参数,调整进程生命周期与并发设置:WSGIDaemonProcess django_project python-path=/path/to/your/project python-home=/path/to/venv processes=2 threads=15 maximum-requests=1000 WSGIProcessGroup django_project- 降低
maximum-requests值,避免进程因累积请求崩溃 - 确保
WSGIRestrictEmbedded On,防止嵌入式进程引发冲突
- 降低
2. 排查SQLite3锁阻塞问题
SQLite为文件型数据库,并发写入易触发锁等待导致请求阻塞:
- 调整Django数据库配置,限制连接生命周期:
# settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', 'CONN_MAX_AGE': 60, # 缩短连接存活时间,避免长期占锁 } } - 检查数据库文件锁状态:
若发现多进程持有锁,排查视图中是否存在未释放的数据库连接或长时间事务lsof /path/to/your/db.sqlite3
3. 分析进程被杀死的系统层面原因
- 检查系统日志,确认是否为OOM(内存不足)杀手导致进程被终止:
若存在OOM记录,优化内存占用:grep -i "oom" /var/log/syslog- 关闭Django调试模式(
DEBUG = False),避免调试内存泄漏 - 移除无用中间件,启用静态文件压缩
- 替换Django默认缓存为
memcached或redis,降低数据库压力
- 关闭Django调试模式(
4. 验证mod_wsgi与Python版本兼容性
- 确认mod_wsgi针对Python3.10编译:
输出需指向Python3.10路径,若版本不匹配,重新编译安装:mod_wsgi-express module-configpip install mod_wsgi mod_wsgi-express install-module
5. 追踪Django请求阻塞点
- 在项目中添加请求日志,定位长时间未完成的请求:
查看日志中耗时超过10秒的请求,定位阻塞的视图函数或数据库操作# settings.py 日志配置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'request_log': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': '/var/log/django_requests.log', }, }, 'loggers': { 'django.request': { 'handlers': ['request_log'], 'level': 'DEBUG', 'propagate': True, }, }, }
内容的提问来源于stack exchange,提问作者Schnurcks
相关产品推荐
相关产品推荐

