# -*- coding: utf-8 -*- """ Gunicorn 配置文件 - app_vx.py 生产环境配置 使用方式: # 方式1: 使用 gevent 异步模式(推荐,支持高并发) gunicorn -c gunicorn_config.py -k gevent app_vx:app # 方式2: 使用同步多进程模式(更稳定) gunicorn -c gunicorn_config.py app_vx:app # 方式3: 使用 systemd 管理(见文件末尾 systemd 配置示例) """ import os import multiprocessing # ==================== 基础配置 ==================== # 绑定地址和端口 bind = '0.0.0.0:5002' # Worker 进程数(建议 2-4 个,不要太多以避免连接池竞争) workers = 4 # Worker 类型 - 默认使用 sync 模式,更稳定 # 如果需要 gevent,在命令行添加 -k gevent worker_class = 'sync' # 每个 worker 处理的最大请求数,超过后重启(防止内存泄漏) max_requests = 5000 max_requests_jitter = 500 # 随机抖动,避免所有 worker 同时重启 # ==================== 超时配置 ==================== # Worker 超时时间(秒),超过后 worker 会被杀死重启 timeout = 120 # 优雅关闭超时时间(秒) graceful_timeout = 30 # 保持连接超时时间(秒) keepalive = 5 # ==================== SSL 配置 ==================== # SSL 证书路径(生产环境需要配置) cert_file = '/etc/letsencrypt/live/api.valuefrontier.cn/fullchain.pem' key_file = '/etc/letsencrypt/live/api.valuefrontier.cn/privkey.pem' if os.path.exists(cert_file) and os.path.exists(key_file): certfile = cert_file keyfile = key_file # ==================== 日志配置 ==================== # 访问日志文件路径(- 表示输出到 stdout) accesslog = '-' # 错误日志文件路径(- 表示输出到 stderr) errorlog = '-' # 日志级别:debug, info, warning, error, critical loglevel = 'info' # 访问日志格式 access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" %(D)s' # ==================== 进程管理 ==================== # 是否在后台运行(daemon 模式) daemon = False # PID 文件路径 pidfile = '/tmp/gunicorn_app_vx.pid' # 进程名称 proc_name = 'app_vx' # ==================== 预加载配置 ==================== # 是否预加载应用代码 # 重要:设为 False 以确保每个 worker 有独立的连接池实例 # 否则多个 worker 共享同一个连接池会导致竞争和超时 preload_app = False # ==================== Hook 函数 ==================== def on_starting(server): """服务器启动时调用""" print(f"Gunicorn 服务器正在启动...") print(f" Workers: {server.app.cfg.workers}") print(f" Worker Class: {server.app.cfg.worker_class}") print(f" Bind: {server.app.cfg.bind}") def when_ready(server): """服务准备就绪时调用""" print("Gunicorn 服务准备就绪!") print("注意: 缓存将在首次请求时懒加载初始化") def on_reload(server): """服务器重载时调用""" print("Gunicorn 服务器正在重载...") def worker_int(worker): """Worker 收到 INT 或 QUIT 信号时调用""" print(f"Worker {worker.pid} 收到中断信号") def worker_abort(worker): """Worker 收到 SIGABRT 信号时调用(超时)""" print(f"Worker {worker.pid} 超时被终止") def post_fork(server, worker): """Worker 进程 fork 之后调用""" print(f"Worker {worker.pid} 已启动") def worker_exit(server, worker): """Worker 退出时调用""" print(f"Worker {worker.pid} 已退出") def on_exit(server): """服务器退出时调用""" print("Gunicorn 服务器已关闭") # ==================== systemd 配置示例 ==================== """ 将以下内容保存为 /etc/systemd/system/app_vx.service: [Unit] Description=Gunicorn instance to serve app_vx After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/path/to/vf_react Environment="PATH=/path/to/venv/bin" Environment="USE_GEVENT=true" ExecStart=/path/to/venv/bin/gunicorn -c gunicorn_config.py app_vx:app ExecReload=/bin/kill -s HUP $MAINPID KillMode=mixed TimeoutStopSec=5 PrivateTmp=true Restart=always RestartSec=10 [Install] WantedBy=multi-user.target 启用服务: sudo systemctl daemon-reload sudo systemctl enable app_vx sudo systemctl start app_vx sudo systemctl status app_vx 查看日志: sudo journalctl -u app_vx -f """