Flask会话数据在Gunicorn+Nginx服务器丢失,本地运行正常
Flask会话持久化问题:本地运行正常,Gunicorn+Nginx部署后请求间session数据丢失
日志对比
本地日志(运行正常)
2025-01-05 01:26:38 - INFO - Session before token handling: {'_permanent': True} 2025-01-05 01:26:39 - INFO - Dataset saved for user 5. 2025-01-05 01:26:39 - INFO - Token processed successfully for user 5. 2025-01-05 01:26:39 - INFO - Session at the start of chat: {'_permanent': True, 'user_id': '5'}
服务器日志(会话数据缺失)
2025-01-05 01:28:52 - INFO - Session before token handling: {'_permanent': True} 2025-01-05 01:28:53 - INFO - Dataset saved for user 5. 2025-01-05 01:28:53 - INFO - Token processed successfully for user 5. 2025-01-05 01:28:53 - INFO - Session at the start of chat: {'_permanent': True} 2025-01-05 01:28:53 - WARNING - User not logged in. Using default dataset.
从日志可见,token处理路由中已设置user_id,但后续聊天路由请求中该数据丢失。
相关代码配置
Flask配置与会话设置
from flask import Flask, session from flask_session import Session import os from datetime import timedelta app = Flask(__name__) app.secret_key = os.urandom(24) # Session configuration app.config["SESSION_TYPE"] = "filesystem" SESSION_FILE_DIR = "./flask_session" if not os.path.exists(SESSION_FILE_DIR): os.makedirs(SESSION_FILE_DIR) app.config["SESSION_FILE_DIR"] = SESSION_FILE_DIR app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(minutes=30) app.config["SESSION_USE_SIGNER"] = True app.config["SESSION_COOKIE_HTTPONLY"] = True app.config["SESSION_COOKIE_SAMESITE"] = "Lax" app.config["SESSION_COOKIE_SECURE"] = False # Using HTTP for now Session(app)
会话设置路由
@app.route("/<path:token>", methods=["GET"]) def handle_token(token): session["user_id"] = "5" # Example user_id return "Token processed successfully"
会话读取路由
@app.route("/", methods=["GET"]) def chat(): user_id = session.get("user_id") if not user_id: return "User not logged in. Using default dataset.", 400 return f"User logged in with ID: {user_id}"
环境详情
- 本地环境
- OS: macOS/Linux
- Flask版本:2.x
- Python版本:3.9.x
- 服务器环境
- OS: Ubuntu 20.04
- 通过Gunicorn部署在Nginx之后
- Flask版本:2.x
- Python版本:3.9.x
已尝试的排查步骤
- 会话目录验证
- 确认服务器上
SESSION_FILE_DIR存在且可写; - 观察到会话文件已创建,但未持久化数据。
- 确认服务器上
- Cookie配置检查
- 验证会话cookie已发送至浏览器,配置看似正确。
- 日志追踪
- 添加详细日志以追踪应用各节点的会话数据。
- 安全Cookie设置
- 为服务器HTTP环境设置
SESSION_COOKIE_SECURE = False。
- 为服务器HTTP环境设置
- 浏览器开发者工具检查
- 确认会话cookie存在,且属性为:
- Secure: False(未使用HTTPS)
- SameSite: Lax
- Domain: localhost
- 确认会话cookie存在,且属性为:
潜在推测
- 文件型会话存储问题
- 会话文件在请求间可能无法被一致读取。
- Cookie配置错误
- 虽cookie存在,但可能未与会话文件正确关联。
- 负载均衡配置问题
- 若应用在负载均衡后,请求可能被路由至不同实例,导致会话不一致。
咨询问题
- 该问题是否与服务器端文件型会话机制有关?切换至Redis等后端是否有效?
- 如何在生产环境中确保Flask文件型会话存储的持久化?
- Flask部署在Gunicorn+Nginx后,是否有特定因素导致会话数据丢失?
补充说明
- 已测试简化版的session读写路由,仍出现相同问题;
- 仅服务器环境存在该异常,本地运行完全正常。
内容的提问来源于stack exchange,提问作者shabbir katlariwala
相关产品推荐
相关产品推荐

