我们做好一些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/