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 的 supervisor.conf 中 Gunicorn 配置为
gunicorn -b 0.0.0.0:8000 -w 4 --timeout 120 frappe.app:application。frappe.app:application是 Frappe 的 WSGI 入口。-w 4启动 4 个 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 年首次发布
🔗 关联 / 经常一起出现的概念
- Frappe:
frappe.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 | 首次创建 | - |