From 02ca4f48e67ff7fd8488006212502f4fac3f33a2 Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Thu, 11 Dec 2025 23:55:24 +0800 Subject: [PATCH] update pay ui --- gunicorn_eventlet_config.py | 221 ++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 gunicorn_eventlet_config.py diff --git a/gunicorn_eventlet_config.py b/gunicorn_eventlet_config.py new file mode 100644 index 00000000..24598a09 --- /dev/null +++ b/gunicorn_eventlet_config.py @@ -0,0 +1,221 @@ +# -*- coding: utf-8 -*- +""" +Gunicorn 配置文件 - Eventlet 极限高并发配置(110.42.32.207 专用) + +服务器配置: 48核心 128GB 内存 +目标并发: 160,000+ 并发连接 + +使用方式: + # 设置环境变量后启动 + export REDIS_HOST=127.0.0.1 + gunicorn -c gunicorn_eventlet_config.py app:app + + # 或者一行命令 + REDIS_HOST=127.0.0.1 gunicorn -c gunicorn_eventlet_config.py app:app + +架构说明: + - 16 个 Eventlet Worker(每个占用 1 核心,预留 32 核给系统/Redis/MySQL) + - 每个 Worker 处理 10000+ 并发连接(协程异步 I/O) + - Redis 消息队列同步跨 Worker 的 WebSocket 消息 + - 总并发能力: 16 × 10000 = 160,000+ 连接 +""" + +import os + +# ==================== 环境变量设置 ==================== +# 解决 eventlet greendns 无法解析 localhost 的问题 +os.environ.setdefault('REDIS_HOST', '127.0.0.1') + +# ==================== 基础配置 ==================== + +# 绑定地址和端口 +bind = '0.0.0.0:5001' + +# Worker 进程数 +# 48 核心机器: 16 Workers(预留资源给 Redis/MySQL/系统) +# 每个 Eventlet Worker 是单线程但支持协程并发 +workers = 16 + +# Worker 类型 - eventlet 异步模式 +worker_class = 'eventlet' + +# 每个 worker 的最大并发连接数 +# 16 Workers × 10000 = 160,000 并发连接能力 +worker_connections = 10000 + +# 每个 worker 处理的最大请求数(防止内存泄漏) +# 128GB 内存充足,可以设置较大值 +max_requests = 100000 +max_requests_jitter = 10000 + +# ==================== 超时配置 ==================== + +# Worker 超时时间(秒) +# WebSocket 长连接需要较长超时 +timeout = 600 + +# 优雅关闭超时时间(秒) +# 16 个 Worker 需要更长的优雅关闭时间 +graceful_timeout = 120 + +# 保持连接超时时间(秒) +keepalive = 120 + +# ==================== 内存优化 ==================== + +# 128GB 内存,可以适当增加缓冲区 +# 限制请求行大小(防止恶意请求) +limit_request_line = 8190 + +# 限制请求头数量 +limit_request_fields = 200 + +# 限制请求头大小 +limit_request_field_size = 8190 + +# ==================== 日志配置 ==================== + +accesslog = '-' +errorlog = '-' +loglevel = 'info' +capture_output = True +access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" %(D)sμs' + +# ==================== 进程管理 ==================== + +daemon = False +pidfile = '/tmp/gunicorn_eventlet.pid' +proc_name = 'vf_react_eventlet' + +# 不预加载应用 +preload_app = False + +# ==================== Hook 函数 ==================== + +def on_starting(server): + """服务器启动时调用""" + workers = server.app.cfg.workers + connections = server.app.cfg.worker_connections + total = workers * connections + + print("=" * 70) + print("🚀 Gunicorn + Eventlet 极限高并发服务器正在启动...") + print("=" * 70) + print(f" 服务器配置: 48核心 128GB 内存") + print(f" Workers: {workers} 个 Eventlet 协程进程") + print(f" 每 Worker 连接数: {connections:,}") + print(f" 总并发能力: {total:,} 连接") + print("-" * 70) + print(f" Bind: {server.app.cfg.bind}") + print(f" Max Requests: {server.app.cfg.max_requests:,}") + print(f" Timeout: {server.app.cfg.timeout}s") + print("-" * 70) + print(" 多进程架构:") + print(" - Redis db=0: 微信登录状态(跨 Worker 共享)") + print(" - Redis db=1: Flask Session(跨 Worker 共享)") + print(" - Redis db=2: SocketIO 消息队列(跨 Worker 同步)") + print("=" * 70) + + +def when_ready(server): + """服务准备就绪时调用""" + workers = server.app.cfg.workers + connections = server.app.cfg.worker_connections + total = workers * connections + + print("=" * 70) + print(f"✅ Gunicorn + Eventlet 服务准备就绪!") + print(f" {workers} 个 Worker 已启动") + print(f" 总并发能力: {total:,} 连接") + print(f" WebSocket + HTTP API 混合高并发已启用") + print("=" * 70) + + +def post_worker_init(worker): + """Worker 初始化完成后调用""" + print(f"✅ Eventlet Worker {worker.pid} 已初始化 (10,000 并发连接就绪)") + + +def worker_abort(worker): + """Worker 收到 SIGABRT 信号时调用(超时)""" + print(f"⚠️ Worker {worker.pid} 超时被终止,正在重启...") + + +def on_exit(server): + """服务器退出时调用""" + print("🛑 Gunicorn + Eventlet 服务器已关闭") + + +# ==================== systemd 服务配置示例 ==================== +""" +保存为 /etc/systemd/system/vf_eventlet.service: + +[Unit] +Description=VF React Flask (Eventlet 160K Concurrent) - 48 Core 128GB +After=network.target redis.service mysql.service + +[Service] +User=root +Group=root +WorkingDirectory=/path/to/vf_react +Environment="PATH=/path/to/venv/bin" +Environment="REDIS_HOST=127.0.0.1" + +# 系统资源限制(48核128GB专用服务器) +LimitNOFILE=200000 +LimitNPROC=65535 + +ExecStart=/path/to/venv/bin/gunicorn -c gunicorn_eventlet_config.py app:app +ExecReload=/bin/kill -s HUP $MAINPID +Restart=always +RestartSec=5 +TimeoutStopSec=120 + +[Install] +WantedBy=multi-user.target + +启用服务: + sudo systemctl daemon-reload + sudo systemctl enable vf_eventlet + sudo systemctl start vf_eventlet + sudo systemctl status vf_eventlet + +查看日志: + sudo journalctl -u vf_eventlet -f + +============================================================ +系统优化(在 110.42.32.207 上执行): + +# 1. 增加文件描述符限制 +echo "* soft nofile 200000" >> /etc/security/limits.conf +echo "* hard nofile 200000" >> /etc/security/limits.conf + +# 2. 内核参数优化(/etc/sysctl.conf) +cat >> /etc/sysctl.conf << 'EOF' +# TCP 连接优化 +net.core.somaxconn = 65535 +net.core.netdev_max_backlog = 65535 +net.ipv4.tcp_max_syn_backlog = 65535 + +# 端口范围 +net.ipv4.ip_local_port_range = 1024 65535 + +# TIME_WAIT 优化 +net.ipv4.tcp_tw_reuse = 1 +net.ipv4.tcp_fin_timeout = 15 + +# 内存优化(128GB 内存) +net.core.rmem_max = 16777216 +net.core.wmem_max = 16777216 +net.ipv4.tcp_rmem = 4096 87380 16777216 +net.ipv4.tcp_wmem = 4096 65536 16777216 + +# 连接跟踪(防火墙) +net.netfilter.nf_conntrack_max = 1000000 +EOF + +# 3. 应用内核参数 +sysctl -p + +============================================================ +"""