我们在将自己编写的node项目经常会遇到项目因为遇到错误关闭的情况,而该文章将为大家提供node项目遇到异常停止后,如何实现自动重启的功能。摆脱每次都要手动重启的尴尬。
当然了,在实际操作中,可能还有遇到各种问题,我会在文章的末尾为大家解决一些问题。
全局安装 pm2:
npm install pm2 -g
检查全局 npm 模块路径,运行以下命令以查看全局 npm 模块的安装位置:
npm root -g
手动配置环境变量:
使用以下命令检查 `pm2` 的全局安装路径:
which pm2
如果 `pm2` 的全局安装路径不在系统的环境变量中,需要手动配置。打开终端配置文件(通常是 `~/.bashrc` 或 `~/.bash_profile`),然后添加以下行:
export PATH=$PATH:/usr/local/bin
或将路径 `/usr/local/bin` 替换为 `pm2` 的实际全局安装路径。
比如下面是我的实际全局安装路径:
export PATH=$PATH:/www/server/nodejs/v14.17.6/lib/node_modules/pm2/bin
接下来,我们修改一下环境变量
打开终端配置文件(在服务器根目录下运行):
使用以下命令打开终端配置文件(通常是 `~/.bashrc` 或 `~/.bash_profile`):
vi ~/.bashrc
或
vi ~/.bash_profile
添加 pm2 的路径:在文件的末尾添加以下行:
export PATH=$PATH:/www/server/nodejs/v14.17.6/lib/node_modules/pm2/bin
保存和退出:
按 `Esc` 键,然后输入 `:wq`,并按回车键保存并退出 vi 编辑器。
重新加载环境变量:
使用以下命令重新加载环境变量:
source ~/.bashrc
或
source ~/.bash_profile
验证 pm2 安装:
再次尝试运行以下命令来验证 `pm2` 是否已成功安装:
pm2 --version
如果成功安装,你会看到 `pm2` 的版本号。
接下来,我们就要进入正题了。
要在宝塔面板中创建的 Node.js 项目保持自动重启,我们需要通过一些工具或脚本来实现。一种常见的方法是使用 `pm2` 这样的进程管理工具:
安装 pm2:
宝塔面板中使用终端输入以下命令安装 `pm2`(前面操作过,这步可以省略)
npm install pm2 -g
启动应用程序:
在项目目录下,使用 `pm2` 启动应用程序(重启就将start换成restart),例如:
pm2 start npm -- start
保存当前 `pm2` 进程列表:
这将确保在服务器重新启动后 `pm2` 进程仍然运行。您可以使用以下命令保存当前的 `pm2` 进程列表:
pm2 save
生成启动脚本:
为了使 `pm2` 在服务器重新启动时自动加载,您可以生成一个启动脚本。可以通过以下命令生成脚本:
pm2 startup
现在,当服务器重新启动时,`pm2` 会自动加载并启动 Node.js 应用程序。 通过这些步骤,Node.js 应用程序应该能够在遇到异常停止后自动重启。
最后需要注意的是,如果将来更新或重新安装了 Node.js 版本,`npm` 的全局路径可能会更改。在这种情况下,你需要相应地更新 `pm2` 的路径。确保将上述步骤中的路径 `/www/server/nodejs/v14.17.6` 替换为自己的实际 Node.js 版本的路径。
可能遇到的问题:
问题1:宝塔环境使用 npm,使用什么命令都提示:npm WARN config init.module Use `--init-module` instead。
打开:/www/server/nodejs/[node 版本]/etc/npmrc
例如:/www/server/nodejs/v16.18.0/etc/npmrc 将 init.module 修改为 --init-module
如:
prefix = /www/server/nodejs/v16.18.0/
registry = https://registry.npm.taobao.org/
cache = /www/server/nodejs/cache/
--init-module = /www/server/nodejs/v16.18.0/etc/init-module.js
问题2: 宝塔部署多个nodejs项目时,如何让其他端口也能实现自动重启?
我们在用上面的方式安装pm2后,默认是自动重启端口为3000的项目,那么其他端口的项目就不能实现自动重启,解决方案也很简单:
启动每个项目,并指定不同的端口。例如,如果你有两个项目,分别监听3000和5000端口,你可以使用以下命令:
pm2 start app1.js --name "app1-3000" -i max
pm2 start app2.js --name "app2-5000" -i max
这里app1.js
和app2.js
是你的应用入口文件,--name
参数给每个应用指定一个名字,-i max
表示启动CPU核心数量的实例。
如果你需要删除指定ID的应用程序,可以使用PM2提供的命令行工具。以下是删除指定ID应用程序的命令:
pm2 delete <id>
这里的<id>
是你想要删除的应用程序的PM2进程ID。
例如,如果你的应用程序ID是1
,你可以运行:
pm2 delete 1
这将停止ID为1的应用程序,并从PM2列表中删除它。如果你想删除多个指定ID的应用程序,可以将它们的ID用空格隔开,例如:
pm2 delete 1 2 3
这将删除ID为1、2和3的应用程序。