iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > 其他 >一文聊聊Node多进程模型和项目部署
  • 504
分享到

一文聊聊Node多进程模型和项目部署

前端Node.js 2023-05-14 21:05:28 504人浏览 安东尼
摘要

使用 node 命令执行该文件,再看下原来的控制台:打印出了具体处理请求的不同子进程的进程ID。这就是通过 cluster 模块实现的 nodd.js 的多进程架构。当然,我们在部署 node.js 项目时不会这么干巴巴的写和使用 clus

使用 node 命令执行该文件,再看下原来的控制台:

Snipaste_2022-07-29_00-30-53.png

打印出了具体处理请求的不同子进程的进程ID。

这就是通过 cluster 模块实现的 nodd.js 的多进程架构

当然,我们在部署 node.js 项目时不会这么干巴巴的写和使用 cluster 模块。有一个非常好用的工具,叫做 PM2,它是一个基于 cluster 模块实现的进程管理工具。在后面的章节中会介绍它的基本用法。

小结

到此为止,我们花了一部分篇幅介绍 node.js 中多进程的知识,其实仅是想要交代下为什么需要使用 pm2 来管理 node.js 应用。本文由于篇幅有限,再加上描述不够准确/详尽,仅做简单介绍。如果是第一次接触这一块内容的朋友,可能没有太明白,也不打紧,后面会再出一篇更细节的文章。

部署实践

准备一个 express 项目

本文已经准备了一个使用 express 开发的示例程序,点此访问。

它主要实现了一个接口服务,当访问 /api/users 时,使用 mockjs 模拟了10条用户数据,返回一个用户列表。同时会开启一个定时器,来模拟报错的情况:

const express = require('express')const Mock = require('mockjs')const app = express()

app.get("/api/users", (req, res) => {
  const userList = Mock.mock({
    'userList|10': [{
      'id|+1': 1,
      'name': '@cname',
      'email': '@email'
    }]
  })
  
  setTimeout(()=> {
      throw new Error('服务器故障')
  }, 5000)

  res.status(200)
  res.JSON(userList)
})

app.listen(3000, () => {
  console.log("服务启动: 3000")
})复制代码

本地测试一下,在终端中执行命令:

node server.js复制代码

打开浏览器,访问用户列表接口:

Snipaste_2022-07-29_14-36-21.png

五秒钟后,服务器会挂掉:

Snipaste_2022-07-29_15-57-35.png

后面我们使用 pm2 来管理应用后,就可以解决这个问题。

讨论:express 项目是否需要打包

通常完成一个 Vue/React 项目后,我们都会先执行打包,再进行发布。其实前端项目要进行打包,主要是因为程序最终的运行环境是浏览器,而浏览器存在各种兼容性问题和性能问题,比如:

  • 高级语法的不支持,需要将 es6+ 编译为 ES5 语法
  • 不能识别 .vue.jsx.ts 文件,需要编译
  • 减少代码体积,节省带宽资源,提高资源加载速度
  • ......

而使用 express.js 或者 koa.js 开发的项目,并不存在这些问题。并且,Node.js 采用 CommonJS 模块化规范,有缓存的机制;同时,只有当模块在被用到时,才会被导入。如果进行打包,打包成一个文件,其实就浪费了这个优势。所以针对 node.js 项目,并不需要打包。

服务器安装 Node.js

本文以 Centos 系统为例进行演示。

NVM

为了方便切换 node 的版本,我们使用 nvm 来管理 node。

Nvm(Node Version Manager) ,就是 Node.js 的版本管理工具。通过它,可以让 node 在多个版本之间进行任意切换,避免了需要切换版本时反复的下载和安装的操作。

Nvm的官方仓库是 GitHub.com/nvm-sh/nvm。因为它的安装脚本存放在 githubusercontent 站点上,经常访问不了。所以我在 gitee 上新建了它的镜像仓库,这样就能从 gitee 上访问到它的安装脚本了。

通过 curl 命令下载安装脚本,并使用 bash 执行脚本,会自动完成 nvm 的安装工作:

# curl -o- https://gitee.com/hsyq/nvm/raw/master/install.sh | bash复制代码

当安装完成之后,我们再打开一个新的窗口,来使用 nvm :

[root@ecs-221238 ~]# nvm -v0.39.1复制代码

可以正常打印版本号,说明 nvm 已经安装成功了。

安装 Node.js

现在就可以使用 nvm 来安装和管理 node 了。

查看可用的 node 版本:

# nvm ls-remote复制代码

安装 node:

# nvm install 18.0.0复制代码

查看已经安装的 node 版本:

[root@ecs-221238 ~]# nvm list->      v18.0.0default -> 18.0.0 (-> v18.0.0)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v18.0.0) (default)
stable -> 18.0 (-> v18.0.0) (default)复制代码

选择一个版本进行使用:

# nvm use 18.0.0复制代码

需要注意的一点,在 windows 上使用 nvm 时,需要使用管理员权限执行 nvm 命令。在 CentOS 上,我默认使用 root 用户登录的,因而没有出现问题。大家在使用时遇到了未知错误,可以搜索一下解决方案,或者尝试下是否是权限导致的问题。

在安装 node 的时候,会自动安装 npm。查看 node 和 npm 的版本号:

[root@ecs-221238 ~]# node -vv18.0.0[root@ecs-221238 ~]# npm -v8.6.0复制代码

默认的 npm 镜像源是官方地址:

[root@ecs-221238 ~]# npm config get reGIStryHttps://registry.npmjs.org/复制代码

切换为国内淘宝的镜像源:

[root@ecs-221238 ~]# npm config set registry https://registry.npmmirror.com复制代码

到此为止,服务器就已经安装好 node 环境和配置好 npm 了。

项目上传到服务器

方法有很多,或者从 Github / GitLab / Gitee 仓库中下载到服务器中,或者本地通过 ftp 工具上传。步骤很简单,不再演示。

演示项目放到了 /www 目录 下:

Snipaste_2022-07-29_15-27-55.png

服务器开放端口

一般云服务器仅开放了 22 端口用于远程登录。而常用的80,443等端口并未开放。另外,我们准备好的 express 项目运行在3000端口上。所以需要先到云服务器的控制台中,找到安全组,添加几条规则,开放80和3000端口。

222.png

等等.png

使用 PM2 管理应用

在开发阶段,我们可以使用 nodemon 来做实时监听和自动重启,提高开发效率。在生产环境,就需要祭出大杀器—PM2了。

基本使用

首先全局安装 pm2:

# npm i -g pm2复制代码

执行 pm2 -v 命令查看是否安装成功:

[root@ecs-221238 ~]# pm2 -v5.2.0复制代码

切换到项目目录,先把依赖装上:

cd /www/express-demo
npm install复制代码

然后使用 pm2 命令来启动应用。

pm2 start app.js -i max// 或者pm2 start server.js -i 2复制代码

PM2 管理应用有 fork 和 cluster 两种模式。在启动应用时,通过使用 -i 参数来指定实例的个数,会自动开启 cluster 模式。此时就具备了负载均衡的能力。

-i :instance,实例的个数。可以写具体的数字,也可以配置成 max,PM2会自动检查可用的CPU的数量,然后尽可能多地启动进程。

Snipaste_2022-07-29_20-44-08.png

此时应用就启动好了。PM2 会以守护进程的形式管理应用,这个表格展示了应用运行的一些信息,比如运行状态,CPU使用率,内存使用率等。

在本地的浏览器中访问接口:

Snipaste_2022-07-29_18-00-59.png

Cluster 模式是一个多进程多实例的模型,请求进来后会分配给其中一个进程处理。正如前面我们看过的 cluster 模块的用法一样,由于 pm2 的守护,即使某个进程挂掉了,也会立刻重启该进程。

回到服务器终端,执行 pm2 logs 命令,查看下 pm2 的日志

Snipaste_2022-07-29_20-18-28.png

可见,id 为1的应用实例挂掉了,pm2 会立刻重启该实例。注意,这里的 id 是应用实例的 id,并非进程 id。

到这里,一个 express 项目的简单部署就完成了。通过使用 pm2 工具,基本能保证我们的项目可以稳定可靠的运行。

PM2 常用命令小结

这里整理了一些 pm2 工具常用的命令,可供查询参考。

# Fork模式pm2 start app.js --name app # 设定应用的名字为 app# Cluster模式# 使用负载均衡启动4个进程pm2 start app.js -i 4     

# 将使用负载均衡启动4个进程,具体取决于可用的 CPUpm2 start app.js -i 0   

# 等同于上面命令的作用pm2 start app.js -i max 

 # 给 app 扩展额外的3个进程pm2 scale app +3# 将 app 扩展或者收缩到2个进程pm2 scale app 2              # 查看应用状态# 展示所有进程的状态pm2 list  # 用原始 JSON 格式打印所有进程列表pm2 jlist# 用美化的 JSON 打印所有进程列表pm2 prettylist  # 展示特定进程的所有信息pm2 describe 0# 使用仪表盘监控所有进程pm2 monit             

# 日志管理# 实时展示所有应用的日志pm2 logs          # 实时展示 app 应用的日志 pm2 logs app# 使用json格式实时展示日志,不输出旧日志,只输出新产生的日志pm2 logs --json# 应用管理# 停止所有进程pm2 stop all# 重启所有进程pm2 restart all       

# 停止指定id的进程pm2 stop 0     

# 重启指定id的进程pm2 restart 0         

# 删除id为0进程pm2 delete 0# 删除所有的进程pm2 delete all         
复制代码

每一条命令都可以亲自尝试一下,看看效果。

这里特别展示下 monit 命令,它可以在终端中启动一个面板,实时展示应用的运行状态,通过上下箭头可以切换 pm2 管理的所有应用:

Snipaste_2022-07-29_20-25-21.png

进阶:使用 pm2 配置文件

PM2 的功能十分强大,远不止上面的这几个命令。在真实的项目部署中,可能还需要配置日志文件,watch 模式,环境变量等等。如果每次都手敲命令是十分繁琐的,所以 pm2 提供了配置文件来管理和部署应用。

可以通过以下命令来生成一份配置文件:

[root@ecs-221238 express-demo]# pm2 init simpleFile /www/express-demo/ecosystem.config.js generated复制代码

会生成一个ecosystem.config.js 文件:

module.exports = {
  apps : [{
    name   : "app1",
    script : "./app.js"
  }]
}复制代码

也可以自己创建一个配置文件,比如 app.config.js

const path = require('path')module.exports = {  // 一份配置文件可以同时管理多个 node.js 应用
  // apps 是一个数组,每一项都是一个应用的配置
  apps: [{
    // 应用名称
    name: "express-demo",

    // 应用入口文件
    script: "./server.js",

    // 启动应用的模式, 有两种:cluster和fork,默认是fork
    exec_mode: 'cluster',

    // 创建应用实例的数量
    instances: 'max',

    // 开启监听,当文件变化后自动重启应用
    watch: true,

    // 忽略掉一些目录文件的变化。
    // 由于把日志目录放到了项目路径下,一定要将其忽略,否则应用启动产生日志,pm2 监听到变化就会重启,重启又产生日志,就会进入死循环
    ignore_watch: [
      "node_modules",
      "logs"
    ],
    // 错误日志存放路径
    err_file: path.resolve(__dirname, 'logs/error.log'),

    // 打印日志存放路径
    out_file: path.resolve(__dirname, 'logs/out.log'),

    // 设置日志文件中每条日志前面的日期格式
    log_date_fORMat: "YYYY-MM-DD HH:mm:ss",
  }]
}复制代码

让 pm2 使用配置文件来管理 node 应用:

pm2 start app.config.js复制代码

现在 pm2 管理的应用,会将日志放到项目目录下(默认是放到 pm2 的安装目录下),并且能监听文件的变化,自动重启服务。

Snipaste_2022-07-29_20-46-36.png

以上就是一文聊聊Node多进程模型和项目部署的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 一文聊聊Node多进程模型和项目部署

本文链接: https://www.lsjlt.com/news/206133.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文聊聊Node多进程模型和项目部署
    使用 node 命令执行该文件,再看下原来的控制台:打印出了具体处理请求的不同子进程的进程ID。这就是通过 cluster 模块实现的 nodd.js 的多进程架构。当然,我们在部署 node.js 项目时不会这么干巴巴的写和使用 clus...
    99+
    2023-05-14
    前端 Node.js
  • Node多进程模型和项目如何部署
    这篇文章主要介绍“Node多进程模型和项目如何部署”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node多进程模型和项目如何部署”文章能帮助大家解决问题。进程 VS 线程进程进程(process)是...
    99+
    2023-07-04
  • 聊聊部署GitLab的流程和注意事项
    随着现今工程管理的快速发展,版本控制系统也越来越重要。Git是一个目前非常流行的分布式版本控制工具。GitLab则是Git的web管理界面。它是一个完整的DevOps平台,可以让团队协作更加方便,代码管理更加便捷。在本文中,我们将会介绍部署...
    99+
    2023-10-22
  • 一文聊聊Node中的fs文件模块和path路径模块(案例分析)
    fs.readFile(path, [options], callback)示例1:读取 demo.txt 文件demo.txt 文件'前端杂货铺'app.js 文件// 导入 fs 文件系统模块 const fs = re...
    99+
    2022-11-22
    node nodejs​ Node.js
  • 聊聊UniApp构建一个项目的流程和最佳实践
    最近,UniApp作为一种跨平台开发框架,备受开发者青睐,被广泛应用到了App的开发中。UniApp是由DCloud团队推出的一款基于Vue.js框架和微信小程序语法的跨平台应用开发框架,开发者可以使用它开发出同时支持Android、iOS...
    99+
    2023-05-14
  • C++项目实战-多进程(一篇文章)
    目录 目录 目录 程序和进程的基本概念 单道程序设计和多道程序设计 并行和并发 进程控制块PCB 进程常用的命令  环境变量 环境变量操作函数 进程控制 进程间通信(IPC方法) 程序和进程的基本概念 程序: 是指编译好的二进制文件...
    99+
    2023-10-21
    c++ servlet c语言 服务器
  • 一文搞懂如何部署启动多个tomcat并移植项目
    目录部署tomcat一、下载解压二、修改配置文件移植项目一、打包原项目二、复制到tomcat三、访问试试有时候我们在编写web项目时,有好几个项目需要同时运行,但直接放置war包总会...
    99+
    2024-04-02
  • 人工智能项目集合推荐(数据集 模型训练 C++和Android部署)
    人工智能项目集合推荐(数据集 模型训练 C++和Android部署) 目录 人工智能项目集合推荐(数据集 模型训练 C++和Android部署) 1.三维重建项目集合 ★双目三维重建 ★结构光三维重建 2.AI CV项目集合 ★人脸检测和人...
    99+
    2023-09-28
    人工智能 CV项目实战 深度学习 项目实战
  • 使用Xcode创建第一个c语言项目和源文件进行编程(xcodes使用教程)
    一、Xcode简介 Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计,编码、测试、调试都在...
    99+
    2023-10-08
    xcode ios macos
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作