mm_os 3.2.8 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -1
- package/core/base/mqtt/index.js +344 -157
- package/core/base/web/index.js +98 -11
- package/core/com/middleware/com.js +152 -152
- package/core/com/socket/config.tpl.json +2 -2
- package/core/com/socket/drive.js +2 -2
- package/core/com/socket/index.js +1 -1
- package/core/com/sql/drive.js +7 -7
- package/index.js +41 -37
- package/middleware/performance/index.js +150 -142
- package/middleware/security_audit/index.js +549 -0
- package/middleware/security_audit/middleware.json +48 -0
- package/middleware/security_headers/index.js +487 -0
- package/middleware/security_headers/middleware.json +45 -0
- package/middleware/waf/index.js +277 -6
- package/middleware/waf/middleware.json +2 -1
- package/middleware/waf_ddos/index.js +520 -0
- package/middleware/waf_ddos/middleware.json +38 -0
- package/middleware/waf_ip/index.js +231 -20
- package/middleware/waf_ip/middleware.json +43 -4
- package/middleware/waf_xss/index.js +269 -0
- package/middleware/waf_xss/middleware.json +18 -0
- package/middleware/web_before/middleware.json +1 -1
- package/middleware/web_socket/middleware.json +2 -2
- package/package.json +18 -7
- package/middleware/cors/index.js +0 -103
- package/middleware/cors/middleware.json +0 -9
- package/middleware/log/index.js +0 -32
- package/middleware/log/middleware.json +0 -9
- package/middleware/rate_limit/index.js +0 -112
- package/middleware/rate_limit/middleware.json +0 -10
- package/nodemon.json +0 -31
- package/package.txt +0 -1
- package/rps.bat +0 -3
- package/test.js +0 -5
- package/tps.bat +0 -3
- package/update.bat +0 -1
- package//347/263/273/347/273/237/346/236/266/346/236/204/350/257/204/344/274/260/344/270/216/344/274/230/345/214/226/345/273/272/350/256/256.md +0 -599
|
@@ -1,143 +1,151 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 请求性能监控中间件
|
|
3
|
-
* 记录请求响应时间,监控慢请求,提供性能数据收集
|
|
4
|
-
*/
|
|
5
|
-
module.exports = function(server, config) {
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 请求性能监控中间件
|
|
3
|
+
* 记录请求响应时间,监控慢请求,提供性能数据收集
|
|
4
|
+
*/
|
|
5
|
+
module.exports = function(server, config) {
|
|
6
|
+
if (config.web && !config.web.performance) {
|
|
7
|
+
return server;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// 默认配置
|
|
11
|
+
const cg = Object.assign({
|
|
12
|
+
slowThreshold: 1000, // 慢请求阈值,单位毫秒
|
|
13
|
+
enableMetrics: true, // 是否启用性能指标收集
|
|
14
|
+
ignorePaths: [] // 忽略监控的路径
|
|
15
|
+
}, config);
|
|
16
|
+
|
|
17
|
+
// 性能监控数据收集器
|
|
18
|
+
const performanceData = {
|
|
19
|
+
counters: new Map(), // 请求计数器
|
|
20
|
+
responseTimes: new Map(), // 响应时间数据
|
|
21
|
+
slowRequests: [] // 慢请求记录
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// 全局性能监控对象
|
|
25
|
+
$.performanceMonitor = {
|
|
26
|
+
record: function(path, responseTime) {
|
|
27
|
+
if (!cg.enableMetrics) return;
|
|
28
|
+
|
|
29
|
+
// 更新请求计数
|
|
30
|
+
if (!performanceData.counters.has(path)) {
|
|
31
|
+
performanceData.counters.set(path, 1);
|
|
32
|
+
performanceData.responseTimes.set(path, {
|
|
33
|
+
sum: responseTime,
|
|
34
|
+
count: 1,
|
|
35
|
+
min: responseTime,
|
|
36
|
+
max: responseTime
|
|
37
|
+
});
|
|
38
|
+
} else {
|
|
39
|
+
performanceData.counters.set(path, performanceData.counters.get(path) + 1);
|
|
40
|
+
const stats = performanceData.responseTimes.get(path);
|
|
41
|
+
stats.sum += responseTime;
|
|
42
|
+
stats.count += 1;
|
|
43
|
+
stats.min = Math.min(stats.min, responseTime);
|
|
44
|
+
stats.max = Math.max(stats.max, responseTime);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 记录慢请求
|
|
48
|
+
if (responseTime > cg.slowThreshold) {
|
|
49
|
+
performanceData.slowRequests.push({
|
|
50
|
+
path: path,
|
|
51
|
+
time: new Date(),
|
|
52
|
+
responseTime: responseTime
|
|
53
|
+
});
|
|
54
|
+
// 限制慢请求记录数量
|
|
55
|
+
if (performanceData.slowRequests.length > 1000) {
|
|
56
|
+
performanceData.slowRequests.shift();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
getStats: function() {
|
|
62
|
+
const result = {};
|
|
63
|
+
performanceData.counters.forEach((count, path) => {
|
|
64
|
+
const times = performanceData.responseTimes.get(path);
|
|
65
|
+
result[path] = {
|
|
66
|
+
count: count,
|
|
67
|
+
avg: times.sum / times.count,
|
|
68
|
+
min: times.min,
|
|
69
|
+
max: times.max
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
return result;
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
getSlowRequests: function(limit = 100) {
|
|
76
|
+
return performanceData.slowRequests.slice(-limit);
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
reset: function() {
|
|
80
|
+
performanceData.counters.clear();
|
|
81
|
+
performanceData.responseTimes.clear();
|
|
82
|
+
performanceData.slowRequests = [];
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// 性能监控中间件
|
|
87
|
+
server.use(async (ctx, next) => {
|
|
88
|
+
// 检查是否需要忽略此路径
|
|
89
|
+
const shouldIgnore = cg.ignorePaths.some(pattern => {
|
|
90
|
+
if (typeof pattern === 'string') {
|
|
91
|
+
return ctx.path === pattern;
|
|
92
|
+
} else if (pattern instanceof RegExp) {
|
|
93
|
+
return pattern.test(ctx.path);
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
if (shouldIgnore) {
|
|
99
|
+
await next();
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const start = Date.now();
|
|
104
|
+
const startTime = process.hrtime();
|
|
105
|
+
|
|
106
|
+
try {
|
|
107
|
+
await next();
|
|
108
|
+
} finally {
|
|
109
|
+
const ms = Date.now() - start;
|
|
110
|
+
const [seconds, nanoseconds] = process.hrtime(startTime);
|
|
111
|
+
const executionTime = seconds * 1000 + nanoseconds / 1000000;
|
|
112
|
+
|
|
113
|
+
// 设置响应时间头
|
|
114
|
+
ctx.set('X-Response-Time', `${ms}ms`);
|
|
115
|
+
|
|
116
|
+
// 记录性能数据
|
|
117
|
+
$.performanceMonitor.record(ctx.path, ms);
|
|
118
|
+
|
|
119
|
+
// 慢请求报警
|
|
120
|
+
if (ms > cg.slowThreshold) {
|
|
121
|
+
const clientIP = ctx.headers['x-forwarded-for'] || ctx.ip;
|
|
122
|
+
$.log.warn(`【慢请求】 ${ctx.method} ${ctx.path} - ${ms}ms - ${clientIP}`);
|
|
123
|
+
|
|
124
|
+
// 如果是非常慢的请求(超过阈值的2倍),记录更多信息
|
|
125
|
+
if (ms > cg.slowThreshold * 2) {
|
|
126
|
+
const userAgent = ctx.headers['user-agent'] || 'unknown';
|
|
127
|
+
let requestData = '';
|
|
128
|
+
try {
|
|
129
|
+
if (ctx.method !== 'GET' && ctx.request.body) {
|
|
130
|
+
const bodyStr = JSON.stringify(ctx.request.body);
|
|
131
|
+
// 限制记录的请求体大小
|
|
132
|
+
requestData = bodyStr.length > 1024 ? bodyStr.substring(0, 1024) + '...' :
|
|
133
|
+
bodyStr;
|
|
134
|
+
}
|
|
135
|
+
} catch (e) {
|
|
136
|
+
requestData = '[无法序列化请求体]';
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
$.log.warn(
|
|
140
|
+
`【慢请求详情】路径: ${ctx.path}, 方法: ${ctx.method}, 耗时: ${ms}ms, IP: ${clientIP}, UA: ${userAgent.substring(0, 200)}`
|
|
141
|
+
);
|
|
142
|
+
if (requestData) {
|
|
143
|
+
$.log.warn(`【慢请求数据】${requestData}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
return server;
|
|
143
151
|
};
|