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

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(内存不足)杀手导致进程被终止:
    grep -i "oom" /var/log/syslog
    
    若存在OOM记录,优化内存占用:
    • 关闭Django调试模式(DEBUG = False),避免调试内存泄漏
    • 移除无用中间件,启用静态文件压缩
    • 替换Django默认缓存为memcached或redis,降低数据库压力

4. 验证mod_wsgi与Python版本兼容性

  • 确认mod_wsgi针对Python3.10编译:
    mod_wsgi-express module-config
    
    输出需指向Python3.10路径,若版本不匹配,重新编译安装:
    pip install mod_wsgi
    mod_wsgi-express install-module
    

5. 追踪Django请求阻塞点

  • 在项目中添加请求日志,定位长时间未完成的请求:
    # 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,
            },
        },
    }
    
    查看日志中耗时超过10秒的请求,定位阻塞的视图函数或数据库操作

内容的提问来源于stack exchange,提问作者Schnurcks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:01:19