我正在try 将Nginx设置为访问MongoDB数据库的反向代理.默认情况下,Mongo侦听27017端口.我想做的是重定向主机名,例如mongodb.我的网站.com并将其传递给mongodb服务器.通过这种方式,我将从外部网络关闭已知的27017端口,并从一个隐藏的url访问我的数据库,如我给出的示例所示.

因此,我try 使用以下配置设置Nginx:

server {
        listen 80;
        server_name mongo.mysite.com;
        gzip off;       

        location / {
            proxy_pass http://127.0.0.1:27017;
            proxy_redirect off;
            proxy_buffering off;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

因此,在完成此操作后,我try 使用命令mongo mongo.mysite.com:80从cmd连接mongo shell,并返回以下错误:

2015-08-06T13:44:32.670+0300 I NETWORK  recv(): message len 1347703880 is invalid. Min 16 Max: 48000000
2015-08-06T13:44:32.670+0300 I NETWORK  DBClientCursor::init call() failed
2015-08-06T13:44:32.674+0300 E QUERY    Error: DBClientBase::findN: transport error: mongo.therminate.com:80 ns: admin.$cmd query: { whatsmyuri: 1 }
    at connect (src/mongo/shell/mongo.js:181:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:181
exception: connect failed

在Nginx访问日志(log)中,我还看到:

94.66.184.128 - - [06/Aug/2015:10:44:32 +0000] "<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xD4\x07\x00\x00\x00\x00\x00\x00admin.$cmd\x00\x00\x00\x00\x00\x01\x00\x00\x00\x15\x00\x00\x00\x10whatsmyuri\x00\x01\x00\x00\x00\x00" 400 172 "-" "-"

有人知道这里出了什么问题吗?谢谢

推荐答案

我忘记了这个问题,但在完成一些工作后,我不得不再次面对这个问题,这次我突然想到了解决方案!

NGINX基本上是一个HTTP服务器,因此通过以上述方式设置重定向和代理,它将所有通信封装在HTTP协议中.所以发生的错误是,虽然Mongo期望原始TCP流量,但它得到的却是HTTP流量.

因此,解决方案是使用NGINX的新stream module,用于处理原始TCP流量,并将upstream 服务器设置为指向mongodb实例.

更多信息:NGINX stream module

Mongodb相关问答推荐

在MongoDB中,如何使用$in来匹配存储在数组变量中的值

Mongo 将一个数组链接到另一个数组

DTO 验证适用于 POST,但不适用于 PUT

减法聚合Mongo文档Golang

通过 _id 更新一个文档(无效的 BSON 字段名称 _id)

Ruby on Rails 的 Cassandra、mongodb 或 couchdb

在mongo聚合中将ObjectID转换为字符串

带有 mongodb 和 nodejs 的实时 Web 应用程序

删除嵌套文档数组中的嵌入文档

Mongodb插入没有_id字段的文档

Docker 内部的 Mongo 身份验证

ZonedDateTime 与 MongoDB

有没有办法将python对象直接存储在mongoDB中而不序列化它们

如何对连接到 mongo 的方法进行单元测试,而不实际连接到 mongo?

如果我在 MongoDB 上使用 LINQ,为什么会失go 性能?

$orderby 和 Sort 之间的 MongoDB 区别

try 启用 Mongo DB 身份验证时发生 TypeError

如何判断 MongoDB 中是否存在字段?

在 Ubuntu 13.10 (saucy) 中安装 Mongodb PHP 扩展的最简单方法?

验证 MongoCredential 的异常和未分类的 Mongo Db 异常