Python web 部署,使用 systemd 还是 supervisor?
最近要部署一个 flask 项目,打算采用 gevent+ gunicorn +systemd 的方式,但是网上的资料大都为 supervisor,我尝试了下比较繁琐,各位有什么建议吗
Python web 部署,使用 systemd 还是 supervisor?
我用的 supervisor 其实还蛮简单的 不过说起来 python web 部署起来还是太麻烦啊
这个问题问得好,选哪个主要看你的应用场景和需求。
简单说,如果你的服务需要在系统启动时就运行,并且需要集成到Linux的服务管理生态里(比如用systemctl start/stop),那就用systemd。它是现代Linux发行版的标准,管理开机自启、日志收集(journald)都很方便,配置文件也相对简洁。
如果你的应用环境比较独立,或者你需要同时管理多个进程(比如一个Web服务加一个后台队列worker),用supervisor会更顺手。它纯粹是个进程管理器,不依赖系统初始化,配置更专注于进程本身的重启策略、日志输出。
我个人的习惯是:对需要以系统服务形式长期运行的核心Web服务(比如用Gunicorn跑的Django/Flask),用systemd。对开发环境、或者那些需要频繁启停、重启策略复杂的辅助进程,用supervisor。
一句话建议:系统级服务用systemd,应用级进程管理用supervisor。
tornado 这种自带 HTTP server 的就简单了
docker
有条件还是上 docker 吧。次好的选择是 systemd,毕竟是未来的方向,supervisord 只是一个过渡时期的替代品
如果日志是打算在本机查看的话,systemd 可以用 journalctl 看,要比直接打开文本文件可玩的花样多
日志打算有使用 elk 全家桶做处理
我觉得虚拟环境目前足够我使用了
但是百度 systemd 的教程比较少…清一色 supervisord,我也是用 supervisord 碰到了困难才找到 systemd 的方案的
另外,你的意思是使用 docker 的话就不需要使用守护进程了?那开机自启动和程序挂掉重启动怎么做的…我看看去
docker 的话就不需要使用守护进程了?那开机自启动和程序挂掉重启动怎么做的…
应该由你的容器集群管理方案决定,比如 k8s
docker run --restart=always foobar。systemd 教程比较新基本都是英文,用 Google 搜吧
docker 启动是把程序挂到前台的,程序死了 k8s 会自动重启新的
python 防止被反编译, 如何处理?
systemd 一个配置文件搞定。supervisor 为什么还不被淘汰😂
systemd 无法在 docker 中使用,除非 privileged=true
Docker 跑服务并且配置日志驱动为 glef,地址为 ELK stack 里 logstash 地址,可以很大程度解决你的需求。
我用 supervisor
supervisor 还好吧,简单,更何况 systemd 那么多 service,你不会担心找不到自己的进程 service 吗
systemd 配置写起来太复杂
docker 吧,不然每次每台机器都需要部署底层环境太麻烦了
百度 systemd 资料少,你就不用了?那百度哪天如果坏了,你是不是还不干活了?
选 docker,如果除了“有条件”之外没有别的理由,那基本上都意味着是错误选择
说的底层环境是选用 docker 的一个理由。不过其实只是把以前用 rpm/deb 表达的依赖关系,改由 docker 表达了而已,而且还不是描述式而是执行式的表达。dockerfile 里有些东西并不能保证每次都执行成功,尤其是和网络等外部环境相关的,所以其实并不是一个表达依赖关系和构建基础的好的方式
所以才要一套的 CI/CD 来做,Dockerfile 当然是要本地测试过没问题才能放进 CI 的步骤里面,如果有其他的错误,由 CI 解决网络等 docker build 出现的问题( retry ),而且打包成镜像的好处是,可以同时存在多个版本,可以来做蓝绿发布,出问题了只需要把 docker 删掉就好了
不用 uwsgi 吗?
也不是这个意思…我是搜了两个关键字,supervisor 显示的信息更多点,我觉得会不会是业界主流的部署方案…
这个没用…
资料多,是否主流,这个想法倒是挺自然的。
业界一直不太流行把“自研软件”放在“系统管辖( systemd、sysvinit 等)”之下
当然是 systemd,系统级支持
systemd 用的很爽
来一打 systemd 全家桶
docker 里面没有什么理由用 systemd 吧。本身 docker 设计来就是跑单个进程的。
#35 理论上是这样的,但是实际上也经常会用多个进程,比如 Nginx + web server + 队列之类的
这种情况请使用 docker-compose 编排多个容器,设置 restart: always。这样可以把比如队列挂了需要重启这种情况交给 docker daemon 去处理。
#37 道理我都懂,可实际我用 supervisor + 多个进程在一个容器中用的更爽
想都不用想 直接使用 docker
用 docker 就好了
用 docker 的话是否必须能连外网,或者另外增加一台用来做 register 的 server ?

