From 870b266a31f31e17325cc99c0ec7800fed403657 Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Thu, 11 Dec 2025 23:02:48 +0800 Subject: [PATCH] update pay ui --- app.py | 28 ++++++++++++++++++---------- gunicorn_app_config.py | 6 +++--- valuefrontier.conf | 38 +++++++++++++++++++++++++++++++++++--- 3 files changed, 56 insertions(+), 16 deletions(-) diff --git a/app.py b/app.py index 1bee9d56..f21edd17 100755 --- a/app.py +++ b/app.py @@ -293,13 +293,20 @@ app.config['SECRET_KEY'] = os.environ.get('FLASK_SECRET_KEY', 'vf_production_sec # ============ Redis Session 配置(支持多进程/多 Worker)============ # 使用 Redis 存储 session,确保多个 Gunicorn worker 共享 session -# 复用前面定义的 _REDIS_HOST 和 _REDIS_PORT -app.config['SESSION_TYPE'] = 'redis' -app.config['SESSION_REDIS'] = redis.Redis(host=_REDIS_HOST, port=_REDIS_PORT, db=1) # db=1 用于 session -app.config['SESSION_PERMANENT'] = True -app.config['SESSION_USE_SIGNER'] = True # 对 session cookie 签名,提高安全性 -app.config['SESSION_KEY_PREFIX'] = 'vf_session:' # session key 前缀 -print(f"📦 Flask Session 配置: {_REDIS_HOST}:{_REDIS_PORT}/db=1") +# 通过环境变量控制是否启用 Redis Session(排查问题时可以禁用) +USE_REDIS_SESSION = os.environ.get('USE_REDIS_SESSION', 'true').lower() == 'true' + +if USE_REDIS_SESSION: + app.config['SESSION_TYPE'] = 'redis' + app.config['SESSION_REDIS'] = redis.Redis(host=_REDIS_HOST, port=_REDIS_PORT, db=1) # db=1 用于 session + app.config['SESSION_PERMANENT'] = True + app.config['SESSION_USE_SIGNER'] = True # 对 session cookie 签名,提高安全性 + app.config['SESSION_KEY_PREFIX'] = 'vf_session:' # session key 前缀 + print(f"📦 Flask Session 配置: Redis {_REDIS_HOST}:{_REDIS_PORT}/db=1") +else: + # 使用默认的 cookie session(单 Worker 模式可用) + app.config['SESSION_TYPE'] = 'null' # 禁用服务端 session,使用 cookie + print(f"📦 Flask Session 配置: Cookie 模式(单 Worker)") # ============ Redis Session 配置结束 ============ # Cookie 配置 - 重要:HTTPS 环境必须设置 SECURE=True @@ -313,9 +320,10 @@ app.config['REMEMBER_COOKIE_DURATION'] = timedelta(days=30) # 记住登录30天 app.config['REMEMBER_COOKIE_SECURE'] = True # 生产环境使用 HTTPS,必须为 True app.config['REMEMBER_COOKIE_HTTPONLY'] = True # 防止XSS攻击 -# 初始化 Flask-Session(Redis 存储) -Session(app) -print("✅ Flask-Session (Redis) 已初始化,支持多 Worker 共享 session") +# 初始化 Flask-Session(仅在启用 Redis Session 时) +if USE_REDIS_SESSION: + Session(app) + print("✅ Flask-Session (Redis) 已初始化,支持多 Worker 共享 session") # 配置邮件 app.config['MAIL_SERVER'] = MAIL_SERVER diff --git a/gunicorn_app_config.py b/gunicorn_app_config.py index c6f3bbdb..a5b00e55 100644 --- a/gunicorn_app_config.py +++ b/gunicorn_app_config.py @@ -27,9 +27,9 @@ bind = '0.0.0.0:5001' # 建议: min(8, CPU_CORES / 2) 因为 gevent 本身是异步的,不需要太多进程 workers = 4 # 4 个 gevent workers,每个可处理 2000 并发连接 = 8000 总并发 -# Worker 类型 - 使用 geventwebsocket 支持 WebSocket -# Flask-SocketIO 需要异步 worker 来支持 WebSocket -worker_class = 'geventwebsocket.gunicorn.workers.GeventWebSocketWorker' +# Worker 类型 - 使用 gevent(新版 Flask-SocketIO 不需要 geventwebsocket) +# 参考: https://flask-socketio.readthedocs.io/en/latest/deployment.html +worker_class = 'gevent' # Worker 连接数(gevent 异步模式下可以处理大量并发连接) worker_connections = 2000 diff --git a/valuefrontier.conf b/valuefrontier.conf index 76fac284..90fc3aca 100644 --- a/valuefrontier.conf +++ b/valuefrontier.conf @@ -6,6 +6,24 @@ map $http_upgrade $connection_upgrade { '' close; } +# ============================================ +# Flask 后端负载均衡(支持多进程) +# ============================================ +upstream flask_backend { + # 方式1: 单实例多 Worker(Gunicorn -w 4) + server 127.0.0.1:5001; + + # 方式2: 多实例负载均衡(需要分别启动多个 Gunicorn) + # 取消下面的注释即可启用 + # server 127.0.0.1:5001; + # server 127.0.0.1:5002; + # server 127.0.0.1:5003; + # server 127.0.0.1:5004; + + # 保持连接(提升性能) + keepalive 32; +} + # HTTP (端口 80) 服务器块: 负责将所有HTTP请求重定向到HTTPS server { listen 80; @@ -90,19 +108,33 @@ server { # add_header Cache-Control "public, immutable"; # } - # --- 后端API反向代理 --- + # --- 后端API反向代理(使用 upstream 支持负载均衡)--- location /api/ { - proxy_pass http://127.0.0.1:5001; + proxy_pass http://flask_backend; + proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Connection ""; # 启用 keepalive + + # 超时配置(微信回调等需要足够时间) + proxy_connect_timeout 60s; + proxy_send_timeout 120s; + proxy_read_timeout 120s; + + # 错误处理 + proxy_next_upstream error timeout http_502 http_503 http_504; + proxy_next_upstream_tries 3; } + + # WebSocket (Socket.IO) 代理 location /socket.io/ { - proxy_pass http://127.0.0.1:5001; + proxy_pass http://flask_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;