Linux服务器上 Node.js 负载均衡实战指南
一、常见方案与适用场景
二、快速上手示例
方案A Nginx 反向代理(推荐)
sudo apt update && sudo apt install -y nginx
sudo systemctl enable --now nginx
upstream node_cluster {
server 127.0.0.1:3000 weight=5;
server 127.0.0.1:3001 weight=3;
server 127.0.0.1:3002 backup;
keepalive 32;
}
server {
listen 80;
server_name your.domain.com;
location / {
proxy_pass http://node_cluster;
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";
}
}
sudo nginx -t && sudo systemctl reload nginx
说明:通过 weight 设置权重、backup 定义备用节点,并开启长连接与 WebSocket 升级头。
方案B HAProxy 负载均衡
sudo apt update && sudo apt install -y haproxy
global
log /dev/log local0
log /dev/log local1 notice
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:80
default_backend node_servers
backend node_servers
balance roundrobin
option httpchk GET /health
server node1 127.0.0.1:3000 check
server node2 127.0.0.1:3001 check
server node3 127.0.0.1:3002 check
sudo systemctl enable --now haproxy
说明:采用 roundrobin 轮询,开启 /health 健康检查,失败自动摘除节点。
方案C Node.js 进程内集群(单机多核)
// cluster.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 from worker ${process.pid}\n`);
}).listen(3000, () => console.log(`Worker ${process.pid} listening on 3000`));
}
运行:node cluster.js
说明:由 Node.js 运行时在多个工作进程间分发连接,适合提升单机吞吐。
方案D PM2 集群模式(更易运维)
sudo npm i -g pm2
module.exports = {
apps: [{
name: 'node-app',
script: 'app.js',
instances: 4, // 建议与 CPU 核数一致或略高
exec_mode: 'cluster', // 启用集群模式
env: { NODE_ENV: 'production' }
}]
};
pm2 start ecosystem.config.js
pm2 reload node-app
pm2 monit
说明:PM2 提供进程守护、日志聚合、零停机重启与集群编排。
三、生产级配置要点
四、容器与编排实践
Docker Compose 多实例 + Nginx
version: '3.8'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- node1
- node2
- node3
node1:
image: node:18-alpine
command: node app.js
expose:
- "3000"
node2:
image: node:18-alpine
command: node app.js
expose:
- "3000"
node3:
image: node:18-alpine
command: node app.js
expose:
- "3000"
说明:Compose 管理多容器实例,Nginx 统一入口做负载均衡。
Kubernetes Service 与 LoadBalancer
apiVersion: v1
kind: Service
metadata:
name: node-service
spec:
selector:
app: node-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
externalTrafficPolicy: Local
说明:云厂商会为该 Service 分配外部负载均衡器;配合 Deployment 的 replicas 实现弹性伸缩。
五、如何选择