Node.js在CentOS上的集群部署方案
Node.js在CentOS上的集群部署方案
在CentOS系统上部署Node.js集群,核心目标是提升应用性能(多进程处理请求)、保证高可用性(进程崩溃自动恢复)及简化管理(自动化运维)。以下是几种常用且成熟的部署方案,涵盖从基础到进阶的实现方式:
一、使用Node.js内置Cluster模块(基础方案)
Node.js内置的cluster
模块允许创建主进程(Master)和多个工作进程(Worker),主进程负责管理子进程生命周期,工作进程共享同一端口处理请求(Node.js自动负载均衡)。
1. 准备工作:安装Node.js
通过NodeSource官方源安装稳定版Node.js(以Node.js 14为例):
curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
sudo yum install -y nodejs
2. 修改应用代码(以app.js为例)
使用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`);
}
);
}
3. 启动集群
直接运行应用,主进程会自动创建工作进程:
node app.js
优缺点
- 优点:无需额外工具,适合理解集群原理;自动负载均衡(Node.js内置)。
- 缺点:缺乏高级管理功能(如日志集中、内存监控、一键重启);工作进程崩溃需手动处理(代码中已添加自动重启逻辑,但仍需人工干预)。
二、使用PM2进程管理器(推荐方案)
PM2是Node.js生态中最流行的进程管理工具,支持集群模式、日志管理、内存监控、自动重启等功能,大幅简化集群运维。
1. 安装PM2
通过npm全局安装PM2(需提前安装Node.js):
sudo npm install pm2 -g
2. 启动集群
使用pm2 start
命令启动应用,并指定集群模式(-i
参数):
pm2 start app.js -i max # max表示根据CPU核心数自动启动实例(如4核CPU启动4个实例)
或指定具体实例数(如启动4个实例):
pm2 start app.js -i 4
3. 常用管理命令
- 查看集群状态:
pm2 status
(显示实例列表、状态、内存占用等); - 监控实时指标:
pm2 monit
(查看CPU、内存、请求量等实时数据); - 查看日志:
pm2 logs
(实时查看所有实例日志); - 重启集群:
pm2 restart app
; - 停止集群:
pm2 stop app
; - 删除集群:
pm2 delete app
。
4. 配置文件管理(可选)
创建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 # 指定生产环境
优缺点
- 优点:功能全面(进程管理、日志、监控、自动重启);配置简单(支持命令行或配置文件);适合生产环境。
- 缺点:需额外学习PM2命令;依赖PM2守护进程(需保持PM2运行)。
三、手动创建多个进程(简单但不推荐)
通过Shell脚本手动启动多个Node.js进程,适合测试或简单场景,但缺乏进程管理和自动恢复功能。
1. 创建启动脚本(start_cluster.sh)
#!/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."
2. 赋予执行权限
chmod +x start_cluster.sh
3. 启动集群
./start_cluster.sh
4. 查看进程状态
ps aux | grep node
优缺点
- 优点:无需额外工具,适合快速测试。
- 缺点:无法自动重启崩溃的进程;无负载均衡(需自行实现);管理麻烦(需手动杀进程、查日志)。
四、搭配Nginx反向代理(增强方案)
无论使用上述哪种集群方案,都可以通过Nginx作为反向代理,实现请求分发、SSL终止、静态文件缓存等功能,提升应用性能和安全性。
1. 安装Nginx
sudo yum install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx
2. 配置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;
}
}
3. 重启Nginx
sudo systemctl restart nginx
作用
- 负载均衡:Nginx将请求均匀分发到多个Node.js实例,避免单实例过载;
- SSL终止:Nginx处理HTTPS加密,减轻Node.js负担;
- 静态文件缓存:Nginx缓存静态文件(如图片、CSS),减少Node.js处理压力。
方案选择建议
- 开发/测试环境:使用
内置Cluster模块
或手动创建进程
,快速验证集群功能; - 生产环境:优先选择
PM2+配置文件
方案,兼顾功能全面性和管理便捷性; - 高并发场景:搭配
Nginx反向代理
,提升应用性能和安全性。
以上方案均能在CentOS上实现Node.js集群部署,根据团队技术栈和业务需求选择合适的方案即可。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Node.js在CentOS上的集群部署方案
本文地址: https://pptw.com/jishu/724552.html