SECRET_KEY 迟早要换(泄漏、人员变动、定期轮换)。直接换会让所有人退出登录,多台实例滚动发布时还会出现「刚登录又掉线」。这篇用真实的服务验证 Flask 的 SECRET_KEY_FALLBACKS、滚动发布的正确顺序,以及它覆盖不到的地方(SECRET_KEY 的用法见第 119 篇,环境变量见第 184 篇)。
旧 key 的服务:用旧 cookie 请求 /me → user='ann' 换成新 key 重启后:用同一个旧 cookie → user=None(session 被当作空的,用户退出登录),响应是否重新下发 cookie:False
上一篇:生产环境 DEBUG=False;下一篇:数据库连接健康检查。
实验的两个实例是真实的 gunicorn 进程,cookie 在它们之间手工传递。
[session 只读,不修改(默认会话 cookie)] 新 key + fallback 读旧 cookie → user='ann';响应重新下发 cookie:False(cookie 还是旧 key 签的) [permanent session(每次请求刷新过期时间)] 新 key + fallback 读旧 cookie → user='ann';响应重新下发 cookie:True;新下发的 cookie 能被只有新 key 的服务读出:'ann'
做法 1:一步到位(A 旧 key,B 新 key + fallback 旧)
A 签的 cookie 给 B → 'ann';B 签的 cookie 给 A → None
做法 2 第一步:全体 SECRET_KEY=旧,FALLBACKS=[新](先让所有实例能认新 key)
A 签的 cookie 给 B → 'ann';B 签的 cookie 给 A → 'ann'
做法 2 第二步:全体 SECRET_KEY=新,FALLBACKS=[旧]
A 签的 cookie 给 B → 'ann';B 签的 cookie 给 A → 'ann' 新 key + SECRET_KEY_FALLBACKS 配了旧 key,但令牌校验代码只用 app.config["SECRET_KEY"]:HTTP 400 {"error":"BadTimeSignature"}
校验代码改成 URLSafeTimedSerializer([新 key, 旧 key]):HTTP 200 {"ok":{"uid":7}}