阅读量:3
Linux下Node.js高并发处理实战指南
一 核心原理
- 事件驱动 + 非阻塞 I/O:通过事件循环调度异步任务,I/O 不阻塞主线程,适合I/O 密集型高并发场景。
- 单线程事件循环 + libuv 线程池:JS 在单线程执行,文件、DNS 等阻塞型系统调用由 libuv 线程池处理,默认线程数为4,上限128,超出排队。
- 多进程扩展:使用 Cluster 启动多个 Worker,主进程监听端口并按轮询分发连接,充分利用多核 CPU。
- 适用边界:CPU 密集任务会受单线程事件循环限制,需拆分到子进程/Worker 或采用任务队列解耦。
二 架构与部署清单
- 多进程与进程管理:用 Cluster 或 PM2 启动与守护多实例(如 PM2 启动命令:pm2 start app.js -i max),提升吞吐与容错。
- 反向代理与负载均衡:前置 Nginx 统一接入、反向代理、静态资源服务与简单负载均衡。
- 缓存策略:热点数据走 Redis/Memcached,并配置合适的 HTTP 缓存头(如 Cache-Control)。
- 异步与流处理:全程使用异步;大文件/大响应用 Stream 降低内存占用。
- 消息队列削峰:将耗时任务(邮件、图片处理、报表)放入 RabbitMQ/Kafka/Redis 队列,由消费者并发处理。
- 静态资源与 CDN:将图片、CSS、JS 等托管到 CDN,减少源站压力与首屏时间。
- 数据库优化:合理索引、连接池、读写分离/分库分表,缩短查询与事务时间。
三 关键配置与示例
- Cluster 多进程示例
// app.js
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
for (let i = 0; i < numCPUs; i++) cluster.fork();
cluster.on('exit', (worker) => console.log(`worker ${worker.process.pid} died`));
} else {
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(3000, () => console.log(`Worker ${process.pid} started`));
}
- Nginx 反向代理与负载均衡
# /etc/nginx/sites-available/default
upstream backend {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
}
}
- PM2 快速启动多实例
npm i -g pm2
pm2 start app.js -i max
pm2 save && pm2 startup
- Redis 任务队列示例(生产者)
// producer.js
const Redis = require('ioredis');
const redis = new Redis();
redis.lpush('tasks', JSON.stringify({ id: 1, type: 'email' }))
.then(() => console.log('Task queued'));
- 连接池示例(以 mysql2/promise 为例)
// db.js
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: 'localhost', user: 'root', password: '', database: 'test',
waitForConnections: true, connectionLimit: 20, queueLimit: 0
});
module.exports = pool;
- 限流示例(令牌桶,粗略保护)
// limiter.js
const rateLimit = require('express-rate-limit');
app.use('/api/', rateLimit({ windowMs: 15 * 60 * 1000, max: 100 }));
- Prometheus 指标示例
// metrics.js
const client = require('prom-client');
client.collectDefaultMetrics({ timeout: 5000 });
const httpRequestDuration = new client.Histogram({
name: 'http_request_duration_ms', help: 'Duration of HTTP requests in ms',
labelNames: ['method', 'route', 'code']
});
app.use((req, res, next) => {
const end = httpRequestDuration.startTimer();
res.on('finish', () => end({ method: req.method, route: req.route?.path || req.path, code: res.statusCode }));
next();
});
- 健康检查与优雅关闭
// health.js
app.get('/health', (req, res) => res.json({ status: 'ok', ts: Date.now() }));
process.on('SIGTERM', () => {
server.close(() => {
console.log('Server closed'); process.exit(0);
});
setTimeout(() => process.exit(1), 10000); // 超时强退
});
- 静态资源与压缩
app.use(express.static('public', { maxAge: '1h' }));
app.use(require('compression')());
- 压力测试与观测
# 安装
sudo apt-get install -y apache2-utils jq
# 基线压测
ab -n 10000 -c 200 http://localhost/
# 长时压测与报表
artillery quick --count 1000 --num 200 http://localhost/ --output report.json
# 观测
pm2 monit
以上示例覆盖了Cluster、PM2、Nginx、Redis 队列、连接池、限流、指标、健康检查与压测等关键环节。
四 性能调优与排障
- 定位瓶颈:结合 Node.js 性能钩子/inspect、New Relic/Datadog 与日志分析,识别慢查询、阻塞调用与异常堆栈。
- 数据库:慢查询优化、索引与连接池调参,必要时读写分离/分片。
- 事件循环健康:避免长同步计算与未捕获异常导致循环停滞;将 CPU 密集任务拆分到 Worker Threads/子进程或队列。
- 内存与泄漏:监控 RSS/堆使用,排查闭包、全局缓存与定时器的泄漏;使用 heapdump 分析。
- 网络与内核:启用 Gzip、长连接、合理的 keepalive;按需调整 ulimit -n、内核网络参数(如 somaxconn、backlog)。
- 监控告警:搭建 Prometheus + Grafana,暴露 HTTP 延迟、吞吐、错误率、事件循环延迟 等指标并设置阈值告警。
五 场景化建议
- I/O 密集型(网关/API):全程异步、Cluster/PM2 多实例、Nginx 前置、Redis 缓存、连接池、压缩与 CDN。
- CPU 密集型(图像处理/视频转码):将计算拆到 Worker Threads/子进程 或投递 消息队列,水平扩展消费者;主进程专注调度与 I/O。
- 实时推送(WebSocket/长连接):多进程下使用 粘性会话 或 Redis Pub/Sub 广播;控制连接数、心跳与超时,监控 内存/文件描述符。
以上就是关于“Linux中Node.js如何处理高并发请求”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm