Node.js 在 Debian 上的集群方案
一 方案总览
- 单机多进程:使用 Node.js 内置 cluster 模块 或 PM2 集群模式,让多个工作进程共享同一端口,充分利用多核 CPU。适合在一台服务器上提升吞吐与容错。
- 多机横向扩展:在多个 Debian 节点上各自运行 Node.js 实例,前置 Nginx/HAProxy 做负载均衡,实现高可用与水平扩展。
- 容器化编排:使用 Docker 与 Docker Compose 快速拉起多实例,便于开发、测试与小规模部署。
以上三种方式可单独使用,也可组合(如 PM2 管理进程 + Nginx 做入口负载)。
二 方案一 单机多进程集群
三 方案二 多机横向扩展与负载均衡
- 架构要点
- 在每台 Debian 上按“方案一”启动多个 Node.js 实例(不同端口或相同端口均可,由前端统一入口);
- 前置 Nginx/HAProxy 统一暴露 80/443,做反向代理与健康检查,后端按 round-robin 或其他策略分发。
- Nginx 示例(/etc/nginx/sites-available/default)
upstream myapp { server 192.168.1.11:3000; server 192.168.1.12:3000; server 192.168.1.13:3000; }
server { listen 80; location / { proxy_pass http://myapp; 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’; } }
重载:sudo systemctl reload nginx。
- HAProxy 示例(/etc/haproxy/haproxy.cfg)
frontend http-in bind *:80
default_backend node-back
backend node-back balance roundrobin
server node1 192.168.1.11:3000 check
server node2 192.168.1.12:3000 check
server node3 192.168.1.13:3000 check
重启:sudo systemctl restart haproxy。
该方案便于扩容与故障隔离,入口统一、后端可滚动升级。
四 方案三 容器化与 Docker Compose
- 适用场景:开发/测试一致性、快速复制环境、与 CI/CD 集成。
- 示例
- Dockerfile(示例基于 node:14,可按需调整版本):
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8000
CMD [“node”, “app.js”]
- docker-compose.yml(示例创建 4 个实例并映射 8000):
version: ‘3’
services:
app:
build: .
deploy:
replicas: 4
ports:
- “8000:8000”
构建并启动:docker-compose up --build。
提示:生产环境可结合 Docker Swarm/Kubernetes 做编排、健康检查与自动扩缩容。
五 实践建议与注意事项
- 进程与端口:多进程共享端口由 master 分发连接;在类 Unix 上默认 round-robin 通常足够均衡,避免自行在应用层再做复杂分发逻辑。
- 优雅停机与重启:在 cluster 中监听 ‘exit’ 事件并及时 fork 替代;使用 PM2 的 restart/delete/monit 能力,配合 nginx/haproxy 的健康检查 实现滚动升级。
- 资源与重启:为 PM2 配置 max_memory_restart(如 1G)避免内存泄漏拖垮实例;按需设置 watch(开发)与 autorestart(生产)。
- 日志与排障:集中收集 PM2 日志与 Nginx/HAProxy 访问/错误日志,便于定位跨进程与跨节点的异常。
- 安全与网络:对外仅暴露 80/443,后端实例监听内网地址;启用 TLS/HTTPS;在 HAProxy/Nginx 配置合适的超时与健康检查参数。