update pay ui
This commit is contained in:
28
app.py
28
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user