在 Linux 上实现 Node.js 负载均衡
一、方案总览与选型
二、使用 Nginx 作为反向代理
http {
upstream node_app {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://node_app;
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;
# WebSocket 支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'Upgrade';
proxy_cache_bypass $http_upgrade;
}
}
}
三、使用 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_front
bind *:80
default_backend http_back
backend http_back
balance roundrobin
server node1 127.0.0.1:3000 check
server node2 127.0.0.1:3001 check
server node3 127.0.0.1:3002 check
四、进程内与容器化实践
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);
res.end(`Hello from worker ${process.pid}\n`);
}).listen(8000);
}
const http = require('http');
const httpProxy = require('http-proxy');
const servers = ['http://127.0.0.1:3000','http://127.0.0.1:3001','http://127.0.0.1:3002'];
let idx = 0;
const proxy = httpProxy.createProxyServer({});
http.createServer((req,res)=>{
const target = servers[idx = (idx+1)%servers.length];
proxy.web(req,res,{target});
}).listen(80);
version: '3'
services:
node_app:
build: .
ports:
- "3000"
deploy:
replicas: 3
update_config: { parallelism: 1, delay: 10s }
restart_policy: { condition: on-failure }
五、健康检查、高可用与运维要点