Node.js 应用在 Linux 上实现高可用架构的核心路径

Node.js 内置的 cluster 模块是实现高可用的基础,通过创建主进程(Master)和工作进程(Worker),让多个 Worker 共享同一端口处理请求,避免单进程瓶颈。主进程负责管理 Worker 的生命周期(如 fork 新进程、监控退出事件),当某 Worker 崩溃时,主进程可快速重启替代进程,保障服务连续性。示例代码:
const cluster = require('cluster');const http = require('http');const numCPUs = require('os').cpus().length;if (cluster.isMaster) {console.log(`主进程 ${process.pid} 启动`);// 根据 CPU 核心数 fork 工作进程for (let i = 0; i < numCPUs; i++) {cluster.fork();}cluster.on('exit', (worker, code, signal) => {console.log(`工作进程 ${worker.process.pid} 异常退出,正在重启...`);cluster.fork(); // 自动重启崩溃的 Worker});} else {// 工作进程启动 HTTP 服务http.createServer((req, res) => {res.writeHead(200);res.end('Hello from Worker ' + process.pid + 'n');}).listen(3000);console.log(`工作进程 ${process.pid} 启动`);}这种方式可有效提升应用吞吐量(如 4 核 CPU 可同时处理 4 个请求),并为后续高可用架构奠定基础。
通过负载均衡器将客户端请求分发到多个 Node.js 实例(集群),避免单实例过载。常用工具包括 Nginx(高性能、易配置)和 HAProxy(专业负载均衡):
upstream node_app {server 127.0.0.1:3000; // 多个 Node.js 实例地址server 127.0.0.1:3001;server 127.0.0.1:3002;}server {listen 80;location / {proxy_pass http://node_app;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}frontend http_frontbind *:80default_backend http_backbackend http_backbalance roundrobin # 轮询策略server node1 127.0.0.1:3000 check # 健康检查server node2 127.0.0.1:3001 check负载均衡器还支持健康检查(如 Nginx 的 ngx_http_health_check_module、HAProxy 的 check 指令),自动剔除异常实例,确保流量仅分发到健康节点。
使用 PM2(Node.js 进程管理器)实现进程守护、自动重启和负载均衡。PM2 不仅能管理单个应用实例,还能通过 cluster 模式启动多进程(等同于 cluster 模块的功能,但更易操作):
# 全局安装 PM2npm install pm2 -g# 启动应用(自动 fork 到多个 CPU 核心)pm2 start app.js -i max# 查看应用状态pm2 status# 设置开机自启动(避免服务器重启后进程丢失)pm2 startuppm2 savePM2 还提供日志管理(pm2 logs)、性能监控(pm2 monit)等功能,简化运维流程。
若应用依赖数据库或缓存,需确保数据层的高可用:
建立完善的监控体系,实时跟踪应用、服务器和数据库的状态,及时触发告警:
winston 或 pino 记录结构化日志)。使用 Docker 容器化 Node.js 应用,通过 Kubernetes(K8s)编排管理容器,实现自动扩缩容、滚动更新和故障转移:
FROM node:18WORKDIR /appCOPY package*.json ./RUN npm installCOPY . .EXPOSE 3000CMD ["node", "app.js"]version: '3'services:node_app:build: .ports:- "3000"deploy:replicas: 3 # 启动 3 个副本restart_policy:condition: on-failure # 容器崩溃时自动重启在负载均衡器中配置健康检查,定期检测 Node.js 实例的可用性(如访问 /health 接口),当实例无法响应或响应超时时,自动将其从负载均衡池中剔除,避免将流量发送到故障节点。
ngx_http_health_check_module,配置如下:upstream node_app {server 127.0.0.1:3000 max_fails=3 fail_timeout=30s; # 3 次失败后剔除,30 秒后重试server 127.0.0.1:3001 max_fails=3 fail_timeout=30s;}check 指令实现:backend http_backbalance roundrobinserver node1 127.0.0.1:3000 check inter 2000 rise 2 fall 3 # 每 2 秒检查一次,2 次成功视为健康,3 次失败视为异常健康检查是负载均衡的重要补充,确保流量仅分发到可用实例。