使用pm2实现nuxt.js的平滑重启

环境依赖

  • nuxt.js
  • pm2
  • nginx
  • linux

原理

使用pm2来管理nuxt,启动两个不同端口的项目,再利用nginx切换反代端口
具体流程

  • 修改对应的项目文件
  • 修改nuxt.config.js代理的端口号(在配置项中写port,就可以修改端口号,不需要用官网上说的那套)
  • 编译项目
  • 由pm2启动新的进程
  • 切换nginx代理的端口号
  • pm2关闭旧进程

以上操作如果全由人工操作,相当的繁琐,因此我写了一个自启脚本

代码如下

# 初始化变量
#
 oldPort=3000
 newPort=3001
#
 cd /usr/diy/project/node/school/
#
# # 判断需要使用的端口
 result=$(grep "3001" nuxt.config.js)
 if [ -n "$result" ]; then
#       找到3001端口
        oldPort=3001
        newPort=3000
        fi

#               # 修改端口号
        echo "原node端口号为:$oldPort,修改为$newPort"
        sed -i "s/$oldPort/$newPort/g" nuxt.config.js
#
#               # 重新编译项目
        echo "正在编译项目..."
        result=$(npm run build)
#               # echo "$result"
#               echo "------"
#               #result=$(grep "ERR" "$result")
#               #echo "$result"
#       if [ -n "$result"]; then
        if [[ $result =~ "ERR" ]]; then
#               # 编译失败
                echo "--$result编译错误,请手动编译查看错误"
#
        else
#                               # app name
                name="school-$newPort"
        # 判断是否使用该端口启动pm2
        result=$(pm2 list | grep "$name")
        if [ -z "$result" ]; then
                echo "初次启用pm2,app name:$name"
                # 没有使用过该端口
                pm2 -n $name start ./node_modules/nuxt/bin/nuxt -- start
        else
                echo "重启pm2,app name:$name"
                # 使用过该端口
                pm2 start $name
        fi
        echo "更换nginx代理端口,原端口:$oldPort,修改为:$newPort"
        sed -i "s/$oldPort/$newPort/g" /usr/diy/runtime/nginx/conf/vue.conf
        echo "重启nginx"
        nginx -s reload
        echo "停止旧pm2 app name:school-$oldPort"
        pm2 stop "school-$oldPort"

fi
#
#

目前使用3001和3000端口来回切换
其中pm2启动命令为pm2 -n name start ./node_modules/nuxt/bin/nuxt – start

你可能感兴趣的:(nginx)