gunicorn.conf.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. """
  2. Gunicorn 配置文件
  3. 用于生产环境多进程部署,支持通过环境变量动态配置。
  4. 配合 Uvicorn Worker 实现高性能异步处理。
  5. 需求引用: 1.1, 1.2, 1.3
  6. """
  7. import os
  8. import multiprocessing
  9. # ============================================================
  10. # Worker 配置
  11. # ============================================================
  12. # Worker 数量:默认为 CPU 核心数 * 2 + 1
  13. # 可通过 GUNICORN_WORKERS 环境变量覆盖
  14. workers = int(os.getenv("GUNICORN_WORKERS", "2"))
  15. # Worker 类型:使用 Uvicorn 的异步 Worker
  16. worker_class = "uvicorn.workers.UvicornWorker"
  17. # 每个 Worker 的最大并发连接数
  18. worker_connections = 1000
  19. # Worker 处理请求的超时时间(秒)
  20. timeout = 120
  21. # Keep-Alive 连接超时时间(秒)
  22. keepalive = 5
  23. # ============================================================
  24. # 绑定配置
  25. # ============================================================
  26. # 服务绑定地址和端口
  27. bind = f"{os.getenv('APP_HOST', '0.0.0.0')}:{os.getenv('APP_PORT', '8010')}"
  28. # ============================================================
  29. # 进程管理 - 防止内存泄漏
  30. # ============================================================
  31. # Worker 处理指定请求数后自动重启,防止内存泄漏
  32. max_requests = 1000
  33. # 随机抖动值,避免所有 Worker 同时重启
  34. # 实际重启请求数 = max_requests + random(0, max_requests_jitter)
  35. max_requests_jitter = 50
  36. # 优雅关闭超时时间(秒)
  37. # Worker 收到重启信号后,等待当前请求完成的最大时间
  38. graceful_timeout = 30
  39. # ============================================================
  40. # 日志配置
  41. # ============================================================
  42. # 访问日志输出位置("-" 表示标准输出)
  43. accesslog = "-"
  44. # 错误日志输出位置("-" 表示标准错误)
  45. errorlog = "-"
  46. # 日志级别:debug, info, warning, error, critical
  47. loglevel = os.getenv("LOG_LEVEL", "info")
  48. # 访问日志格式
  49. access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" %(D)s'
  50. # ============================================================
  51. # 应用加载
  52. # ============================================================
  53. # 预加载应用:在 Master 进程中加载应用,Worker fork 后共享
  54. # 优点:减少内存占用,加快 Worker 启动速度
  55. # 注意:需要确保应用支持 fork 安全
  56. preload_app = True
  57. # ============================================================
  58. # 服务器钩子函数
  59. # ============================================================
  60. def on_starting(server):
  61. """
  62. 服务启动时的钩子
  63. 在 Master 进程启动时调用
  64. """
  65. pass
  66. def on_reload(server):
  67. """
  68. 服务重载时的钩子
  69. 在收到 HUP 信号重载配置时调用
  70. """
  71. pass
  72. def worker_int(worker):
  73. """
  74. Worker 收到 INT 或 QUIT 信号时的钩子
  75. 用于清理 Worker 资源
  76. """
  77. pass
  78. def post_fork(server, worker):
  79. """
  80. Worker fork 后的钩子(preload_app=True 时必需)
  81. preload_app=True 时 master 进程已创建 SQLAlchemy engine,
  82. fork 后所有 worker 共享同一个底层 socket fd,会导致连接错乱。
  83. 在 fork 后 dispose engine 让每个 worker 重建自己的连接池。
  84. """
  85. try:
  86. from app.database import engine
  87. engine.dispose()
  88. except Exception:
  89. pass
  90. def worker_exit(server, worker):
  91. """
  92. Worker 退出时的钩子
  93. 在 Worker 进程退出后由 Master 进程调用
  94. 可用于记录 Worker 退出日志或清理资源
  95. """
  96. pass
  97. def child_exit(server, worker):
  98. """
  99. Worker 子进程退出时的钩子
  100. 在 Worker 进程退出后由 Master 进程调用
  101. """
  102. pass
  103. def worker_abort(worker):
  104. """
  105. Worker 异常终止时的钩子
  106. 当 Worker 超时或收到 SIGABRT 信号时调用
  107. """
  108. pass