update pay ui
This commit is contained in:
@@ -1,14 +1,18 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Gunicorn 配置文件 - app.py 生产环境配置(支持 Flask-SocketIO + WebSocket)
|
||||
Gunicorn 配置文件 - app.py 生产环境配置(支持 Flask-SocketIO + WebSocket + 多进程)
|
||||
|
||||
使用方式:
|
||||
# 推荐方式: 使用此配置文件启动
|
||||
# 推荐方式: 使用此配置文件启动(多 Worker 模式)
|
||||
gunicorn -c gunicorn_app_config.py app:app
|
||||
|
||||
# 如果遇到 502 错误,可以尝试安装 eventlet 后使用:
|
||||
pip install eventlet
|
||||
gunicorn -k eventlet -w 1 -b 0.0.0.0:5001 --timeout 300 app:app
|
||||
# 单 Worker 调试模式:
|
||||
gunicorn -c gunicorn_app_config.py -w 1 app:app
|
||||
|
||||
多进程架构说明:
|
||||
- Flask Session 使用 Redis 存储(db=1),所有 Worker 共享
|
||||
- SocketIO 使用 Redis 消息队列(db=2),跨 Worker 消息同步
|
||||
- 微信登录状态使用 Redis 存储(db=0),所有 Worker 共享
|
||||
"""
|
||||
|
||||
import os
|
||||
@@ -18,8 +22,10 @@ import os
|
||||
# 绑定地址和端口
|
||||
bind = '0.0.0.0:5001'
|
||||
|
||||
# Worker 进程数(WebSocket 需要单 worker)
|
||||
workers = 1
|
||||
# Worker 进程数
|
||||
# 对于 16 核心机器,使用 4-8 个 gevent workers 即可(每个可处理数千并发)
|
||||
# 建议: min(8, CPU_CORES / 2) 因为 gevent 本身是异步的,不需要太多进程
|
||||
workers = 4 # 4 个 gevent workers,每个可处理 2000 并发连接 = 8000 总并发
|
||||
|
||||
# Worker 类型 - 使用 geventwebsocket 支持 WebSocket
|
||||
# Flask-SocketIO 需要异步 worker 来支持 WebSocket
|
||||
@@ -28,9 +34,10 @@ worker_class = 'geventwebsocket.gunicorn.workers.GeventWebSocketWorker'
|
||||
# Worker 连接数(gevent 异步模式下可以处理大量并发连接)
|
||||
worker_connections = 2000
|
||||
|
||||
# 每个 worker 处理的最大请求数
|
||||
max_requests = 0 # 禁用自动重启,避免 WebSocket 连接中断
|
||||
max_requests_jitter = 0
|
||||
# 每个 worker 处理的最大请求数(防止内存泄漏)
|
||||
# 对于 WebSocket 长连接,设置一个较大的值,不能是 0(否则内存泄漏无法恢复)
|
||||
max_requests = 10000 # 处理 10000 个请求后重启 worker
|
||||
max_requests_jitter = 1000 # 随机抖动,避免所有 worker 同时重启
|
||||
|
||||
# ==================== 超时配置 ====================
|
||||
|
||||
@@ -73,24 +80,31 @@ preload_app = False
|
||||
|
||||
def on_starting(server):
|
||||
"""服务器启动时调用"""
|
||||
print("=" * 60)
|
||||
print("🚀 Gunicorn + Flask-SocketIO 服务器正在启动...")
|
||||
print("=" * 70)
|
||||
print("🚀 Gunicorn + Flask-SocketIO 多进程服务器正在启动...")
|
||||
print(f" Workers: {server.app.cfg.workers}")
|
||||
print(f" Worker Class: {server.app.cfg.worker_class}")
|
||||
print(f" Bind: {server.app.cfg.bind}")
|
||||
print(f" Worker Connections: {server.app.cfg.worker_connections}")
|
||||
print("=" * 60)
|
||||
print(f" Max Requests: {server.app.cfg.max_requests}")
|
||||
print("-" * 70)
|
||||
print(" Redis 存储分配:")
|
||||
print(" - db=0: 微信登录状态")
|
||||
print(" - db=1: Flask Session")
|
||||
print(" - db=2: SocketIO 消息队列")
|
||||
print("=" * 70)
|
||||
|
||||
|
||||
def when_ready(server):
|
||||
"""服务准备就绪时调用"""
|
||||
print("✅ Gunicorn 服务准备就绪! WebSocket 支持已启用")
|
||||
print(f"✅ Gunicorn 服务准备就绪! {server.app.cfg.workers} 个 Worker 已启动")
|
||||
print(" 多进程支持已启用 (Redis Session + SocketIO Message Queue)")
|
||||
|
||||
|
||||
def post_worker_init(worker):
|
||||
"""Worker 初始化完成后调用"""
|
||||
# gevent monkey patching 在这里自动完成
|
||||
print(f"✅ Worker {worker.pid} 已初始化 (gevent 异步模式)")
|
||||
print(f"✅ Worker {worker.pid} 已初始化 (gevent 异步模式, 可处理 2000 并发连接)")
|
||||
|
||||
|
||||
def worker_abort(worker):
|
||||
|
||||
Reference in New Issue
Block a user