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