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 这么恶心的还是第一次,什么乱七八糟路径,调试又没日志,找到日志又不清不楚的,没人用这玩意果然是有原因的。

3302 次点击
所在节点    Python
43 条回复
tfdetang
340 天前
@sadfQED2 ai 模型直接 runserver 会阻塞吧,并发请求还是会有问题的;
如果这种场景最好还是用 fastapi ; 可以找个 uvicorn + fastapi + docker 的模板项目改改就行了;
当然现在这样也不是不能用
sadfQED2
340 天前
@tfdetang 啊?会阻塞吗?我等会试试,现在一次推理也就十多二十毫秒,可能机器够多,负载均衡后一直没发现问题

fastapi 能简单一点?你别忽悠我,我部署这玩意已经恶心吐了,换一个等会我又几天搞不出来。主要是这破玩意还要 GPU ,然后走公司部署系统又必须要 Dockerfile ,在 docker 里面搞显卡驱动 cuda 啥的我已经吐了
sadfQED2
340 天前
@tfdetang 我测试了一下,不会阻筛,两个请求是并行的
nevermoreluo
340 天前
哈哈哈哈哈 确实挺复杂的
去年闲时捡起了很多年前 python ,随便折腾也折腾了一下午 docker+uwsgi+django
https://github.com/nevermoreluo/kitchen/blob/main/docker-compose.yml
祝你好运吧
chenqh
340 天前
@sadfQED2 汗了,django 单进程,同步肯定阻塞啊,你不信,就去 sleep 看一下,就知道了,一般而已 python 要部署多个实例,
在 docker 之前就是用 supervisor 起多个进程, docker 时代应该是起多个实例
sadfQED2
340 天前
@chenqh 我就是 sleep 测试的,sleep10 秒,同时发两个请求,两个都 10s 后正常返回
chenqh
340 天前
@sadfQED2 你不会是起了多个 docker 实例吧,还是说我的理解有问题?
sadfQED2
340 天前
@chenqh #27
```
re_path("sleep",data.sleep)

def sleep(request):
time.sleep(10)
return HttpResponse(json.dumps({
"status": 1,
}))
```

python manage.py runserver 启动

开 2 个命令行,同时 curl 127.0.0.1:8000/sleep ,两个请求都是 10s 后同时返回
chenqh
340 天前
chenqh
340 天前
@sadfQED2 我的,我用 tornado 来理解 django 了
KJR5OR04CnCiWf02
340 天前
楼主在做什么 ai 应用?感觉是个大怨种。
XxxxD
340 天前
uwsgi 文档感觉好久都没更新,可以 youtube 搜下搭配 Gunicorn 部署
fantathat
340 天前
确实复杂,用 gunicorn 涉及到 wsgi, 需要导出 application?
iorilu
339 天前
生成环境不要设折腾, 只要能跑就不要动
IurNusRay
339 天前
你的 uwsgi.ini 文件是不是配置了 daemonize , 这种模式 uwsgi 主进程开启子进程后会退出,于是 docker 容器也会停止,改成 logto 就可以
tfdetang
339 天前
@sadfQED2 看来 django 默认开启了多线程; 其实 docker 里不用搞显卡驱动啥的,base 镜像直接用 torch 啥的官方 gpu 版本的镜像,后面只要把 python 的部分搞定就行了
sanzrolee
339 天前
uvicom + supervisor 嘎嘎香,再套层 docker 容器在最外层也可以。
julyclyde
338 天前
uwsgi 难道没有“前台运行”功能吗?
干嘛用 tail 来保活?

那你用了 tail ,将来运行 docker kill 的时候,你让 tail 命令去被 kill 么?
julyclyde
338 天前
你想要的那种“只上传应用程序本身,但是不管运行机制”其实在 python 世界也是存在的
就是 google appengine 、sina appengine 、heroku 那一类

python 、nodejs 、java 比较像,都是“由该语言本身写一个服务器”来运行自己
julyclyde
338 天前
还有,如果你们的数据库是 sqlite ,将来可能扩容到多实例的时候会遇到问题

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

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

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

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

© 2021 V2EX