Linux 上实现 Node.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.end('Hello World\n')).listen(3000);
console.log(`Worker ${process.pid} started`);
}
npm i -g pm2
pm2 start app.js -i max # 按 CPU 核心数启动集群
pm2 monit # 实时资源监控
pm2 logs # 日志查看
pm2 startup # 生成开机自启动脚本
pm2 save # 持久化进程列表
三 多实例负载均衡与服务发现
upstream nodeapp {
server 10.0.0.11:3000 max_fails=3 fail_timeout=30s;
server 10.0.0.12:3000 max_fails=3 fail_timeout=30s;
server 10.0.0.13:3000 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://nodeapp;
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 X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
四 容器化与编排
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node","app.js"]
version: "3.8"
services:
app:
build: .
ports: ["3000"]
deploy:
replicas: 4
# 启动:docker-compose up --scale app=4
apiVersion: apps/v1
kind: Deployment
metadata: { name: node-app }
spec:
replicas: 3
selector: { matchLabels: { app: node-app } }
template:
metadata: { labels: { app: node-app } }
spec:
containers:
- name: app
image: myregistry/node-app:latest
ports: [{ containerPort: 3000 }]
readinessProbe:
httpGet: { path: /health, port: 3000 }
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe:
httpGet: { path: /health, port: 3000 }
initialDelaySeconds: 20
periodSeconds: 10
五 监控日志与发布实践