Gunicorn 是什么

一句话总结

Gunicorn 是 Python WSGI HTTP 服务器,在 Frappe Press 的容器里负责运行所有 Web 进程——把浏览器的 HTTP 请求转给 Frappe 应用处理。


🤔 为什么会有它 / 解决了什么问题

Flask/Frappe 等 Python Web 框架自带的开发服务器性能差、一次只能处理一个请求。Gunicorn 用多 worker 模式并行处理请求,自带进程管理(worker 崩溃自动拉起),适合生产环境。


🔍 具体原理 / 运作逻辑

Gunicorn 启动一组 worker 进程(默认 sync worker),每个 worker 独立处理 HTTP 请求。master 进程负责 worker 管理(拉起、优雅关闭、TTIN/TTOU 信号动态调整 worker 数)。


🧭 什么情况下会用到 / 什么场景会遇到它

  • Press 容器内的所有 Frappe 站点运行在 Gunicorn 之上(端口 8000)
  • Frappe 框架的 HTTP 请求处理全链路:浏览器 → Nginx → Gunicorn → Frappe app
  • 调试时看 Gunicorn 日志定位 502/504 错误

🛠️ 怎么上手 / 在哪操作

不需要直接操作——Press 的 supervisor 自动管理 Gunicorn 进程。调试时 supervisorctl status 查看 Gunicorn 状态,supervisorctl restart gunicorn 重启。


⚖️ 副作用 / 代价 / 取舍

默认 sync worker 是阻塞模式——一个 worker 处理请求时不能干别的。长耗时请求(如报表导出)会占满该 worker 直到超时(120s),影响其他用户。需要异步 worker(gevent)优化但需改配置。


🕰️ 来历

  • 谁提出/创造的:Benoit Chesneau(独立开发者,后续由社区维护)
  • 什么时候出现的:2011 年首次发布

🔗 关联 / 经常一起出现的概念

  • Frappefrappe.app:application 是 Gunicorn 加载的 WSGI 应用入口
  • supervisor:Press 上用 supervisor 管理 Gunicorn 进程的生命周期
  • Nginx:反向代理将请求转发到 Gunicorn 监听的端口

⚠️ 注意事项 / 常见误区

--timeout 默认 30 秒,Frappe 站点导入大数据库或编译 assets 时容易超时 502。Press 容器设为 120 秒是经过实践验证的合理值。


📎 记忆锚点

Gunicorn 是 Python 版的 Nginx——它不做业务逻辑,只专注高效地把外部请求转给 Python 应用,靠多 worker 解决并发。


📝 更新日志

日期改动原因
2026-07-13首次创建-