Ubuntu环境下扩展Node.js应用的核心路径
在Ubuntu系统中,扩展Node.js应用主要通过提升单机处理能力(垂直扩展)与复制实例分散负载(水平扩展)两类方式实现,同时需结合负载均衡、进程管理等工具优化效果。
垂直扩展是通过增强单台Ubuntu服务器的资源(如CPU、内存)或优化应用配置,提高单个Node.js实例的处理能力。
cluster模块基于child_process构建,允许主进程(master)fork多个子进程(worker),每个worker共享同一端口处理请求。主进程负责将传入连接循环分发给各worker,充分利用多核CPU资源。示例代码:const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
const numCPUs = os.cpus().length;
for (let i = 0; i < numCPUs; i++) cluster.fork(); // 根据CPU核数创建worker
cluster.on('exit', (worker) => cluster.fork()); // worker崩溃时自动重启
} else {
require('./app').listen(3000); // worker启动应用
}
这种方式无需修改应用代码,但需手动管理进程生命周期。-i max参数),可自动根据CPU核数创建worker,并提供负载均衡、日志管理、零停机重启等功能。命令示例:pm2 start app.js -i max --name "my-app" # 启动集群模式
pm2 monit # 监控进程状态
PM2简化了集群管理,适合生产环境。水平扩展是通过复制Node.js应用实例,将请求分散到多台Ubuntu服务器(或同一服务器的多进程),突破单机资源限制。
upstream模块指向多个应用服务器:upstream node_app {
server 192.168.1.101:3000; # 实例1
server 192.168.1.102:3000; # 实例2
server 192.168.1.103:3000; # 实例3
}
server {
listen 80;
location / {
proxy_pass http://node_app; # 请求转发到upstream
}
}
配置完成后重启Nginx(sudo systemctl restart nginx),即可实现请求分发。Dockerfile构建镜像,例如:FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]
构建镜像:docker build -t my-node-app .deployment.yaml定义Pod副本数(replicas),并配置HorizontalPodAutoscaler(HPA)根据CPU使用率自动调整副本数。示例:apiVersion: apps/v1
kind: Deployment
metadata:
name: node-app
spec:
replicas: 3 # 初始副本数
selector:
matchLabels:
app: node-app
template:
metadata:
labels:
app: node-app
spec:
containers:
- name: node-app
image: my-node-app
ports:
- containerPort: 3000
resources:
limits:
cpu: "500m"
memory: "512Mi"
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: node-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: node-app
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # CPU使用率达70%时扩容
应用配置后,K8s会根据CPU负载自动增减Pod副本,实现弹性扩展。cluster模式替代原生Cluster,简化多进程管理;通过pm2 save保存进程列表,pm2 startup设置开机自启。least_conn(最少连接)、ip_hash(IP哈希)等负载均衡策略,根据业务需求调整;K8s的Service资源可实现更灵活的流量分发。top、htop监控Ubuntu服务器资源;通过PM2的monit命令或New Relic APM监控应用性能,识别瓶颈(如CPU密集型任务、数据库查询慢)并针对性优化。