当我们部署 Node.js 服务时,经常会遇到不可避免的问题:项目突然挂掉、响应变慢或者停止响应。这时候常常需要我们手动重启服务。而 PM2(Process Manager 2)是一个开源的 Node.js 服务管理器,可以帮助我们轻松部署和管理应用程序,从而极大地提高生产力。但是,在使用 PM2 进行部署时,有时候会出现项目重启后未响应的情况。本文将讲解如何避免这种情况的发生。
PM2 简介
PM2 是一个管理 Node.js 应用程序的工具,可以自动进行负载均衡、启动进程、监控并将应用程序崩溃自动重启等。使用 PM2 部署 Node.js 项目非常方便,只需要在终端输入以下命令即可:
pm2 start app.js
然后 PM2 将会启动一个 clsuter 模式的 Node.js 进程,并在后台保持运行。有关 PM2 更多的使用情况,可以参考 PM2 官方文档。
问题与原因
然而,在使用 PM2 部署应用程序时,可能会出现这样的情况:应用程序重启后,几分钟内一直未响应。这是由于 PM2 默认同时启动了多个 Node.js 进程,并自动进行负载均衡。当某一个进程崩溃时,PM2 会将请求转发给另外一个进程,从而保证服务的可用性。但是,当全部 Node.js 进程都崩溃以后,PM2 会经历一段时间的短暂停顿,但之后会立即重启全部进程。此时,如果你的应用程序有连接数据库或者其他第三方接口,所有连接会被关闭。当 PM2 重启到进程之后,这些连接需要重新建立。这个时候,如果第三方接口重新启动较慢,就会出现请求一直阻塞的情况,直到连接重新建立完成。
解决方案
为了避免应用程序重新启动后未响应,我们可以通过配置 PM2 的参数来解决这个问题。我们可以使用 pm2 start
命令添加一些参数来达到目的。
pm2 start app.js --wait-ready --listen-timeout 3000
--wait-ready
命令参数将阻止 PM2 在启动应用程序之前完成进程的加载。它会等到应用程序发送一个事件(可以通过pm2.sendSignal()
API 触发),和访问测试 URL (必须指定测试 URL) 响应 200。这个时候再将流量导入对应监听端口。--listen-timeout
命令参数设置一个 PM2 进程的startTimeout
选项,保证了当 PM2 重启进程时,最多只有--listen-timeout
这么多秒被阻塞。
这些参数将在应用程序重新启动之前进行连接测试和确认所有进程都已启动,避免了在应用程序重启后未响应的情况发生。
示例代码
为了使用示例,我们需要先安装 express
应用程序并引入 pm2
模块,这个模块将允许我们手动发送进程信号给 PM2 进程。
安装:
npm install express pm2
触发事件:
-- -------------------- ---- ------- ----- --- - --------------- -- ---- ------ -- ----- --------- -------------- -- - ----------------------- -- ----- -- - -- ------- - ------------------ ---- ------- -- ------ --------------- ---------------- - ------------------- ------------ ---- -- ------- ----------------- --- ---
设置路由:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- ------- --- --- ------ ------------------ ----- ---- -- -------------------------------- -- ----- --------- ----- ------ - ---------------- -- -- - ------------------- ------- -- ------------------ - ----------------------- ---
最后,我们可以在控制台下使用 PM2 启动进程。
pm2 start index.js --wait-ready --listen-timeout 3000
以上步骤的处理方法可以有效解决在重启服务时,出现项目未响应这一情况,大大提高了我们的应用程序的可用性。
总结
PM2 是一个非常有用的 Node.js 服务管理器,可以帮助我们轻松部署和管理应用程序,并提高生产力。在使用 PM2 部署 Node.js 项目时,出现项目重启后未响应的情况是不可避免的。但是,我们可以通过添加 --wait-ready
和 --listen-timeout
选项来解决这个问题。这些选项会在应用程序重新启动之前进行连接测试和确认所有进程都已启动,避免了在应用程序重启后未响应的情况发生。因此,对于任何需要部署 Node.js 项目的开发者来说,掌握 PM2 的使用方法是非常有必要的。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6522ab9a95b1f8cacda26975