美文网首页
Nuxt + Typescript最佳实践6:使用pm2运行nu

Nuxt + Typescript最佳实践6:使用pm2运行nu

作者: kruz | 来源:发表于2020-05-25 23:19 被阅读0次

nuxtjs是nodejs服务器渲染项目,部署在linux服务器才能最好的发挥它的作用,这里介绍下如何用pm2发布。

我们直接使用npm run start这种方式运行的时候占用了窗口进程,也不行进行别的交互了,如果按住了Ctrl + C 就退出了nodejs服务, 当然也可以用nohup直接让他在后台运行,不过这个都不如pm2方便。pm2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。

步骤

首先你需要执行build打包, 不管你是客户端打包还是服务器打包。
一般是:

yarn build  #最终执行的是 nuxt build

编译后多出了一个 .nuxt文件夹,是编译后的文件

+--components
+--dist 
+--mixins
+--views
+-- App.js
// +-- 等等

记住这个文件夹很重要就完了。

编译完成之后,服务端运行:

yarn start  #实际上执行: node server/index.js

实际上编译完成之后,服务端运行只需要下面几个文件夹了,如果创建docker只需要这几个文件夹的内容即可。

.nuxt   #编译后的vue代码,路由等
node_modules  #依赖
server   #服务端入口
static    #静态资源目录
nuxt.config.js #配置
package.json #命令所在配置

当然我们不能直接执行,要用pm2来执行。
就一句话

pm2 start  npm --name '项目名' -- run start --watch

运行并自动重启。

看看pm2的命令, 额,真的是多,不过常用的就几个:

  • 最简单的启用一个应用: pm2 start app.js
  • 停止:pm2 stop app_name|app_id
  • 删除:pm2 delete app_name|app_id
  • 重启:pm2 restart app_name|app_id
  • 停止所有:pm2 stop all
  • 查看所有的进程:pm2 list
  • 查看所有的进程状态:pm2 status
  • 查看某一个进程的信息:pm2 describe app_name|app_id

参数说明

  • --watch:监听应用目录源码的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件
  • -i --instances:启用多少个实例,可用于负载均衡。如果-i 0或者-i max,则根据当前机器核数确定实例数目,可以弥补node.js缺陷
  • --ignore-watch:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules "some scripts"
  • -n --name:应用的名称。查看应用信息的时候可以用到
  • -o --output <path>:标准输出日志文件的路径,有默认路径
  • -e --error <path>:错误输出日志文件的路径,有默认路径
  • --interpreter <interpreter>:the interpreter pm2 should use for executing app (bash, python...)。比如你用的coffee script来编写应用

所以我们为了方便标记我们需要给项目一个名字,然后项目可以自动重启。所以只需要这样写既可。

pm2 start  npm --name '项目名' -- run start --watch

为了配合自动发布,脚本可以联合起来写


cd /data/mydemo #进入项目目录
git checkout .  #丢弃修改
git checkout master   #切换到分支
git pull  #拉取最新代码
yarn  && yarn project1-build  #更新,执行编译
#检查是不是已经启动过,启动过就重新启动, 没启动就启动
# 获取他的pid,如果存在就是一个正整数, 判断它存在就可以重启了
pm2 pid mydemo
if [[ `echo $?` =~ ^-?[0-9]+$  ]]; then
    pm2 restart mydemo 
    exit
fi
pm2 start npm --name mydemo -- run start --watch

如何平滑更新?

上面的发布方式,pm2重启可以做到用户无感知,但是重启之前有个编译的过程,编译的时候会删掉dist文件夹,这样就可能导致一些文件路径失效,导致网站无法的可能性。

1.编译到新目录,一次重启

每次编译文件到新文件夹,编译完成后修改pm2的启动路径,这样重启不会导致长时间不能服务状态。

2.nginx负载均衡

如果是部署在多台服务器,利用负载均衡,一台服务器停止nodejs服务后,重新编译启动。也可以达到目录。
参考 不停机更新:基于 PM2

相关文章

网友评论

      本文标题:Nuxt + Typescript最佳实践6:使用pm2运行nu

      本文链接:https://www.haomeiwen.com/subject/gotpahtx.html