如何在生产中启动 Node.js 服务器?
本文最初于一天前发布于https://maximorlov.com/start-node-js-in-production/
你已经构建了一个 Node.js 应用,现在可以正式发布了。这意味着你需要将它部署到生产环境中。
如何在生产环境中正确启动 Node.js 应用程序?最佳实践是什么?它与开发环境有何不同?
不要让这些问题阻碍你。
如果您知道您的应用程序始终处于正常运行状态,并且可以放心地进行部署,那会怎样?
了解为什么流程管理器是生产环境中不可或缺的工具,以及哪三种是最受欢迎的工具。
但首先,让我们讨论一下在前台和后台启动应用程序以及崩溃时会发生什么。
前台进程与后台进程
在开发过程中,你可能会通过打开终端并输入node index.js
(或任何作为应用程序起点的文件)来启动 Node.js 服务器。如果此命令位于 package.json 文件中,则可以使用 通过 NPM 运行它npm start
。
当你按下 CTRL+C 或关闭终端时,应用程序也会退出。这通常是我们在开发过程中想要的,但在生产环境中却并非如此。
在生产环境中,应用程序应该在我们的终端或 SSH 连接的生命周期之外继续运行。
当您在本地运行某个应用程序时,它会以前台进程的形式启动。在前台,您的键盘输入会被定向到该进程。因此,当您按下 CTRL+C 时,它会发送SIGINT
信号并停止该应用程序。我们想要的是在后台启动该应用程序。
要在后台启动应用程序,只需&
在命令末尾附加即可。使用之前的示例,node index.js &
将在后台启动您的 Node.js 服务器,即使您关闭了与生产服务器的终端或 SSH 连接,该服务器仍将保持运行。
当你的应用程序崩溃时会发生什么?
在生产环境中,应用程序难免会因为各种原因崩溃——内存泄漏、未捕获的 Promise 拒绝或无限循环。现在你的应用程序已经独立运行,如果它崩溃或停止响应,会发生什么?
为了解决这个问题,我们需要另一个进程来管理我们的应用程序,并负责在这种情况下重新启动它。这正是进程管理器的作用。
进程管理器会将您的应用程序作为后台进程启动,并在应用程序崩溃时重新启动它。如果您需要,它还可以在系统启动时自动启动您的应用程序。
保持应用程序处于活动状态是流程管理器迄今为止最重要的功能。
Node.js 开发者最常用的三个进程管理器是 PM2、Docker 和 Systemd。根据你的情况和目的,选择其中一种可能更合适。这三个工具在生产环境中被许多应用程序使用,选择其中任何一个都不会出错。
Node.js 应用程序的进程管理器
PM2
PM2 是 Node.js 社区中最受欢迎的进程管理器。PM2 的代码库用 JavaScript 编写,专为 Node.js 应用程序设计。它拥有美观的用户界面,并提供开箱即用的集群模式和负载均衡功能。后者可以通过使用多个 CPU 核心轻松扩展 Node.js。
要开始使用 PM2,我建议遵循其快速入门指南。当你想学习如何使用新的库或工具时,官方文档始终是一个不错的起点。
当我部署不在容器中的应用程序时,PM2 是我的首选进程管理器。它易于使用,让我可以专注于应用程序开发。
Docker
如果您使用 Docker 来容器化和部署应用程序,则可以使用其内置的进程管理功能。使用 Docker CLI,您可以将容器配置为在应用程序崩溃时自动重启。
你也可以在 Dockerfile 中定义一个HEALTHCHECK
。Docker 将使用它来判断你的应用程序是否健康。当你的应用程序可以运行,但由于陷入无限循环而无法处理新请求时,健康检查非常有用。
当我使用 Docker 部署 Node.js 应用程序时,我不会使用 PM2,因为它的大部分优点都被 Docker 取代了。
系统
每个操作系统都自带一个默认的进程管理器。对于大多数流行的 Linux 发行版来说,这个默认进程管理器就是 systemd。
您可以将 systemd 视为主进程管理器。如果您使用的是进程管理器(例如 PM2 或 Docker),它们本身也由 systemd 管理。Systemd 是 Linux 内核在系统启动时启动的第一个进程,它负责启动所有其他进程。
如果您不熟悉系统管理,学习 Systemd 可能会有点困难。不过,使用 systemd 是学习 DevOps 和更熟练使用 Linux 的好方法。这篇虽然老文章,但仍然值得学习,它向您展示了如何在 Node.js 中使用 systemd。
结论
我们已经讨论了在前台运行进程和在后台运行进程的区别。在生产环境中,我们希望应用程序在关闭终端后仍然能够继续运行,因此我们将它们设置为在后台运行。
应用程序不可避免地会崩溃,进程管理器会确保在崩溃时重新启动它们。它们会保持应用程序的正常运行,并能够在系统启动时自动启动应用程序。
PM2 是 Node.js 社区中最常用的进程管理器,而且易于使用。如果您的应用程序位于容器中,Docker 内置了进程管理功能。如果您想学习 DevOps 并希望更熟练地使用 Linux,那么使用 systemd 是一个不错的选择。
除了自动重启之外,运行生产环境的 Node.js 应用还有很多其他功能——你还需要添加有用的日志,并设置监控和警报等。你无需在部署应用之前学习这些内容。
让您的应用程序上线,向世界展示您所构建的内容,然后再考虑其余的事情。
祝您发货顺利!🚀
编写简洁的代码,保持领先地位。
每隔一周的星期二,我都会分享一些关于如何构建强大的 Node.js 应用程序的技巧。加入一个致力于职业发展的开发者社区,获取成功所需的知识和技能。
文章来源:https://dev.to/maximization/how-do-you-start-a-node-js-server-in-Production-1cbf