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

部署在Fly.io的Django应用会话间歇性丢失问题求助

解决Fly.io上Django会话丢失问题

核心原因分析

你的问题大概率是多实例环境下SQLite无法共享会话数据导致的:

  • Fly.io默认可能运行多个应用实例,每个实例有独立的SQLite文件副本
  • 会话数据存在某个实例的SQLite中,当请求路由到其他实例时,就找不到会话,表现为会话丢失
  • 即使回滚旧代码,Fly.io的部署环境(比如实例数)可能和去年不同,所以问题重现

快速修复方案(优先推荐)

1. 临时切换为单实例运行

如果活动规模不大,先把实例数改成1个,快速解决问题:

fly scale count 1

部署后测试会话是否正常,若正常则说明是多实例共享问题。

2. 更换会话存储为Redis(适合多实例场景)

SQLite不适合多实例共享,改用Redis存储会话是更可靠的方案:

步骤1:创建Fly.io Redis实例

fly redis create

创建完成后,复制Redis的连接URL(类似redis://default:xxx@your-redis-name.upstash.io:34567)。

步骤2:配置Django

  • 在requirements.txt中添加依赖:
    django-redis==5.2.0
    
  • 在settings.py中添加缓存和会话配置:
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "你的Redis连接URL",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
    }
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    

步骤3:重新部署

fly deploy

3. 检查并修正Cookie配置

确保HTTPS环境下Cookie能被正确保存:
在settings.py中添加/修改:

SESSION_COOKIE_SECURE = True  # 强制HTTPS下传递Cookie
SESSION_COOKIE_SAMESITE = 'Lax'  # 适配现代浏览器的Cookie策略
SESSION_COOKIE_DOMAIN = '你的Fly.io应用域名'  # 比如your-app.fly.dev
SESSION_COOKIE_AGE = 3600  # 会话有效期,可根据活动需求调整

4. (临时方案)用共享Volume挂载SQLite

如果必须保留SQLite,可将数据库文件挂载到Fly.io共享Volume,让所有实例访问同一个文件:

步骤1:创建Volume

fly volumes create ntd_data --size 1

步骤2:修改fly.toml添加挂载

[mounts]
source="ntd_data"
destination="/app/data"

步骤3:修改Django数据库路径

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'data' / 'db.sqlite3',
    }
}

⚠️ 注意:SQLite在多实例并发场景下可能出现锁等待或数据损坏,仅适合小型活动临时使用。

验证方法

部署后,用日志中间件继续监控request.session.session_key,确认多次请求后session_key保持一致,不再变为None。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:22:45