温馨提示×

如何在Linux中实现Node.js的高可用

小樊
32
2025-12-06 13:05:48
栏目: 编程语言

Linux 上实现 Node.js 高可用的实用方案

一 架构总览

  • 进程级高可用:在单机上用 Node.js ClusterPM2 集群模式启动多个工作进程,充分利用多核并具备故障重启能力。
  • 服务级高可用:在多个节点前放置 Nginx/HAProxy 做反向代理与负载均衡,实现故障节点自动摘除与横向扩展。
  • 数据与会话:有状态服务使用 外部会话存储(如 Redis);数据库主从或集群;静态资源使用 CDN
  • 运行观测:接入 Prometheus + Grafana 监控指标与 ELK/EFK 日志分析,配合告警。
  • 发布与自愈:通过 CI/CD 自动化构建与灰度发布,结合进程管理器的自动重启与自启动。
  • 容器与编排:在大规模或多机房场景使用 Docker + Kubernetes 管理副本、滚动升级与自动恢复。

二 单机多进程与进程管理

  • 使用 Node.js 内置 Cluster(示例)
    • 关键点:主进程 forkexit 事件监听,工作进程共享同一端口,异常退出可自动重启。
    • 参考代码:
      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.end('Hello World\n')).listen(3000);
        console.log(`Worker ${process.pid} started`);
      }
      
  • 使用 PM2(更省心的生产级管理)
    • 常用命令:
      npm i -g pm2
      pm2 start app.js -i max        # 按 CPU 核心数启动集群
      pm2 monit                      # 实时资源监控
      pm2 logs                       # 日志查看
      pm2 startup                    # 生成开机自启动脚本
      pm2 save                       # 持久化进程列表
      
    • 优势:内置负载均衡、异常自动重启、日志集中、零停机重启(reload)等。

三 多实例负载均衡与服务发现

  • Nginx 作为反向代理与负载均衡(示例)
    • 建议开启 HTTP/1.1长连接WebSocket 升级,并为健康检查配置 upstream 的 max_fails/fail_timeout
    • 参考配置:
      upstream nodeapp {
        server 10.0.0.11:3000 max_fails=3 fail_timeout=30s;
        server 10.0.0.12:3000 max_fails=3 fail_timeout=30s;
        server 10.0.0.13:3000 max_fails=3 fail_timeout=30s;
      }
      
      server {
        listen 80;
        server_name yourdomain.com;
      
        location / {
          proxy_pass         http://nodeapp;
          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;
          proxy_set_header   Upgrade $http_upgrade;
          proxy_set_header   Connection "Upgrade";
        }
      }
      
    • 运维要点:按节点权重与连接数调度;为静态资源设置缓存;必要时启用 HAProxy 替代或与之配合。

四 容器化与编排

  • Docker 单实例
    FROM node:18
    WORKDIR /app
    COPY package*.json ./
    RUN npm ci --only=production
    COPY . .
    EXPOSE 3000
    CMD ["node","app.js"]
    
  • Docker Compose 多实例(便于本机或单机多容器演练)
    version: "3.8"
    services:
      app:
        build: .
        ports: ["3000"]
        deploy:
          replicas: 4
    # 启动:docker-compose up --scale app=4
    
  • Kubernetes 生产可用(核心片段)
    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: app
            image: myregistry/node-app:latest
            ports: [{ containerPort: 3000 }]
            readinessProbe:
              httpGet: { path: /health, port: 3000 }
              initialDelaySeconds: 10
              periodSeconds: 5
            livenessProbe:
              httpGet: { path: /health, port: 3000 }
              initialDelaySeconds: 20
              periodSeconds: 10
    
    • 建议:配置 readiness/liveness 探针、资源请求与限制、HPA 自动扩缩容、滚动更新策略。

五 监控日志与发布实践

  • 监控与日志
    • 指标与可视化:以 Prometheus 采集 Node.js 指标(如进程内存、事件循环延迟、HTTP 请求耗时),在 Grafana 建立看板并设置阈值告警。
    • 日志:集中到 ELK/EFK(Elasticsearch/Logstash/Kibana 或 Fluent Bit/Fluentd/Elasticsearch),结构化输出(如 JSON),便于检索与链路追踪。
  • 发布与自愈
    • PM2 或编排平台中启用 零停机部署/滚动升级;代码变更通过 CI/CD 自动构建、测试与发布;异常进程由管理器自动拉起,节点故障由负载均衡摘除。

0