pm2

日志管理:应用程序日志保存在服务器的硬盘中~/.pm2/logs/

负载均衡:PM2 可以通过创建共享同一服务器端口的多个子进程来扩展您的应用程序。这样做还允许您以零秒停机时间重新启动应用程序。

终端监控:可以在终端中监控您的应用程序并检查应用程序运行状况(CPU 使用率,使用的内存,请求/分钟等)。

SSH 部署:自动部署,避免逐个在所有服务器中进行 ssh。

静态服务:支持静态服务器功能

多平台支持:适用于 Linux(稳定)和 macOS(稳定)和 Windows(稳定)

pm2 安装

1
npm install pm2 -g

创建软链,进入 node 的安装文件夹下,找到 bin,里面有 pm2 的软链,如果环境变量 path 上已经有 node 的配置,那么可以不创建软链,因为在/usr/local/bin/创建的软链就是为了全局调用。

1
2
// 我的node文件目录
ln -s /opt/nodeJs/bin/pm2 /usr/local/bin/

pm2 使用

在项目下使用 pm2 替代 node 启动项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 start app.js --watch //当文件发生变化,自动重启

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

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

pm2 logs //查看所有应用日志
1
2
3
4
5
6
7
8
9
// 查看进程

pm2 ls

┌─────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ www │ default │ 0.1.0 │ fork │ 2217 │ 89m │ 0 │ online │ 0.8% │ 32.1mb │ root │ disabled │
└─────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

pm2 还可以实现自动部署的能力,在文件下配置 ecosystem 即可。

如: ecosystem.js

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
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' //部署后的动作
}
}
}

参考资料 01
参考资料 02

nginx

nginx 是一款高性能的 http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。

作用:集群(提高吞吐量,减轻单台服务器压力),反向代理(不暴露真实 IP 地址),虚拟服务器,静态服务器(动静分离)。解决跨域问题,使用 nginx 搭建企业级 api 接口网关

nginx 的功能强大

nginx 安装

  1. 安装依赖包
1
2
// 一键安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
  1. 下载并解压安装包
1
2
3
4
5
6
7
//创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
//下载tar包
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -zxvf nginx-1.13.7.tar.gz
  1. 安装 nginx
1
2
3
4
5
6
7
8
//进入nginx目录
cd /usr/local/nginx
//执行命令
./configure
//执行make命令
make
//执行make install命令
make install
  1. 配置 nginx.conf

进入配置文件

1
vim /usr/local/nginx/conf/nginx.conf

修改端口

1
2
3
4
server {
listen 3100;
...
}

报错

1
2
3
4
5
6
7
nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (2: No such file or directory)
2016/09/13 19:08:56 [emerg] 6996#0: open() "/usr/local/nginx/logs/access.log" failed (2: No such file or directory)

在nginx/目录下没有logs文件夹
解决方法:
mkdir logs
chmod 700 logs

创建软件

1
2
3
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/

/usr/local/bin/就是环境变量目录

测试是否安装成功

1
2
3
4
5
6
nginx -t

正常情况的信息输出:

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
1
2
3
4
5
6
7
8
9
10
11
12
13
14
启动 nginx:
nginx

查看 nginx 进程:
ps -ef | grep nginx

关闭:
nginx -s stop

配置文件修改重装载命令:
nginx -s reload

正常停止或关闭Nginx:
nginx -s quit

location 模块

location 在 nginx 是比较常用的,所以需要有所了解。
官方文档

location 分为两类 普通 location 和 正则 location
普通 location 既不带任何修饰符,如/app,它是前缀匹配,也在正则的范围内,但它是从根路径开始匹配的。

正则 location 带[ = | ~ | ~ * | ^~ ]这些前缀的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
= 表示精确匹配,只有完全匹配上才能生效
location = /uri

^~ 开头对URL路径进行前缀匹配,并且在正则之前
location ^~ /uri

开头表示区分大小写的正则匹配
location ~ pattern

开头表示不区分大小写的正则匹配
location ~* pattern

不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
location /uri

通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default
location /

多个 location 配置的情况下匹配顺序为:

  1. 首先精确匹配 =
  2. 其次前缀匹配 如:^~
  3. 其次是按文件中顺序的正则匹配
  4. 然后匹配不带任何修饰的前缀匹配。
  5. 最后是交给 / 通用匹配
  6. 当有匹配成功时候,停止匹配,按当前匹配规则处理请求

注意:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
前缀匹配,如果有包含关系时,按最大匹配原则进行匹配。比如在前缀匹配:
location /app 与 location /app/goods

如有请求
http://localhost/app/goods/file
将最终匹配到
location /app/goods 这个location上

如果在正则表达式里面有{},这会与location模块的{}冲突,这时候需要将正则表达式用单引号或者双引号起来。

如:
location ~ "/([\S]{8})" {
proxy_pass http://127.0.0.1:3000/;
}

简单使用

加载静态资源

配置 nginx 的静态文件有两个指令,一个 root 和一个 alias。

root 是指定项目的根目录,适用与 server 和 location。可以指定多个,如果 locaiton 没有指定,会往其外层的 server 或 http 中寻找继承。

如:

1
2
3
4
5
6
7
location /static {
root /root/webapp/sourceCode/sell;
}

http://localhost:3100/static/aa.jpg
经过nginx等于
http://localhost:3100//root/webapp/sourceCode/sell/static/aa.jpg

alias 它并不是替换匹配后的 url 地址,而是替换匹配部分的 url。alias 指令也可以有多个。
如:

1
2
3
4
5
6
7
location /static {
alias /root/webapp/sourceCode/sell;
}

http://localhost:3100/static/aa.jpg
经过nginx等于
http://localhost:3100/root/webapp/sourceCode/sell/aa.jpg

通常最佳实际是配置一个项目的根 root,其他的文件夹则使用 alias,毕竟 alias 更加灵活。

index 指令的作用

在前后端分离的基础上,通过 Nginx 配置,指定网站初始页。
该指令拥有默认值,index index.html ,即,如果没有给出 index,默认初始页为 index.html。

在没有给出明确的文件名称,index 才会启动,index 的作用就是在你没有给出一个明确名称,会自动分配。

1
2
3
4
location / {
root /root/webapp/sourceCode/sell;
index index.html index.htm;
}

proxy_pass

在 nginx 中配置 proxy_pass 代理转发时,如果在 proxy_pass 后面的 url 加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也加到代理路径上。

如:
http://localhost:3100/proxy/bb.html 进行访问。

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
第一种:
location /proxy/ {
proxy_pass http://localhost:8080/;
}
代理到URL:http://localhost:8080/bb.html


第二种(相对于第一种,最后少一个 / )
location /proxy/ {
proxy_pass http://localhost:8080;
}
代理到URL:http://localhost:8080/proxy/bb.html


第三种:
location /proxy/ {
proxy_pass http://localhost:8080/aaa/;
}
代理到URL:http://localhost:8080/aaa/bb.html


第四种(相对于第三种,最后少一个 / )
location /proxy/ {
proxy_pass http://localhost:8080/aaa;
}
代理到URL:http://localhost:8080/aaabb.html

以上有四种情况,但实际就两种情况,第一种与其他三种,只是其他三种有点迷惑性,其实都是一种。

1
Nginx实现反向代理,使用Module ngx_http_proxy_module模块,proxy_pass指令,设置请求头为真正的客户端地址proxy_set_header X-Real-IP $remote_addr;

报错:

1
nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression

这是由于使用了正则 location,但 proxy_pass 的 ip+host 后面有路经,正则匹配后无法拼接上而报错。

解决:

1
2
3
4
5
6
7
location ^~ /proxy/aaa/ {
proxy_pass http://localhost:8080;
}

location /proxy/ {
proxy_pass http://localhost:8080/aaa;
}

当然 nginx 还有很多配置使用,按照自己需要一点一点的查。