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之后过上一小段时间就宕机了。 这里不懂怎么配置了,求助~~~
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 } });
解决方案
- 限制连接池大小:可以通过设置连接池大小来减少同时打开的连接数。
- 优化应用逻辑:确保在不需要时及时关闭数据库连接。
- 使用连接池:Mongoose 默认支持连接池,但需要正确配置。
示例代码
-
限制连接池大小:
var options = { server: { poolSize: 10, // 设置连接池大小为10 auto_reconnect: true } }; mongoose.connect(dbURI, options);
-
优化应用逻辑:
- 确保在处理完数据后立即关闭连接,例如在 API 请求处理函数中:
app.get('/some-endpoint', function(req, res) { // 处理数据... db.close(); // 关闭连接 res.send('Data processed'); });
- 确保在处理完数据后立即关闭连接,例如在 API 请求处理函数中:
-
使用连接池:
- 确保你已经在
mongoose.connect
中正确设置了连接池参数,如上面示例中的poolSize
。
- 确保你已经在
总结
通过合理配置连接池大小和优化应用逻辑,可以有效减少数据库连接数,从而避免因连接数过多而导致的连接失败问题。希望上述解决方案能帮助你解决问题。如果还有其他疑问,欢迎继续交流。
网上的说法是再mongod启动参数里加上numactl 可是我是单个cup,好像没啥用吧? 即使加上了numactl也还是存在问题!真无解了。。。
社区用的就是mongoose …会不会是别的问题?
不是驱动的问题 估计是配置问题吧 mongndb的最大连接数。。
应该是nginx问题,我没解决。 网上查找是node服务有关
查一下你的nginx配置,node用pm2启动,如果发现node挂掉,查看pm2 err日志,nginx和node应用到底是那个出问题了,先找到原因
根据你的描述,问题可能是由于MongoDB连接数达到上限导致的。为了解决这个问题,可以尝试以下几个步骤:
-
调整MongoDB的最大连接数: 编辑MongoDB的配置文件(通常是
mongod.conf
),增加最大连接数限制。例如,可以将以下行添加或修改到配置文件中:net: maxIncomingConnections: 2000 # 根据需要调整这个数值
-
优化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); }); });
-
检查Nginx配置: 确保Nginx配置正确,避免因为连接超时或资源不足导致的502错误。你可以调整Nginx的
proxy_read_timeout
和proxy_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资源。