什么是 PM2?
PM2 是一款针对 Node.js 应用程序的进程管理工具,可以以守护进程的方式启动、停止、重启、监视和管理应用程序的运行状态,还支持日志记录、负载均衡、自动重载等高级功能。PM2 不仅提供命令行操作界面,还可通过 Web 界面和 API 进行远程管理。
为什么需要远程启动 Node.js 应用程序?
在生产环境中,为了保障业务的高可用性和性能稳定性,我们往往需要将 Node.js 应用程序部署到多台服务器上,并通过负载均衡器将请求分发到各个实例之间。此时,如果手动在每个服务器上启动应用程序,工作量巨大,且容易出错,需要一种自动化的解决方案,而 PM2 正是这样一种好的选择。
如何远程启动 Node.js 应用程序?
假设现在有两台服务器 A 和 B,我们要在这两台服务器上部署同一个 Node.js 应用程序,以下是具体的操作步骤:
在服务器 A 上安装 PM2,创建一个应用程序,并在应用程序目录下创建一个名为
ecosystem.config.js的配置文件,定义应用程序的启动方式和参数,示例如下:// www.javascriptcn.com code example module.exports = { apps: [ { name: "myapp", script: "app.js", watch: true, env: { NODE_ENV: "development", PORT: 3000 }, env_production: { NODE_ENV: "production", PORT: 80 } } ], deploy: { production: { user: "ubuntu", host: "10.0.0.1", ref: "origin/master", repo: "git@github.com:user/repo.git", path: "/var/www/production", "post-deploy": "npm install && pm2 reload ecosystem.config.js --env production" }, staging: { user: "ubuntu", host: "10.0.0.2", ref: "origin/master", repo: "git@github.com:user/repo.git", path: "/var/www/staging", "post-deploy": "npm install && pm2 reload ecosystem.config.js --env staging", env: { NODE_ENV: "staging" } } } };上述配置文件中,
apps数组包含了一个名为myapp的应用程序,定义了应用程序的启动脚本app.js,以及在不同环境下的环境变量和端口号。deploy对象则定义了部署到不同服务器上的路径、分支、仓库地址等信息。在服务器 A 上启动应用程序,使用命令
pm2 start ecosystem.config.js,此时应用程序会以异步非阻塞的方式启动在后台,并自动写入 PM2 的进程管理列表中。在服务器 B 上安装 PM2,然后使用命令
pm2 deploy ecosystem.config.js production setup,将部署配置同步到服务器 B 上。在服务器 B 上部署应用程序,使用命令
pm2 deploy ecosystem.config.js production,此时 PM2 会在服务器 B 上自动拉取代码、安装依赖、启动应用程序,并将应用程序的运行状态同步到服务器 A 上的 PM2 进程管理列表中。现在应用程序已经在服务器 A 和 B 上成功启动,可以通过 PM2 日志、监控界面或 API 进行实时监视和管理。
注意事项
在使用 PM2 远程部署应用程序时,需要确保各个服务器之间的 SSH 公钥和私钥都已经配置好,且免登录。具体操作可以参考 SSH 远程登录与文件传输 相关文章。
在定义应用程序的启动脚本时,需要确保可以正确地从应用程序所在的目录相对路径或绝对路径中找到启动脚本。如果使用相对路径,需要特别注意在部署到不同服务器上时,相对路径是否正确。
在部署应用程序时,需要确保各个服务器的环境变量和依赖包版本都是一致的,否则可能会出现运行时异常。可以使用 PM2 的
pre-setup和post-setup钩子函数以及pre-deploy和post-deploy钩子函数进行环境准备和应用程序部署之前后的一些操作。在使用 PM2 部署应用程序之前,需要确保 Git 仓库中的代码是最新的,且已经成功地通过本地测试,并对应于指定的环境。
在使用 PM2 远程重载应用程序时,如果应用程序的代码存在改动,但没有执行
npm install或其他相关命令,可能会导致运行时错误。此时可以在部署文件中增加相应的命令,如npm install,npm run build等。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cfe65be46428fe9ec2bb2e