""" Gunicorn 配置文件 用于生产环境多进程部署,支持通过环境变量动态配置。 配合 Uvicorn Worker 实现高性能异步处理。 需求引用: 1.1, 1.2, 1.3 """ import os import multiprocessing # ============================================================ # Worker 配置 # ============================================================ # Worker 数量:默认为 CPU 核心数 * 2 + 1 # 可通过 GUNICORN_WORKERS 环境变量覆盖 workers = int(os.getenv("GUNICORN_WORKERS", "2")) # Worker 类型:使用 Uvicorn 的异步 Worker worker_class = "uvicorn.workers.UvicornWorker" # 每个 Worker 的最大并发连接数 worker_connections = 1000 # Worker 处理请求的超时时间(秒) timeout = 120 # Keep-Alive 连接超时时间(秒) keepalive = 5 # ============================================================ # 绑定配置 # ============================================================ # 服务绑定地址和端口 bind = f"{os.getenv('APP_HOST', '0.0.0.0')}:{os.getenv('APP_PORT', '8010')}" # ============================================================ # 进程管理 - 防止内存泄漏 # ============================================================ # Worker 处理指定请求数后自动重启,防止内存泄漏 max_requests = 1000 # 随机抖动值,避免所有 Worker 同时重启 # 实际重启请求数 = max_requests + random(0, max_requests_jitter) max_requests_jitter = 50 # 优雅关闭超时时间(秒) # Worker 收到重启信号后,等待当前请求完成的最大时间 graceful_timeout = 30 # ============================================================ # 日志配置 # ============================================================ # 访问日志输出位置("-" 表示标准输出) accesslog = "-" # 错误日志输出位置("-" 表示标准错误) errorlog = "-" # 日志级别:debug, info, warning, error, critical loglevel = os.getenv("LOG_LEVEL", "info") # 访问日志格式 access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" %(D)s' # ============================================================ # 应用加载 # ============================================================ # 预加载应用:在 Master 进程中加载应用,Worker fork 后共享 # 优点:减少内存占用,加快 Worker 启动速度 # 注意:需要确保应用支持 fork 安全 preload_app = True # ============================================================ # 服务器钩子函数 # ============================================================ def on_starting(server): """ 服务启动时的钩子 在 Master 进程启动时调用 """ pass def on_reload(server): """ 服务重载时的钩子 在收到 HUP 信号重载配置时调用 """ pass def worker_int(worker): """ Worker 收到 INT 或 QUIT 信号时的钩子 用于清理 Worker 资源 """ pass def post_fork(server, worker): """ Worker fork 后的钩子(preload_app=True 时必需) preload_app=True 时 master 进程已创建 SQLAlchemy engine, fork 后所有 worker 共享同一个底层 socket fd,会导致连接错乱。 在 fork 后 dispose engine 让每个 worker 重建自己的连接池。 """ try: from app.database import engine engine.dispose() except Exception: pass def worker_exit(server, worker): """ Worker 退出时的钩子 在 Worker 进程退出后由 Master 进程调用 可用于记录 Worker 退出日志或清理资源 """ pass def child_exit(server, worker): """ Worker 子进程退出时的钩子 在 Worker 进程退出后由 Master 进程调用 """ pass def worker_abort(worker): """ Worker 异常终止时的钩子 当 Worker 超时或收到 SIGABRT 信号时调用 """ pass