node.js - Mongodb服务器选择超时与nginx,nodejs
问题描述
我在我的 Web 应用程序上遇到了 https 设置。看起来我已经成功了。
但是,mongodb 与 nodejs 连接时出现问题。
我猜 nginx https 反向代理设置会导致这个问题,但是我不知道在哪里以及如何处理。
如果你能帮助我,我将非常感谢你。
环境
- Ubuntu 18.04.3 LTS
- Nginx 1.14.0
- MongoDB 4.2.3
- NodeJS + Koa
- AWS EC2
问题
Mongodb在尝试连接时返回以下错误
来自nodejs的错误消息
服务器选择在 30000 毫秒后超时
来自 nginx 的错误消息
[错误] 14495#14495:* 230328 上游过早关闭连接,同时从上游读取响应标头,客户端:210.218.178.27,服务器:songistock.net,请求:“GET /GetGroupPrice?target=UNION&dateOpt=2019-12-10 HTTP/ 1.1”,上游:“ http://127.0.0.1:3000/GetGroupPrice?target=UNION&dateOpt=2019-12-10 ”,主机:“www.songistock.net”,推荐人:“ https://www.songistock。净/ "
我试过
- 在 nginx 中设置上游
- 重新启动 Ubuntu
- 重新安装Nginx,Mogodb
设置和代码
- /etc/nginx/sites-available
upstream stream_mongo_backend {
server localhost:27017;
}
server {
listen 27017;
location / {
proxy_pass http://stream_mongo_backend;
}
}
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name songistock.net www.songistock.net;
ssl_certificate /etc/letsencrypt/live/www.songistock.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.songistock.net/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location / {
proxy_pass http://127.0.0.1:3000;
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_read_timeout 120;
proxy_http_version 1.1;
proxy_redirect off;
}
}
- NodeJS 代码
此代码使用 https 设置
const Router = require('koa-router');
const router = new Router();
const mongoose = require('mongoose');
const winston = require('../logger/winston');
var db = mongoose.connection;
db.once('open', function () {
winston.info("db connected");
});
mongoose.connect('mongodb://localhost:27017/songi_stock',
{ useNewUrlParser: true,useUnifiedTopology: true });
如果需要更多信息。请给出意见。然后我将添加更多信息。我真的很想解决这个问题。
感谢您的帮助。
解决方案
我认为这主要是因为nginx
它主要是一个 HTTP 服务器,所以当您重定向到 Mongo 时,它会尝试使用该http
协议,但 Mongo 需要一个原始TCP
连接。您应该尝试用块包装Mongo 的和server
块。upstream
stream
编辑:stream
需要与http
街区处于同一水平。您还可以为块/etc/nginx/conf.d/*.conf
之外的内容进行包含。http
http{}
stream {
upstream stream_mongo_backend {
server localhost:27017;
}
server {
listen 27017;
location / {
proxy_pass http://stream_mongo_backend;
}
}
}
推荐阅读
- asp.net - 选择组合框时的默认文本
- r - 将列 data.frame 重塑为多列 data.frame
- node.js - 海量数据同步作业
- ios - 在自定义 Swift 框架中的 Objective-C 文件上使用 Swift
- javascript - 尝试使用 javascript 捕获页面方法
- regex - 使用 PowerShell,在文本文件中搜索多个匹配项和分组结果
- html - 在 html select 中设置一个不可选择的选项
- tinymce - 禁用对 tinymce 模式更改的自动对焦
- android - programm NFC Card inside the phone Android and Ios
- java - 克服 Java 中的类型擦除