Python Web 项目的部署如此之复杂!

341 天前
 sadfQED2

接手了一个 python django 写的上古项目。今天稍稍改了改,部署上线的时候突然看到启动命令竟然写的是python manage.py runserver

虽然我从来没写过 django 项目,但是我也知道这命令启动的是开发测试服务器。就跟前端的npm run dev一样。此时我内心”这特么怎么行,线上业务啊,怎么能这么敷衍,跑个测试服务器就上线“。于是想着改改 Dockerfile ,改成正经的线上部署。

可是我也没搞过 django 啊,经过一通搜索,大致了解到,django 可以通过 Gunicon 、uWSGI 、Apache mod_wsgi 、Daphne 、Hypercom 、Uvicom 等等方式部署。我淦,怎么这么多啊,我也不知道选哪个啊,uWSGI 在官网写在第一个的,那就他吧。

照着官网示例抄吧,先这样再那样,Dockerfile 改好了,试一试,草,Docker 容器怎么启动就停了?一通排查,原来 uwsgi --ini uwsgi.ini这命令不是前台运行的,Dockerfile 里面拿这个当启动命令起来立马就没了。

经过 N 久翻阅文档,发现 uwsgi 启动会生成一个 pid 文件,看到这里,我这个大聪明有办法了,于是 Dockerfile 启动命令改成CMD uwsgi --ini uwsgi.ini && tail -f uwsgi.pid ,再次尝试,容器成功保活。

正在得意我的聪明才智的时候,结果一看,我淦,uwsgi 是起来了,但是服务为啥不能用啊。又一通排查,我淦,uwsgi.ini 里面的路径好像有问题,可这玩意路径写到哪里文档也没说啊,网上一会说是项目路径,一会说是 app 路径,什么鬼啊,一个一个尝试,结果都特么不行。

再仔细翻翻文档,这什么玩意呀,部署上线什么还要带个 sqllite 文件呀,怎么还有先执行命令整理代码啊,怎么还要。。。。。

从早上 10 点一直捣鼓到现在晚上 8 点,饭都没吃饱,这什么破玩意啊。md 果断敲下 git reset -hard 。滚 tm 的,我真是吃饱了没事干,服务跑得好好的,改什么改,前人用开发服务器肯定是有他的道理的,瞎改什么改。就算服务挂了,Docker 容器自动拉起,有毛线关系啊。

不得不感叹,我部署过上古时期的 java 项目,拷个 war 包上线。也部署过 php 项目,拷份代码到目录就上线,也部署过 golang 项目,本地交叉编译拷个二进制文件上线,也部署过 c c++项目... 像 python 这么恶心的还是第一次,什么乱七八糟路径,调试又没日志,找到日志又不清不楚的,没人用这玩意果然是有原因的。

3303 次点击
所在节点    Python
43 条回复
yakun4566
341 天前
python *.py 还好吧,我们线上项目 Java 也是 java -jar 啊(也有可能是我们水分太大
volvo007
341 天前
op 好惨,上来选了个最“基础” 的…… 选 gunicorn 可破,但是,光选中间件也不行啊,你还没部署 nginx 反向代理呢 (狗头
shimada666
341 天前
搞那么麻烦干嘛,直接 python manage.py runserver 就好了。
等 qps 过 20 再考虑别的吧
arischow
340 天前
你接手的代码烂,你也菜😄
llsquaer
340 天前
写的 api 接口,直接 python manage.py runserver 没毛病。。工作期间 8 小时内 平均 QPS 80 左右至今没问题。内部使用。

不过 python web 是略显复杂。主要就几个容器的区别。熟悉一个当万金油用
sadfQED2
340 天前
@shimada666 线上大几十台机器,你说 qps 过 20 不

@llsquaer 直接 runserver 区别大吗?是一个 ai 模型,为了提供 api 调用,就 django 包了一层,整个项目就一个接口,代码不超过 100 行
ihmily
340 天前
项目就一个接口,直接使用 fastapi 就好了
JiaNa
340 天前
@sadfQED2 既然你说了是旧项目,如果之前没有出现性能问题,那么没有性能问题。
如果你愿意折腾、学东西,模拟生产环境 API 进行压测,比较不同方式的性能区别。
shimada666
340 天前
@sadfQED2 完全没问题,容器挂个 restart=always ,崩了还能重新启动
sadfQED2
340 天前
@JiaNa 线上服务,不能随便压。我也不是专业运维,也不是专业的 python 开发。但是就我的理解,直接 python runserver 这应该是单进程运行的,就 python 来说这应该完全没办法充分利用 cpu 。

但是这个项目本质上是调用 PyTorch ,PyTorch 底层又是调用 C++模块,C++模块是不是就能不受限于 Pyton 的单进程直接跑满 CPU 了我也不清楚。

所以到底能不能充分利用 cpu 我也搞不清楚。
sadfQED2
340 天前
@shimada666 #9 现在容器就是 restart=always ,然后上层网关配置了故障转移。某次请求失败会自动转到其他机房的容器上。但是想着 python runserver 还监听代码变化,随时重启,心里就觉得不舒服
RedisMasterNode
340 天前
感觉不是语言的问题。不太理解,这些东西不是在 README 里面写好就行了吗?

https://images2.imgbox.com/91/09/qF1P6Xv1_o.png

这是自己写的古老的新人项目,入职第一周做的,要怎么运行写好就是了,python 也是一样的。

所以骂 python 没用,python 也有一样轻轻松松启动的项目,要怪就怪你这个同事。我运行 java 项目也摸索了很久不知道要怎么启动,c++ 也是各种依赖问题,说白了就是还菜(没有贬义,每个人都有新学东西的时候),还没入门,接手了不熟悉的语言就要运行要调试了,心态放好点都不至于这样。
chenqh
340 天前
因为 python 有 gil,所以 djanog runserver 就可以了啊,gunicorn 用进程模型的话,就相当于 master 负责起多个进程
chenqh
340 天前
python 像 tornado 想要利用多核,就是 supervisor 起多个进程,模型更简单粗暴
wizardyhnr
340 天前
uwsgi+nginx+django 部署本来就是配置多个服务,这种多进程通信 debug 就很难了。楼主还选 docker 容器,docker 推荐一个容器一个服务,一个容器部署多个服务可能很多坑。楼主属于踩坑体质吧?
msg7086
340 天前
下次你试试看部署一下那种 2000 年前后写的带汇编的 C 项目到现代的平台。才折腾一天叫什么复杂。
光是把内嵌的 MMX 和 3dnow!汇编全部重写成 SSE/AVX 就得花掉你几星期(笑)
biaodianfu
340 天前
Django 没接触,不知道怎么部署还情有可原,Linux 命令也不熟悉,才得意自己的聪明才智,即使不知道使用 supervisor 守护进程,也应该知道使用 nohup 命令让程序不挂起。
wenrouxiaozhu
340 天前
@sadfQED2 用 Gunicon 吧👀...觉得“runserver 监听代码变化,随时重启,心里就觉得不舒服” ,可以后面加一个--noreload 😂
elboble
340 天前
是略烦,反正 supervisor+uwsgi+nginx+django ,搞过一次就行了,路径什么的,的确文档说的不清楚,每次都是对着原来的例子改的。
dayeye2006199
340 天前
chatgpt 糊个 dockerfile 很快的

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

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

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

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

© 2021 V2EX