pm2
pm2是一个用于管理node项目的工具
前言
有如下两个文件
index.js
const express = require("express");
const app = express();
const port = 9999;
app.get("/index", (req, res) => {
res.json({
code:200,
msg:"songzx001"
})
});
app.listen(port, () => {
console.log(`Example app listening on http://localhost:9999/index`);
});
index2.js
const express = require("express");
const app = express();
const port = 8888;
app.get("/index", (req, res) => {
res.json({
code:200,
msg:"songzx002"
})
});
app.listen(port, () => {
console.log(`Example app listening on http://localhost:8888/index`);
});
这是当我们想把这两个项目同时启动时,通常情况下需要开启两个黑窗口
这是我们就可以通过使用pm2来管理多个node项目
安装
npm install -g pm2
查看是否安装成功
pm2 -v
可以看到版本号表示安装成功
使用
启动项目必须在管理员窗口下运行命令
启动项目
pm2 start index.js
还可以接着启动另外的项目
这是就有两个项目的状态是 online
访问这两个项目也可以访问到
停止项目
pm2 stop [name]
# 或者
pm2 stop [id]
重新启动
pm2 restart [name]
# 或者
pm2 restart [id]
删除项目
pm2 delete [id]
查看列表
pm2 list
启动并监听文件变化
pm2 start index --watch
启动后这里的状态会显示是 enabled
我们修改文件后,刷新网页会自动变化
自定义启动名称
pm2 start index.js -n aaa
Linux
安装node
wget 是Linux自带的下载东西的命令
wget https://cdn.npmmirror.com/binaries/node/v14.19.1/node-v14.19.1-linux-x64.tar.xz
查看下载的文件并解压
解压文件,使用tar命令
-c: 压缩
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出
下面的参数-f是必须的
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
- tar -cf all.tar *.jpg 这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
- tar -rf all.tar *.gif 这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
- tar -uf all.tar logo.gif 这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。
- tar -tf all.tar 这条命令是列出all.tar包中所有文件,-t是列出文件的意思
- tar -xf all.tar 这条命令是解出all.tar包中所有文件,-x是解开的意思
压缩
- tar –cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg
- tar –czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
- tar –cjf jpg.tar.bz2 *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
- tar –cZf jpg.tar.Z *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
- rar a jpg.rar *.jpg //rar格式的压缩,需要先下载rar for Linux
- zip jpg.zip *.jpg //zip格式的压缩,需要先下载zip for linux
解压
- tar –xvf file.tar //解压 tar包
- tar -xzvf file.tar.gz //解压tar.gz
- tar -xjvf file.tar.bz2 //解压 tar.bz2
- tar –xZvf file.tar.Z //解压tar.Z
- unrar e file.rar //解压rar
- unzip file.zip //解压zip
我们使用下面命令解压 node 包
tar -xvf node-v14.19.1-linux-x64.tar.xz
pwd命令
显示当前目录
/node/node-v14.19.1-linux-x64/bin
配置环境变量
进入根目录下的 ect/profile 文件
vi profile
vi 表示编辑 profile,打开后按下 i,进入编辑模式,通过上下箭头控制光标位置,然后在文件默认添加下面的代码
export PATH=$PATH:/node/node-v14.19.1-linux-x64/bin
然后按下 esc,输入 :wq,保存并退出,或者 :q 不保存退出
然后执行下面命令,让配置生效
source profile
现在我们就可以在任意地方使用 node 了
安装pm2
设置淘宝代理
npm config set registry https://registry.npm.taobao.org
安装 pm2
npm install pm2 -g
可以看到版本号表示安装成功
文件
在根目录,执行 ll
可以列出当前目录下的所有文件和文件夹
- 第一列表示文件权限,RWX 分别表示可读,可写,可执行
- 第二列数字表示文件数量
- 第三列表示拥有的角色名称
- 第四列表示文件大小
- 后面是日期和文件或者文件夹名称
用户和权限
根据上面这个表计算
R:可读 = 4
W:可写 = 2
X:可执行 = 1
创建一个角色,并设置文某个文件权限为只读
adduser szx
passwd szx
然后新建一个 index.txt
文件,并设置权限
chmod 704 index.txt
704:根据上面的公式计算,最后一个数字表示 szx
用户的权限大小,4 只读
然后使用 szx 登录,查看index.txt
可以看到使用 cat 可以查看文件内容,但是无法使用 echo 往文件内写入内容
Linux 防火墙
1、firewalld的基本使用
启动: systemctl start firewalld
查看状态: systemctl status firewalld
停止:systemctl stop firewalld
禁用:systemctl disable firewalld
2.systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。
启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
显示一个服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl is-enabled firewalld.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
3.配置firewalld-cmd
查看版本: firewall-cmd --version
查看帮助: firewall-cmd --help
显示状态: firewall-cmd --state
查看所有打开的端口: firewall-cmd --zone=public --list-ports
更新防火墙规则: firewall-cmd --reload
查看区域信息: firewall-cmd --get-active-zones
查看指定接口所属区域: firewall-cmd --get-zone-of-interface=eth0
拒绝所有包:firewall-cmd --panic-on
取消拒绝状态: firewall-cmd --panic-off
查看是否拒绝: firewall-cmd --query-panic
那怎么开启一个端口呢
添加
firewall-cmd --zone=public --add-port=80/tcp --permanent (–permanent永久生效,没有此参数重启后失效)
重新载入
firewall-cmd --reload
查看
firewall-cmd --zone= public --query-port=80/tcp
删除
firewall-cmd --zone= public --remove-port=80/tcp --permanent
nginx常用名
启动命令
nginx
stop 立即停止
nginx -s stop
quit 等待当前请求处理完成再停止
nginx -s quit
重载nginx配置文件
nginx -s reload
查看nginx进程
ps -ef | grep nginx
检查配置文件是否正确
nginx -t
nginx反向代理
使用 proxy_pass 代理到需要的地址
server {
listen 9001;
server_name 8.130.118.240;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/www.cjgj.com;
# 反向代理
location ^~ /prod-api/ {
proxy_pass http://8.130.118.240:9000/;
}
}
负载均衡
编写三个接口
index.js
const express = require("express");
const app = express();
const port = 7000;
app.get("/list", (req, res) => {
console.log("负载均衡001")
res.json({
code:200,
msg:"负载均衡001",
})
});
app.listen(port, () => {
console.log(`Example app listening on http://localhost:${port}/list`);
});
index2.js
const express = require("express");
const app = express();
const port = 7001;
app.get("/list", (req, res) => {
console.log("负载均衡002")
res.json({
code:200,
msg:"负载均衡002",
})
});
app.listen(port, () => {
console.log(`Example app listening on http://localhost:${port}/list`);
});
index3.js
const express = require("express");
const app = express();
const port = 7002;
app.get("/list", (req, res) => {
console.log("负载均衡003")
res.json({
code:200,
msg:"负载均衡003",
})
});
app.listen(port, () => {
console.log(`Example app listening on http://localhost:${port}/list`);
});
使用 pm2 启动这三个服务
在配置文件中添加如下配置文件
意思是监听 3333 端口,并添加 api 请求前缀,代理到负载均衡的地址上,默认使用的是轮询机制
轮询
# 默认是轮询机制
upstream node {
server 127.0.0.1:7000;
server 127.0.0.1:7001;
server 127.0.0.1:7002;
}
server {
listen 3333;
server_name localhost;
location ^~ /api/ {
proxy_pass http://node/;
}
}
使用浏览器访问:http://localhost:3333/api/list ,发现依次展示三个接口返回的内容
通过 pm2 log
日志可以看到
权重
upstream node {
server 127.0.0.1:7000 weight=3;
server 127.0.0.1:7001 weight=2;
server 127.0.0.1:7002 weight=1;
}
server {
listen 3333;
server_name localhost;
location ^~ /api/ {
proxy_pass http://node/;
}
}
这种情况下权重高的会命中的次数多
超时
upstream node {
server 127.0.0.1:7000 fail_timeout=60;
server 127.0.0.1:7001 fail_timeout=20;
server 127.0.0.1:7002;
}
server {
listen 3333;
server_name localhost;
location ^~ /api/ {
proxy_pass http://node/;
}
}
fail_timeout是故障等待超时时间
backup是备用服务器参数,可以为一个upstream设置一个backup的server,在生产server全部都出问题之后,可以自动切换到备用server上,为回复服务争取时间