1、pm2 是开源的基于Nodejs的进程管理器,包括守护进程、监控、日志的一整套完整的功能;
2、pm2 基本是node应用程序不二的守护进程选择;
3、事实上,pm2并不仅仅可以启动node程序,对于一般的脚本程序同样可以胜任;
4、pm2 带有负载均衡功能,可以保持node应用进程永远运行在后台;
5、pm2 还有个非常强大的deploy功能,可以从本地直接部署线上网站。
1、服务器稳定性
2、充分利用服务器硬件资源,以便提高性能
3、进程守护,系统崩溃自动重启
4、启动多进程,充分利用CPU和内存
5、自带日志记录功能
6、多进程与redis(内存共享)
1、首页我们要 全局安装 npm install pm2 -g
2、在根目录中加入pm2.conf.json文件(具体参数说明可以查看备注)
{
"apps": {
"name": "pm2-test-server", // 名称
"script": "bin/www", // 启动文件
"watch": true, // 监听代码变化自动重启
"ignore_watch": [ // 忽略监听文件
"node_modules",
"logs"
],
// "instances": 4, // 多进程 一般有多少核cpn就启动多少个进程
"error_file": "logs/err.log", // console.error('输出')
"out_file": "logs/out.log", // console.log('输出')
"log_date_format": "YYYY-MM-DD HH:mm:ss" // 在每个日志输入之前 都加上 日期时间
}
}
进行了上面的配置之后,我们就可以用 console.log('')或者console.error('')把相关的日志打印到文件中,下面是对应的打印:
console.log('输出') ==》 logs/out.log
console.error('输出') ==》 logs/err.log
3、修改package.json文件,直接用 npm run prd 在生产中启动即可
"scripts": {
"start": "npm run dev",
"dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www",
"prd": "cross-env NODE_ENV=production pm2 start pm2.conf.json",
"test": "echo \"Error: no test specified\" && exit 1"
}
4、我们要在日志中打印 请求方法、请求API、请求参数、响应内容、响应时间
接下来我们来修改一下 app.js
// logger
app.use(async (ctx, next) => {
// 打印请求参数
if (ctx.method === 'GET') {
console.log(JSON.stringify(ctx.request.query))
} else {
console.log(JSON.stringify(ctx.request.body))
}
const start = new Date()
await next()
const ms = new Date() - start
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`) // 打印开始请求和响应的时间差
})
之前的统一输出文件中resModel.js 打印一下响应内容:
class BaseModel {
constructor(data, message) {
if (typeof data === 'string') {
this.message = data
data = null
message = null
}
if (data) {
this.data = data
}
if (message) {
this.message = message
}
}
}
// 成功
class SuccessModel extends BaseModel {
constructor(data, message) {
super(data, message)
this.code = 0
console.log(this) // 打印日志
}
}
// 错误
class ErrorModel extends BaseModel {
constructor(data, message) {
super(data, message)
this.code = -1
console.log(this) // 打印日志
}
}
// token 认证失败
class LoginFailure extends BaseModel {
constructor(data, message) {
super(data, message)
this.code = 401
console.log(this) // 打印日志
}
}
// 自定义code,方便特殊情况下返回特殊code,不能和上面已建的code重复
class CustomModel extends BaseModel {
constructor(code, data, message) {
super(data, message)
this.code = code
console.log(this) // 打印日志
}
}
module.exports = {
SuccessModel,
ErrorModel,
LoginFailure,
CustomModel
}
接下来 我们来试试 启动服务器
接下来跑一下之前的登录接口试试
在文件中也有:
我们无论在服务中查看还是在日志文件中都可以查看到对应的请求和响应信息了
也许有些同学会问:日志文件不停的记录在out.log或者err.log中,那么它们的体积将会越来越大,不止会影响性能,甚至会导致死机,的确是的,这个时候就需要OP出手了,把日志文件进行分割,按照日期或者体积就根据你们站点的访问量吧!(如果公司没有OP,你们也可以,具体的可以查资料)
PM2常用命令:
pm2 start ... #启动
pm2 list #查看启动列表
pm2 restart
pm2 stop
pm2 delete
pm2 info
pm2 log
pm2 monit
........等等
总结:日志是后台最重要的一项功能,如果没有日志功能,等于人没有了眼睛,根本不知道别人在您的站点中干了什么,也可以用日志来进行分析,警告等等。