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

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

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

fastapi 能简单一点?你别忽悠我,我部署这玩意已经恶心吐了,换一个等会我又几天搞不出来。主要是这破玩意还要 GPU ,然后走公司部署系统又必须要 Dockerfile ,在 docker 里面搞显卡驱动 cuda 啥的我已经吐了
sadfQED2
2023-12-13 15:34:24 +08:00
@tfdetang 我测试了一下,不会阻筛,两个请求是并行的
nevermoreluo
2023-12-13 16:41:02 +08:00
哈哈哈哈哈 确实挺复杂的
去年闲时捡起了很多年前 python ,随便折腾也折腾了一下午 docker+uwsgi+django
https://github.com/nevermoreluo/kitchen/blob/main/docker-compose.yml
祝你好运吧
chenqh
2023-12-13 18:06:18 +08:00
@sadfQED2 汗了,django 单进程,同步肯定阻塞啊,你不信,就去 sleep 看一下,就知道了,一般而已 python 要部署多个实例,
在 docker 之前就是用 supervisor 起多个进程, docker 时代应该是起多个实例
sadfQED2
2023-12-13 18:38:55 +08:00
@chenqh 我就是 sleep 测试的,sleep10 秒,同时发两个请求,两个都 10s 后正常返回
chenqh
2023-12-13 18:41:32 +08:00
@sadfQED2 你不会是起了多个 docker 实例吧,还是说我的理解有问题?
sadfQED2
2023-12-13 18:47:02 +08:00
@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
2023-12-13 18:59:17 +08:00
chenqh
2023-12-13 18:59:37 +08:00
@sadfQED2 我的,我用 tornado 来理解 django 了
KJR5OR04CnCiWf02
2023-12-13 20:56:00 +08:00
楼主在做什么 ai 应用?感觉是个大怨种。
XxxxD
2023-12-13 21:19:15 +08:00
uwsgi 文档感觉好久都没更新,可以 youtube 搜下搭配 Gunicorn 部署
fantathat
2023-12-13 22:16:56 +08:00
确实复杂,用 gunicorn 涉及到 wsgi, 需要导出 application?
iorilu
2023-12-14 07:40:33 +08:00
生成环境不要设折腾, 只要能跑就不要动
IurNusRay
2023-12-14 09:46:27 +08:00
你的 uwsgi.ini 文件是不是配置了 daemonize , 这种模式 uwsgi 主进程开启子进程后会退出,于是 docker 容器也会停止,改成 logto 就可以
tfdetang
2023-12-14 09:51:42 +08:00
@sadfQED2 看来 django 默认开启了多线程; 其实 docker 里不用搞显卡驱动啥的,base 镜像直接用 torch 啥的官方 gpu 版本的镜像,后面只要把 python 的部分搞定就行了
sanzrolee
2023-12-14 09:52:24 +08:00
uvicom + supervisor 嘎嘎香,再套层 docker 容器在最外层也可以。
julyclyde
2023-12-15 19:14:34 +08:00
uwsgi 难道没有“前台运行”功能吗?
干嘛用 tail 来保活?

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

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

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

https://yangjunhui.monster/t/999802

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

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

© 2021 V2EX