关于Nodejs + mongodb 的部署问题

关于Nodejs + mongodb 的部署问题

计划实现的功能:提供一个http服务,用于存取数据(每条数据1K左右大小) 掌握的技术:做前端的,写业务逻辑没问题,对服务端了解甚少 拥有的资源:7台VPS(其中三台安装了nodejs)+ mongodb 集群 项目进展:在一台VPS上用nodejs+mongodb实现了存取的逻辑,能满足正常的AJAX请求需求

现在需要部署到生产环境,遇到的问题如下: *1. 要容灾、高并发,这几台VPS如何分配

  1. 通过qt串(由应用程序提供)验证身份(SDK),如何进行访问控制(访问频率、次数,redis?)*

望有经验的大牛们不吝赐教,越详细也好,非常感激!


4 回复

关于Nodejs + MongoDB 的部署问题

问题描述

我计划实现一个HTTP服务,用于存取数据(每条数据大约1K)。我已经掌握了前端开发,对于业务逻辑没有问题,但对于服务端的部署还比较陌生。目前,我在一台VPS上使用Node.js和MongoDB实现了基本的数据存取功能,并且可以满足普通的AJAX请求需求。

现在,我需要将这个服务部署到生产环境中,并面临以下两个主要问题:

  1. 容灾与高并发处理:如何合理分配这7台VPS来保证系统的稳定性和高并发处理能力?
  2. 访问控制:如何通过SDK中的qt串验证用户身份,并进行访问频率和次数的控制?

解决方案

1. 容灾与高并发处理

为了实现高可用和高并发处理,我们可以采用负载均衡和集群技术。以下是具体步骤:

  1. 负载均衡:使用Nginx或HAProxy作为负载均衡器,将流量分发到不同的Node.js实例上。

    # Nginx配置示例
    upstream node_app {
        server 192.168.1.1:3000;
        server 192.168.1.2:3000;
        server 192.168.1.3:3000;
    }
    
    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_pass http://node_app;
            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;
        }
    }
    
  2. 集群技术:在Node.js中使用cluster模块创建多个工作进程,每个进程监听不同的端口。

    const cluster = require('cluster');
    const http = require('http');
    const numCPUs = require('os').cpus().length;
    
    if (cluster.isMaster) {
      // Fork workers.
      for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
      }
    
      cluster.on('exit', (worker, code, signal) => {
        console.log(`Worker ${worker.process.pid} died`);
      });
    } else {
      // Workers can share any TCP connection
      // In this case it is an HTTP server
      http.createServer((req, res) => {
        res.writeHead(200);
        res.end('hello world\n');
      }).listen(3000);
    }
    
2. 访问控制

为了实现访问控制,我们可以使用Redis来存储用户的访问频率和次数信息。

  1. 安装Redis:首先确保你的VPS上已经安装了Redis。

    sudo apt-get install redis-server
    
  2. Node.js访问控制实现:使用redis库来管理访问频率和次数。

    const redis = require('redis');
    const client = redis.createClient();
    
    function checkAccess(req, res, next) {
      const qt = req.headers['qt']; // 假设qt串在headers中
      client.get(qt, (err, reply) => {
        if (err) throw err;
        if (reply && reply >= 10) { // 假设每天允许访问10次
          return res.status(403).send('Access limit exceeded');
        }
        client.incr(qt, (err, count) => {
          if (err) throw err;
          res.setHeader('X-Access-Count', count);
          next();
        });
      });
    }
    
    app.use(checkAccess);
    

以上就是针对你提出的问题的解决方案,希望对你有所帮助。如果你有更多的问题或需要更详细的指导,欢迎继续交流。


同关注

针对您的需求,我将从几个方面来帮助您完成Node.js + MongoDB的部署:

1. 容灾和高并发

您可以使用负载均衡器将请求分散到不同的VPS实例上。这样不仅可以提高系统可用性,还可以处理更多的并发请求。Nginx和HAProxy是两个常见的负载均衡器工具。

例如,使用Nginx配置负载均衡:

http {
    upstream node_servers {
        server VPS1_IP:3000;
        server VPS2_IP:3000;
        server VPS3_IP:3000;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://node_servers;
        }
    }
}

2. 访问控制

可以利用Redis实现访问频率控制和次数限制。这里提供一个简单的示例:

const redis = require('redis');
const client = redis.createClient();

function rateLimit(req, res, next) {
    const ip = req.ip;
    const key = `rate-limit:${ip}`;

    client.incr(key, (err, count) => {
        if (count === 1) {
            // 如果是第一次访问,则设置过期时间
            client.expire(key, 60); // 60秒后过期
        }

        if (count > 5) { // 每分钟最多允许访问5次
            return res.status(429).send("Too Many Requests");
        }

        next();
    });
}

app.use(rateLimit);

总结

  • 使用负载均衡器来分发请求。
  • 利用Redis进行访问控制(如频率和次数限制)。

希望以上信息能帮到您,如果有更具体的问题或需要进一步的帮助,请随时提出。

回到顶部