update pay ui

This commit is contained in:
2025-12-11 23:02:48 +08:00
parent bdad36bb16
commit 870b266a31
3 changed files with 56 additions and 16 deletions

28
app.py
View File

@@ -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-SessionRedis 存储
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

View File

@@ -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

View File

@@ -6,6 +6,24 @@ map $http_upgrade $connection_upgrade {
'' close;
}
# ============================================
# Flask 后端负载均衡(支持多进程)
# ============================================
upstream flask_backend {
# 方式1: 单实例多 WorkerGunicorn -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;