| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- """
- 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
|