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

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

已尝试的排查步骤

  1. 会话目录验证
    • 确认服务器上SESSION_FILE_DIR存在且可写;
    • 观察到会话文件已创建,但未持久化数据。
  2. Cookie配置检查
    • 验证会话cookie已发送至浏览器,配置看似正确。
  3. 日志追踪
    • 添加详细日志以追踪应用各节点的会话数据。
  4. 安全Cookie设置
    • 为服务器HTTP环境设置SESSION_COOKIE_SECURE = False。
  5. 浏览器开发者工具检查
    • 确认会话cookie存在,且属性为:
      • Secure: False(未使用HTTPS)
      • SameSite: Lax
      • Domain: localhost

潜在推测

  1. 文件型会话存储问题
    • 会话文件在请求间可能无法被一致读取。
  2. Cookie配置错误
    • 虽cookie存在,但可能未与会话文件正确关联。
  3. 负载均衡配置问题
    • 若应用在负载均衡后,请求可能被路由至不同实例,导致会话不一致。

咨询问题

  1. 该问题是否与服务器端文件型会话机制有关?切换至Redis等后端是否有效?
  2. 如何在生产环境中确保Flask文件型会话存储的持久化?
  3. Flask部署在Gunicorn+Nginx后,是否有特定因素导致会话数据丢失?

补充说明

  • 已测试简化版的session读写路由,仍出现相同问题;
  • 仅服务器环境存在该异常,本地运行完全正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:31:03