Node.js在CentOS上的集群部署方案
在CentOS系统上部署Node.js集群,核心目标是提升应用性能(多进程处理请求)、保证高可用性(进程崩溃自动恢复)及简化管理(自动化运维)。以下是几种常用且成熟的部署方案,涵盖从基础到进阶的实现方式:
Node.js内置的cluster模块允许创建主进程(Master)和多个工作进程(Worker),主进程负责管理子进程生命周期,工作进程共享同一端口处理请求(Node.js自动负载均衡)。
通过NodeSource官方源安装稳定版Node.js(以Node.js 14为例):
curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
sudo yum install -y nodejs
使用cluster模块创建集群,主进程根据CPU核心数(os.cpus().length)fork工作进程:
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork工作进程
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
// 监听工作进程崩溃事件
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died. Restarting...`);
cluster.fork(); // 自动重启崩溃的进程
});
} else {
// 工作进程启动HTTP服务
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} started on port 3000`);
});
}
直接运行应用,主进程会自动创建工作进程:
node app.js
PM2是Node.js生态中最流行的进程管理工具,支持集群模式、日志管理、内存监控、自动重启等功能,大幅简化集群运维。
通过npm全局安装PM2(需提前安装Node.js):
sudo npm install pm2 -g
使用pm2 start命令启动应用,并指定集群模式(-i参数):
pm2 start app.js -i max # max表示根据CPU核心数自动启动实例(如4核CPU启动4个实例)
或指定具体实例数(如启动4个实例):
pm2 start app.js -i 4
pm2 status(显示实例列表、状态、内存占用等);pm2 monit(查看CPU、内存、请求量等实时数据);pm2 logs(实时查看所有实例日志);pm2 restart app;pm2 stop app;pm2 delete app。创建ecosystem.config.js文件(项目根目录),定义集群配置(更适合生产环境):
module.exports = {
apps: [{
name: 'my-node-app', // 应用名称
script: 'app.js', // 入口文件
instances: 'max', // 实例数(max或具体数字)
exec_mode: 'cluster', // 执行模式(集群模式)
autorestart: true, // 应用崩溃自动重启
watch: false, // 是否监听文件变化(开发环境设为true)
max_memory_restart: '1G', // 内存超过1G时重启实例
env: {
NODE_ENV: 'development' // 开发环境变量
},
env_production: {
NODE_ENV: 'production' // 生产环境变量
}
}]
};
通过配置文件启动集群:
pm2 start ecosystem.config.js --env production # 指定生产环境
通过Shell脚本手动启动多个Node.js进程,适合测试或简单场景,但缺乏进程管理和自动恢复功能。
#!/bin/bash
# 启动4个Node.js进程(后台运行)
for i in {1..4}; do
node app.js > "logs/worker_$i.log" 2>&1 &
done
echo "Cluster started with 4 workers."
chmod +x start_cluster.sh
./start_cluster.sh
ps aux | grep node
无论使用上述哪种集群方案,都可以通过Nginx作为反向代理,实现请求分发、SSL终止、静态文件缓存等功能,提升应用性能和安全性。
sudo yum install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx
编辑Nginx配置文件(/etc/nginx/conf.d/node_app.conf):
upstream node_cluster {
# 将请求分发到PM2集群的各个实例(端口需与app.js一致)
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3003;
}
server {
listen 80;
server_name your_domain.com; # 替换为你的域名
location / {
proxy_pass http://node_cluster; # 转发到Node.js集群
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
sudo systemctl restart nginx
内置Cluster模块或手动创建进程,快速验证集群功能;PM2+配置文件方案,兼顾功能全面性和管理便捷性;Nginx反向代理,提升应用性能和安全性。以上方案均能在CentOS上实现Node.js集群部署,根据团队技术栈和业务需求选择合适的方案即可。