Fastapi web 应用生产级守护部署的方式?

2023-03-10 14:05:54 +08:00
 LeeReamond

多进程 fastapi ,一直用的是跑分网的部署方法,用 gunicorn 挂 uvicorn worker 启动。倒是没出过什么问题,因为我们以前压力一直不大,未来有点预期要上压力,我想起来这个好像有个坑来着。因为印象里以前看哪个大佬提过一嘴说 gunicorn 实际上只能启动但是进程挂了之后连重拉起功能都没有的,也不知道是不是属实。。。

2488 次点击
所在节点    Python
19 条回复
zoranz
2023-03-10 17:47:54 +08:00
你有啥场景能把进程干爆啊
idblife
2023-03-10 17:54:34 +08:00
supervisord
paopjian
2023-03-10 19:29:54 +08:00
那就拿 supervisor 保护呗
echo1937
2023-03-10 20:44:09 +08:00
gunicorn 是 WSGI HTTP Server ,很类似 Java 里的 Tomcat ; Supervisor 则是 A Process Control System ,负责 monitor and control a number of processes ,你的进程挂了会帮你重新拉起来。以上都是他们官方文档摘抄的原文。
neoblackcap
2023-03-10 20:53:52 +08:00
现在而言,配置一下 systemd 就能守护好进程
LeeReamond
2023-03-10 20:56:56 +08:00
@neoblackcap
@paopjian
@idblife 一个疑问,gunicorn 是有子进程的,supervisor 只能监控主进程啊,子进程挂了怎么办
lgh
2023-03-11 08:21:44 +08:00
子进程挂了会重启啊。不过我的是纯 gunicorn ,并没有下挂 uvicorn 。
ClericPy
2023-03-11 10:07:08 +08:00
Fastapi 以前自己服务器上就 uvicorn 直接起, 反正更新代码重启下就够了, 不开 --reload

公司服务器上也是 gunicorn + uvicorn, 主要用到 gunicorn 那个 HUP 信号无中断的热重启, 守护 systemd 就够了, supervisord 这么多年了也不知道当初那些小 bug 好了没有

现在在考虑 docker 那边怎么无中断热重启, 想丢 K8S 里面, 之前想的是 nginx 帮我转发多个端口的, 重启的时候一个个重启自动切流量, 不知道有什么更好办法没有. docker 里面走 gunicorn 就算接到 HUP, 但是代码是跟镜像走的...
julyclyde
2023-03-11 11:18:55 +08:00
systemd 是唯一正确答案
supervisord 自己由谁守护还是个问题呢
SKYNE
2023-03-11 13:48:09 +08:00
容器化丢 k8s 里
LeeReamond
2023-03-11 16:52:41 +08:00
@ClericPy 可能确实容器化+nginx 分流是比较合理的方案。寻思了一下,似乎直接 gunicorn 实现多节点也只有一行代码启动的优势,毕竟通信都靠中间服务了,可能细研究连方便也未必方便。
ClericPy
2023-03-11 21:04:33 +08:00
@LeeReamond nginx 我也是没办法, 但凡组里有个运维就研究研究 Istio 什么的了. 我就想知道个当前的版本答案, gunicorn 这套五年前就不流行了
LeeReamond
2023-03-11 21:41:32 +08:00
@ClericPy 哈哈,老哥版本答案总结到位
fcfangcc
2023-03-13 17:06:14 +08:00
gunicorn 子进程挂了是会自动拉起的,不用担心
luzihang
2023-03-14 09:07:11 +08:00
pm2 也可以用用,比 supervisord 好看,好用
ClericPy
2023-03-14 18:54:50 +08:00
@LeeReamond 大哥, 我是来等新版本云原生的答案的...
byaiu
2023-03-16 17:40:25 +08:00
@ClericPy 求问当下流行什么?直接 systemd 接管?
ClericPy
2023-03-16 18:46:47 +08:00
@byaiu
流行云原生吧, 主要想抄个版本答案, 能达到和以前那套一样流量不丢失的就行. 我也求问啊... 现在想到的就是多实例切流量, 不然默认的实例重启会弄丢当前连接

不是专业后端, 所以想照抄个当下答案, 如果不是后端是脚本, 就随便重启了
ykb8121
2023-03-24 14:50:22 +08:00
systemd

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/922872

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX