Nodejs mongoose连接失败导致服务器不稳定,求解

Nodejs mongoose连接失败导致服务器不稳定,求解

后端是nginx+nodejs,经常性的nginx 502,nginx error log:

recv() failed (104: Connection reset by peer) while reading response header from upstream

nodejs error log: [Error: connection closed] undefined 'Error: connection closed\n at null.<anonymous> (/data/sites/mysite/node_modules/mongodb/lib/mongodb/connection/server.js:592:24)

目测是mongodb连接失败,看了mongodb日志: [initandlisten] connection refused because too many open connections: 819

db的连接方式如下: var db = mongoose.connection; db.on(‘error’, function(err) { console.error('Error in MongoDb connection: ’ + err); mongoose.disconnect(); }); db.on(‘connected’, function() { console.log(‘Connect to MongoDb success.’); }); db.on(‘disconnected’, function() { console.log(‘MongoDB disconnected!’); mongoose.connect(dbURI, {server: {auto_reconnect: true}}); }); mongoose.connect(dbURI, {server: {auto_reconnect: true}});

每次重启node之后过上一小段时间就宕机了。 这里不懂怎么配置了,求助~~~


7 回复

Nodejs Mongoose 连接失败导致服务器不稳定,求解

问题描述

后端是 Nginx + Node.js 架构,经常出现 Nginx 502 错误。Nginx 错误日志显示 recv() failed (104: Connection reset by peer),而 Node.js 错误日志则显示 Error: connection closed

问题分析

通过查看 MongoDB 日志发现,错误原因是由于连接数过多导致的:

[initandlisten] connection refused because too many open connections: 819

当前配置

当前的数据库连接方式如下:

var db = mongoose.connection;

db.on('error', function(err) {
    console.error('Error in MongoDb connection: ' + err);
    mongoose.disconnect();
});

db.on('connected', function() {
    console.log('Connect to MongoDb success.');
});

db.on('disconnected', function() {
    console.log('MongoDB disconnected!');
    mongoose.connect(dbURI, { server: { auto_reconnect: true } });
});

mongoose.connect(dbURI, { server: { auto_reconnect: true } });

解决方案

  1. 限制连接池大小:可以通过设置连接池大小来减少同时打开的连接数。
  2. 优化应用逻辑:确保在不需要时及时关闭数据库连接。
  3. 使用连接池:Mongoose 默认支持连接池,但需要正确配置。

示例代码

  1. 限制连接池大小

    var options = {
        server: {
            poolSize: 10, // 设置连接池大小为10
            auto_reconnect: true
        }
    };
    mongoose.connect(dbURI, options);
    
  2. 优化应用逻辑

    • 确保在处理完数据后立即关闭连接,例如在 API 请求处理函数中:
      app.get('/some-endpoint', function(req, res) {
          // 处理数据...
          db.close(); // 关闭连接
          res.send('Data processed');
      });
      
  3. 使用连接池

    • 确保你已经在 mongoose.connect 中正确设置了连接池参数,如上面示例中的 poolSize

总结

通过合理配置连接池大小和优化应用逻辑,可以有效减少数据库连接数,从而避免因连接数过多而导致的连接失败问题。希望上述解决方案能帮助你解决问题。如果还有其他疑问,欢迎继续交流。


网上的说法是再mongod启动参数里加上numactl 可是我是单个cup,好像没啥用吧? 即使加上了numactl也还是存在问题!真无解了。。。

社区用的就是mongoose …会不会是别的问题?

不是驱动的问题 估计是配置问题吧 mongndb的最大连接数。。

应该是nginx问题,我没解决。 网上查找是node服务有关

查一下你的nginx配置,node用pm2启动,如果发现node挂掉,查看pm2 err日志,nginx和node应用到底是那个出问题了,先找到原因

根据你的描述,问题可能是由于MongoDB连接数达到上限导致的。为了解决这个问题,可以尝试以下几个步骤:

  1. 调整MongoDB的最大连接数: 编辑MongoDB的配置文件(通常是mongod.conf),增加最大连接数限制。例如,可以将以下行添加或修改到配置文件中:

    net:
      maxIncomingConnections: 2000  # 根据需要调整这个数值
    
  2. 优化Mongoose连接配置: 确保在连接失败时能自动重连,并且保持连接池的健康。你现有的配置已经包含了自动重连的设置,但可以考虑使用更健壮的配置:

    const mongoose = require('mongoose');
    const dbURI = 'mongodb://your_mongodb_connection_string';
    
    mongoose.connect(dbURI, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      server: {
        auto_reconnect: true,
        poolSize: 50,  // 根据需要调整这个数值
        socketOptions: {
          keepAlive: 300000,
          connectTimeoutMS: 30000,
          socketTimeoutMS: 30000
        }
      }
    });
    
    const db = mongoose.connection;
    
    db.on('error', function(err) {
      console.error('Error in MongoDB connection: ' + err);
      setTimeout(() => {
        mongoose.connect(dbURI, {
          useNewUrlParser: true,
          useUnifiedTopology: true,
          server: {
            auto_reconnect: true,
            poolSize: 50,
            socketOptions: {
              keepAlive: 300000,
              connectTimeoutMS: 30000,
              socketTimeoutMS: 30000
            }
          }
        });
      }, 5000);  // 重新尝试连接的时间间隔
    });
    
    db.on('connected', function() {
      console.log('Connected to MongoDB successfully.');
    });
    
    db.on('disconnected', function() {
      console.log('Disconnected from MongoDB.');
    });
    
    process.on('SIGINT', function() {
      db.close(function() {
        console.log('Mongoose connection is disconnected due to application termination.');
        process.exit(0);
      });
    });
    
  3. 检查Nginx配置: 确保Nginx配置正确,避免因为连接超时或资源不足导致的502错误。你可以调整Nginx的proxy_read_timeoutproxy_send_timeout参数来延长超时时间。

    location / {
        proxy_pass http://your_nodejs_backend;
        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_read_timeout 300s;
        proxy_send_timeout 300s;
    }
    

通过这些调整,你应该能够减少连接问题并提高系统的稳定性。如果问题仍然存在,建议进一步检查服务器资源使用情况,确保有足够的内存和CPU资源。

回到顶部