美文网首页
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