前言
纯干货分享,没有任何夹带私货,在历经了两天一晚上的恶心部署后,我作为一个没什么运维经验的小白,终于是搞定了这个难缠的东西。
npm run start
这是一个错误的启动方式,现在网上找到的启动步骤:pm2 start npm --name "name" -- run start
其实也是同样的启动方式。这样启动的问题是,cluster部署时,程序可以正常启动,但是我们查看PM2的日志的时候,会发现每次启动 PM2 都会打印错误日志:
2020-07-10T14:49:46: Failed at the ssr@1.0.0 start script.
2020-07-10T14:49:46: This is probably not a problem with npm. There is likely additional logging output above.
2020-07-15T19:38:23: ELIFECYCLE
2020-07-15T19:38:23: ssr@1.0.0 start: `nuxt start`
2020-07-15T19:38:23: Exit status 1
而且在下一次执行pm2 restart
或pm2 reload
的时候,大概率会重启失败,需要再执行一次重启才能启动成功。一直不理解为什么程序启动了,但是每次都有错误日志,且每次重启都失败。
正确的启动姿势
经过一顿研究,才发现,不能直接在 PM2 执行 npm 指令,正确的启动方式应该是执行npm run start
里面的指令:nuxt start
:
// package.json
"scripts": {
"start": "nuxt start"
}
而nuxt start
的执行路径就在/node_modules/nuxt/bin/nuxt.js
,所以正确的ecosystem.config.js
启动配置应该是:
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'NuxtAppName',
exec_mode: 'cluster',
instances: 'max', // Or a number of instances
script: './node_modules/nuxt/bin/nuxt.js',
args: 'start',
},
],
}
不知道为什么当初在部署的时候就是没看到这片官方指引,看了其他人的博客误导了。在启动上就踩了坑。所以入门一个东西的时候,尽可能地阅读官方文档,要帮助理解的时候再去阅读博客加深理解!
零停机部署
零停机部署就是使用 PM2 的 cluster模式,更新程序的时候用 pm2 reload [appName]
,有多个集群(cluster)的时候,PM2会先重启一部分进程,这样就不会导致服务中断,等新的进程重启成功后再重启其他进程,实现零停机(zero-downtime)部署。
但是reload
似乎在有时候会有代码更新后reload
无法更新代码的问题。但只遇到了一次,实测在更新UI的时候,直接reload是可以更新成功的,等下次遇到了再解决吧。
pm2常用命令
# 查看当前正在运行的进程
pm2 list
# 启动所有应用
pm2 start id|name|all
# 重启所有应用
pm2 restart id|name|all
# 停止所有的应用程序
pm2 stop id|name|all
# 关闭并删除所有应用
pm2 delete id|name|all
# 控制台显示所有日志
pm2 logs
# 控制台显示指定编号的日志
pm2 logs id
# 查看信息
pm2 show id|name
# 显示每个应用程序的CPU和内存占用情况
pm2 monit
- Post link: https://www.godhearing.cn/pm2-bu-shu-nuxt-xiang-mu/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.