温馨提示×

CentOS环境下Node.js如何与其他服务集成

小樊
38
2025-12-27 05:38:25
栏目: 编程语言

CentOS环境下Node.js与其他服务的集成实践

一 运行与进程管理

  • 使用systemd将应用托管为系统服务,确保崩溃自启与开机自启:
    • 创建服务文件:/etc/systemd/system/node-app.service
      [Unit]
      Description=My Node.js App
      After=network.target
      
      [Service]
      ExecStart=/usr/bin/node /opt/myapp/index.js
      WorkingDirectory=/opt/myapp
      User=nodeuser
      Group=nodegroup
      Environment=NODE_ENV=production
      Restart=always
      
      [Install]
      WantedBy=multi-user.target
      
    • 启用与启动:
      sudo systemctl daemon-reload
      sudo systemctl start node-app
      sudo systemctl enable node-app
      
  • 使用PM2进行进程守护与集群管理(便于日志、监控与开机自启):
    npm i -g pm2
    pm2 start app.js --name myapp -i max
    pm2 startup
    pm2 save
    
  • 建议将应用日志写入文件(如winstonpino),便于与journald或文件轮转工具集成。

二 反向代理与静态资源服务

  • 使用Nginx作为反向代理与静态资源服务器,统一域名、端口与路由:
    • 安装与启动:
      sudo yum install -y nginx
      sudo systemctl start nginx
      sudo systemctl enable nginx
      
    • 站点配置示例(/etc/nginx/conf.d/node.conf):
      server {
        listen 80;
        server_name your.domain.com;
      
        location / {
          proxy_pass http://127.0.0.1:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection 'upgrade';
          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_cache_bypass $http_upgrade;
        }
      
        # 静态资源
        location /static/ {
          alias /opt/myapp/static/;
          expires 1y;
          add_header Cache-Control "public, immutable";
        }
      }
      
    • 重载配置:sudo systemctl reload nginx

三 数据库集成

  • 常见数据库与Node.js驱动/ORM选型:
    • MongoDB:驱动mongodb,ODMmongoose
    • MySQL:驱动mysql/mysql2,ORMSequelize
    • PostgreSQL:驱动pg,ORMSequelize
    • Redis:驱动redis
  • 连接与安全要点:
    • 使用环境变量管理连接串与凭证(如process.env.MONGODB_URI),避免硬编码。
    • 生产环境启用SSL/TLS加密连接(如MySQL的SSL配置)。
    • 通过索引与**缓存(Redis)**优化查询性能。
  • 示例(MongoDB + Mongoose):
    // 安装:npm i mongoose dotenv
    require('dotenv').config();
    const mongoose = require('mongoose');
    
    mongoose.connect(process.env.MONGODB_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true
    }).then(() => console.log('MongoDB connected'))
      .catch(err => console.error('MongoDB connection error:', err));
    
  • 示例(MySQL + mysql2/Sequelize):
    // 安装:npm i mysql2 sequelize
    const mysql = require('mysql2/promise');
    const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, {
      host: process.env.DB_HOST,
      dialect: 'mysql'
    });
    sequelize.authenticate().then(() => console.log('MySQL connected')).catch(console.error);
    
  • 在CentOS上部署数据库服务(示例:MongoDB)
    sudo yum install -y mongodb-org
    sudo systemctl start mongod
    sudo systemctl enable mongod
    sudo systemctl status mongod
    
    其他数据库(如MySQL/PostgreSQL)亦可通过系统包管理器安装、启动与开机自启。

四 消息队列与缓存集成

  • Redis:作为缓存、会话存储与消息队列(配合BullMQ等)提升吞吐与解耦。
    • 安装与启动(EPEL源):
      sudo yum install -y epel-release
      sudo yum install -y redis
      sudo systemctl start redis
      sudo systemctl enable redis
      
    • Node.js示例(基础客户端):
      // 安装:npm i redis
      const redis = require('redis');
      const client = redis.createClient({ url: process.env.REDIS_URL });
      client.on('error', e => console.error('Redis error:', e));
      client.connect().then(() => console.log('Redis connected'));
      
  • 与数据库组合的典型模式:Node.js → Redis缓存 → MySQL/MongoDB,先读缓存,未命中再落库并回填缓存。

五 安全与网络配置要点

  • 防火墙放行必要端口(以firewalld为例):
    sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
    sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
    sudo firewall-cmd --reload
    
  • 对外服务建议启用TLS/HTTPS(可使用certbot申请免费证书),并在Nginx终止TLS。
  • 最小权限运行:为Node.js创建非root系统用户,限制文件与进程权限。
  • 安全编码:输入校验与消毒、使用环境变量管理密钥、开启Helmet(Express)等安全中间件、限制请求体大小与速率。
  • 持续交付:通过Webhooks触发构建与部署(如Gitee/GitHub),在Node.js中校验签名后执行脚本,配合PM2/Systemd完成平滑重启。

0