这些后台启动姿势错过可亏大了

举报
雷学委 发表于 2022/02/07 22:56:16 2022/02/07
【摘要】 这些后台启动姿势错过可亏大了我们做好一些web 应用,不管是NodeJS, Python还是Java最终部署到线上,都是要后台让它一直运行。好,下面来看看目前常见的一些应用启动方式。 第一种 nohup 启动脚本 &这种启动是非常常见的,像Java, Python程序也都是打包好,写一个脚本里面启动的 。所以这个有必要掌握。这个启动的关键是最后面的&符号,它告诉操作系统把这个程序的进程后台...

这些后台启动姿势错过可亏大了

我们做好一些web 应用,不管是NodeJS, Python还是Java最终部署到线上,都是要后台让它一直运行。

好,下面来看看目前常见的一些应用启动方式。

第一种 nohup 启动脚本 &

这种启动是非常常见的,像Java, Python程序也都是打包好,写一个脚本里面启动的 。所以这个有必要掌握。

这个启动的关键是最后面的&符号,它告诉操作系统把这个程序的进程后台挂起。
前面的nohup就会把启动stdout日志输出到nohup.out文件内。
通常会编写一个启动脚本:

#server.js为node服务入口, 把标准输出和错误输出流都输出到server.log日志中。
 nohup node app.js > server.log 2>&1 & 

拿我之前的文章 Promise你把握不住-KOA写接口查库的示例代码

在这里插入图片描述

在这里插入图片描述
Mac通过ps命令可以查到这种后台启动的进程,window可以用tasklist,读者可以自行尝试。

不过这个有个问题,如果我还有另一个NodeJs应用入口程序也是app.js,那么使用ps -ef查看进程的时候,不容易区别是哪个程序了, 就像下面的程序效果一样。
在这里插入图片描述
这种是最直观最常用的。

第二种 Docker容器后台启动

这种方式就是把应用使用docker build构建docker 镜像,使用容器后台启动的方式。

FROM node:12

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
COPY package*.json ./

RUN npm install

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "bin/bash", "run.sh" ]

然后使用docker build构建完之后,运行docker -d

#构建镜像
docker build . -t levin/node-web-app
#把镜像装载到docker容器进程后台运行(-d)
docker run -p 58080:8080 -d levin/node-web-app

我们看看效果吧。
在这里插入图片描述

安装参考: https://blog.csdn.net/geeklevin/article/details/112723331

使用:

docker ps
docker logs imageID
docker inspect imageID

这种方式还是挺好的,后台启动还提供了命令查看进程的状态,日志,以及inspect进程内的子系统信息和网络等细节。

如果结合prometheus+Grafana可以制作很精美的监控台。

第三种方式,pm2的方式启动

这种是nodejs挺常见的。主要是把程序委托给pm2(nodejs版的进程管理工具)管理。

安装和使用

npm install -g pm2

#使用
pm2 start app.js
pm2 ls 
pm2 log app
pm2 monit app

官网: https://pm2.keymetrics.io/

看下图,左边为pm2的运行效果,右边为使用pm2启动命令。

可以看到pm2能够对应用进程查看,还可以查看应用日志等。
在这里插入图片描述
甚至能够实时查看程序内存响应情况等, 运行pm2 monitor app(实时监控所以名字是app的应用),效果如下:
在这里插入图片描述
可以看到,pm2来启动nodejs应用几乎无需配置!
当然它也能配置支持其他语言的程序管理。

第四种 supervisor

这种方式在Python应用中很多见,但是它不止支持python应用程序。

安装

pip install supervisor

supervisord -c supervisor.conf

这个配置起来比较复杂,如下:

[supervisord]
nodaemon=true

[supervisorctl]

[program:demo]
directory=/user/mac/nodejs-all/nodejs-api-002-crud
command=/usr/local/bin/node app.js

autostart=true
autorestart=false
startsecs=1

user = mac

stderr_logfile=/tmp/demo_stderr.log 
stdout_logfile=/tmp/demo_stdout.log 
redirect_stderr = true
stdout_logfile_maxbytes = 10MB
stdout_logfile_backups = 5 

在这里插入图片描述
我们看到这个比第一种好了很多,但是多了这个配置文件,新手需要了解学习这个配置,supervisor在python开发的应用很广泛。博主看过多个数据科学的组件背后都使用了这个来进行进程管理。

在这里插入图片描述

更多信息查看:http://supervisord.org

还有更早的systemctl或者window添加服务,然后进行管理的,这里也不多展示了,更supervisord某种程度类似,需要一个conf来定义程序的元信息。

总结

本文只是展示了博主接触过的一些应用启动方式(本质上是一些进程管理工具代理,当然还有其他的应用程序管理),选择上面四种算是比较典型的做法。

相比而言,docker跟pm2更加容易使用。

个人强烈推荐docker,它除了进程管理,更多是提供一个独立的隔离环境,每个应用都打包成精致的系统镜像,只要对方装了docker就能一个应用随处执行。

第一种就简单直观,但是少了很多运维方面的辅助,很适合开发新手慢慢适应使用。
第二种docker需要服务器安装docker,不过装了docker之后,在大型微服务平台容器化管理非常便利。
第三种pm2进程管理,对于NodeJS开发者或者大部分前端开发者来说都是比其他三种更容易上手的。
第四种,如果你是python比较熟悉,也挺推荐的。

其他可能还有类似的进程管理工具,本篇旨在分享几种经典的进程管理工具和比较它们在运维和使用上的感受。

读者也可以自己试着开发一个进程管理工具,但是可以借鉴经典的实现,做一个简单,易学又符合时代需求的工具。

参考链接

https://blog.csdn.net/geeklevin/article/details/117308989
https://blog.csdn.net/geeklevin/article/details/112723331
https://nodejs.org/zh-cn/docs/guides/nodejs-docker-webapp/
http://supervisord.org/
https://www.docker.com/

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。