安装几个node必备工具

一、 nvm

1. 简介

nvm 是 node 的包管理工具。由于在打开不同的项目时,不同的项目在安装依赖时可能会和 node 版本有关,所以这就需要我们在不同的项目下使用不同的 node 版本。
nvm 就是一个比较好用 node 管理工具,切换 node 版本。

2. 安装 nvm

2.1 使用原码安装 nvm(推荐使用)

github 地址:https://github.com/nvm-sh/nvm,以下两种方式二选一

1
2
3
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

输入上面命令 会在结尾看到 nvm 配置,将此命令粘贴到 /.zshrc (`/.bash_profile, /.zshrc, /.profile, or ~/.bashrc).文件中,输入vim ~/.zshrc会打开这个文件,将下面内容粘贴进去。然后点击 esc,输入:wq保存并退出。还可以在打开访达,在 mac 用户的根目录下使用 shift+command+.显示隐藏文件。会看到.zshrc 文件,打开,粘贴进去保存就行。 输入nvm -v你会发现提示命令不存在,输入source ~/.zshrc再重新输入nvm -v`就好了。

1
2
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
2.2 nvm 常用命令
1
2
3
4
5
6
7
8
9
10
11
nvm install stable ## 安装最新稳定版 node
nvm install <version> ## 安装指定版本
nvm uninstall <version> ## 删除已安装的指定版本
nvm use <version> ## 切换使用指定的版本node
nvm ls ## 列出所有安装的版本
nvm ls-remote ## 列出所有远程服务器的版本
nvm current ## 显示当前的版本
nvm alias <name> <version> ## 给不同的版本号添加别名
nvm unalias <name> ## 删除已定义的别名
nvm reinstall-packages <version> ## 在当前版本 node 环境下,重新 全局安装指定版本号的 npm 包
nvm alias default [node版本号] ##设置默认版本

3. 使用 brew 安装 nvm

1
brew install nvm

二、nodejs

1. nvm 安装(推荐使用)

1
nvm install stable

2. brew 安装

1
brew install node@14

brew 安装会出现 npm 无法找到的问题,解决方法如下:

1
ln -s /usr/local/Cellar/node/14.17.3/libexec/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm

三、npm 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查看版本
npm -v

# 升级
sudo npm install npm -g

# 安装模块
npm install <Module Name> #本地安装
# 本地安装:安装到./node_modules(命令运行目录)
npm install <Module Name> -g #全局安装
# 全局安装:放在 /usr/local 下或者你 node 的安装目录。

# 卸载模块
npm uninstall <Module Name>

# 更新模块
npm update <Module Name>

# 查看所有安装的模块
npm ls #所有本地模块
npm ls -g #所有全局模块

# 搜索模块
npm search <Module Name>

四、pm2

1、安装pm2

1
2
3
4
5
npm install pm2 -g

pm2 --version

pm2 start server.js

2、常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 启动服务
pm2 start app.js //启动app.js应用
pm2 start app.js --name demo //启动应用并设置name
pm2 start app.sh //脚本启动

# 停止服务
pm2 stop all //停止所有应用
pm2 stop [AppName] //根据应用名停止指定应用
pm2 stop [ID] //根据应用id停止指定应用。

# 删除应用
pm2 delete all //关闭并删除应用
pm2 delete [AppName] //根据应用名关闭并删除应用
pm2 delete [ID] //根据应用ID关闭并删除应用

# 创建开机自启动
pm2 startup

# 更新PM2
pm2 updatePM2
pm2 update

# 监听模式
pm2 start app.js --watch //当文件发生变化,自动重启

# 静态服务器
pm2 serve ./dist 9090 //将目录dist作为静态服务器根目录,端口为9090

# 启用群集模式(自动负载均衡)
# max 表示PM2将自动检测可用CPU的数量并运行尽可能多的进程
# max可以自定义,如果是4核CPU,设置为2者占用2个
pm2 start app.js -i max

# 重新启动
pm2 restart app.js //同时杀死并重启所有进程。短时间内服务不可用。生成环境推荐使用reload

# 0秒停机重新加载
pm2 reload app.js //重新启动所有进程,始终保持至少一个进程在运行
pm2 gracefulReload all //优雅地以群集模式重新加载所有应用程序

# 查看启动列表
pm2 list
pm2 ls

# 查看每个应用程序占用情况
pm2 monit
pm2 monit # 显示每个应用程序的CPU和内存占用情况
pm2 monit 0 # 监控批评行编号为0的进程
pm2 monit server.js # 监控名称为server.js的进程

# 显示应用程序所有信息
pm2 info [AppName]|[ID]
pm2 show [Name] //根据name查看
pm2 show [ID] //根据id查看

# 日志查看
pm2 logs //查看所有应用日志
pm2 logs [Name] //根据指定应用名查看应用日志
pm2 logs [ID] //根据指定应用ID查看应用日志

# 保存当前应用列表
pm2 save

# 重启保存的应用列表
pm2 resurrect

# 清除保存的应用列表
pm2 cleardump

# 保存并恢复PM2进程
pm2 update

3、pm2配置

1
2
3
4
PM2配置文件方式
生成示例配置文件
pm2 ecosystem //生成一个示例JSON配置文件
pm2 init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 配置文件示例(实际使用自行删除)
module.exports = {
apps : [{
name : 'API', //应用名
script : 'app.js', //应用文件位置
env: {
PM2_SERVE_PATH: ".", //静态服务路径
PM2_SERVE_PORT: 8080, //静态服务器访问端口
NODE_ENV: 'development' //启动默认模式
},
env_production : {
NODE_ENV: 'production' //使用production模式 pm2 start ecosystem.config.js --env production
},
instances:"max", //将应用程序分布在所有CPU核心上,可以是整数或负数
watch:true, //监听模式
output: './out.log', //指定日志标准输出文件及位置
error: './error.log', //错误输出日志文件及位置,pm2 install pm2-logrotate进行日志文件拆分
merge_logs: true, //集群情况下,可以合并日志
log_type:"json", //日志类型
log_date_format: "DD-MM-YYYY", //日志日期记录格式
}],
deploy : {
production : {
user : 'node', //ssh 用户
host : '212.83.163.1', //ssh 地址
ref : 'origin/master', //GIT远程/分支
repo : 'git@github.com:repo.git', //git地址
path : '/var/www/production', //服务器文件路径
post-deploy : 'npm install && pm2 reload ecosystem.config.js --env production' //部署后的动作
}
}
};

4、作用

  1. 进程守护

  2. 配置文件(进程的数量,日志文件目录)

为什么使用多进程,

  1. 内存:无法充分利用机器 全部内存 (单进程的cpu 内存分配受限,32位机器 只能分到1.6G内存)

  2. cpu: 无法充分利用多核 cpu的优势

使用多进程的问题:

  1. 内存数据无法共享,通过共享redis来解决

5、pm2-logrotate

pm2-logrotate可以理解为是一个pm2的插件,它扩充了pm2本身没有功能:日志管理,所以它的运行需要依靠pm2,想用它必须先安装pm2才可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 安装 install or update a module and run it forever
pm2 install pm2-logrotate

# 卸载 stop and uninstall a module
pm2 uninstall pm2-logrotate

pm2 delete pm2-logrotate

pm2 start pm2-logrotate
pm2 stop pm2-logrotate


# 查看默认配置 可看到默认配置如下图所示,其配置文件一般在:/root/.pm2/module_conf.json
pm2 conf

# 输出
Module: pm2-logrotate
$ pm2 set pm2-logrotate:max_size 10M
$ pm2 set pm2-logrotate:retain 30
$ pm2 set pm2-logrotate:compress false
$ pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
$ pm2 set pm2-logrotate:workerInterval 30
$ pm2 set pm2-logrotate:rotateInterval 0 0 * * *
$ pm2 set pm2-logrotate:rotateModule true
Module: module-db-v2
$ pm2 set module-db-v2:pm2-logrotate [object Object]


# 修改
1. 可通过命令修改
pm2 set pm2-logrotate:max_size 10M

2. 修改 /root/.pm2/module_conf.json

max_size (Defaults to 10M): 配置项默认是 10MB,并不意味着切割出来的日志文件大小一定就是 10MB,而是检查时发现日志文件大小达到 max_size,则触发日志切割。

retain (Defaults to 30 file logs): 这个数字是在任何一个时间保留已分割的日志的数量,这意味着如果您保留7个,那么您将最多有7个已分割日志和您当前的一个

compress (Defaults to false): 对所有已分割的日志启用 gzip 压缩

dateFormat (Defaults to YYYY-MM-DD_HH-mm-ss) : 文件名格式化的规则

rotateModule (Defaults to true) : 像其他应用程序一样分割 pm2模块的日志

workerInterval (Defaults to 30 in secs) : 您可以控制工作线程检查日志大小的间隔(最小值为1)单位为秒(控制模块检查log日志大小的循环时间,默认30s检查一次)

rotateInterval (Defaults to 0 0 * * * everyday at midnight): 多久备份一次,默认值是0 0 * * *,意思是每天晚上0点分割


转载请注明来源,欢迎指出任何有错误或不够清晰的表达。可以邮件至 xiyugee@qq.com